From 85e934681d298a2fa226562e9dedfb18365b9968 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Mon, 16 Apr 2018 12:38:14 -0600 Subject: [PATCH 0001/1242] 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 0002/1242] 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 0003/1242] 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 0004/1242] 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 2fa9a986de88ded5c0768be36b0a7935c2b5777a Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Thu, 21 Jun 2018 10:48:07 -0500 Subject: [PATCH 0005/1242] Strip out all but NEIGH_PURE_F and Loca from pair_kim Progress toward implementation of kim-api-v2 support --- src/KIM/pair_kim.cpp | 458 +++++-------------------------------------- src/KIM/pair_kim.h | 26 +-- 2 files changed, 56 insertions(+), 428 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index fe638214ba..8947bd6c3b 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -18,8 +18,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the openkim-api-v1.5.0 package and for use with - the kim-api-v1.6.0 (and newer) package + Designed for use with the kim-api-v1.6.0 (and newer) package ------------------------------------------------------------------------- */ #include @@ -42,13 +41,6 @@ #include "KIM_API.h" #include "KIM_API_status.h" -#ifndef KIM_API_VERSION_MAJOR -// support v1.5.0 -#define KIM_API_VERSION_MAJOR 1 -#define KIM_API_VERSION_MINOR 5 -#define KIM_API_VERSION_PATCH 0 -#endif - using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -81,10 +73,7 @@ PairKIM::PairKIM(LAMMPS *lmp) : kim_global_cutoff(0.0), lmps_maxalloc(0), kim_particleSpecies(0), - lmps_force_tmp(0), - lmps_stripped_neigh_list(0), - kim_iterator_position(0), - Rij(0) + lmps_stripped_neigh_list(0) { // Initialize Pair data members to appropriate values single_enable = 0; // We do not provide the Single() function @@ -115,7 +104,6 @@ PairKIM::~PairKIM() // clean up local memory used to support KIM interface memory->destroy(kim_particleSpecies); - memory->destroy(lmps_force_tmp); memory->destroy(lmps_stripped_neigh_list); // clean up allocated memory for standard Pair class usage @@ -126,9 +114,6 @@ PairKIM::~PairKIM() delete [] lmps_map_species_to_unique; } - // clean up Rij array - memory->destroy(Rij); - // clean up KIM interface (if necessary) kim_free(); @@ -150,11 +135,9 @@ void PairKIM::compute(int eflag , int vflag) // needs to be atom->nmax in length if (atom->nmax > lmps_maxalloc) { memory->destroy(kim_particleSpecies); - memory->destroy(lmps_force_tmp); lmps_maxalloc = atom->nmax; memory->create(kim_particleSpecies,lmps_maxalloc,"pair:kim_particleSpecies"); - memory->create(lmps_force_tmp,lmps_maxalloc,3,"pair:lmps_force_tmp"); } // kim_particleSpecies = KIM atom species for each LAMMPS atom @@ -167,11 +150,6 @@ void PairKIM::compute(int eflag , int vflag) for (int i = 0; i < nall; i++) { ielement = lmps_map_species_to_unique[species[i]]; ielement = MAX(ielement,0); - // @@ this (above line) provides bogus info - // @@ (when lmps_map_species_to_unique[species[i]]==-1) to KIM, but - // @@ I guess this only happens when lmps_hybrid==true, - // @@ and we are sure that iterator mode will - // @@ not use these atoms.... (?) kim_particleSpecies[i] = kim_particle_codes[ielement]; } @@ -193,16 +171,6 @@ void PairKIM::compute(int eflag , int vflag) // assemble force and particleVirial if needed if (!lmps_using_newton) comm->reverse_comm_pair(this); - // sum lmps_force_tmp to f if running in hybrid mode - if (lmps_hybrid) { - double **f = atom->f; - for (int i = 0; i < nall; i++) { - f[i][0] += lmps_force_tmp[i][0]; - f[i][1] += lmps_force_tmp[i][1]; - f[i][2] += lmps_force_tmp[i][2]; - } - } - if ((no_virial_fdotr_compute == 1) && (vflag_global)) { // flip sign and order of virial if KIM is computing it for (int i = 0; i < 3; ++i) virial[i] = -1.0*virial[i]; @@ -313,6 +281,7 @@ void PairKIM::settings(int narg, char **arg) strcpy(kim_modelname, arg[1]); // set print_kim_file + // @@@ should be removed for v2; update docs if ((2 == narg) || ('0' == *(arg[2]))) { print_kim_file = false; @@ -341,13 +310,19 @@ void PairKIM::coeff(int narg, char **arg) if (narg != 2 + atom->ntypes) error->all(FLERR,"Incorrect args for pair coefficients"); + // insure I,J args are * * + + if (strcmp(arg[0],"*") != 0 || strcmp(arg[1],"*") != 0) + error->all(FLERR,"Incorrect args for pair coefficients"); + + int ilo,ihi,jlo,jhi; force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); // read args that map atom species to KIM elements // lmps_map_species_to_unique[i] = - // which element the Ith atom type is, -1 if NULL + // which element the Ith atom type is // lmps_num_unique_elements = # of unique elements // lmps_unique_elements = list of element names @@ -360,23 +335,20 @@ void PairKIM::coeff(int narg, char **arg) lmps_unique_elements = new char*[atom->ntypes]; for (i = 0; i < atom->ntypes; i++) lmps_unique_elements[i] = 0; + + // Assume all species arguments are valid + // errors will be detected by kim_api_init() matching lmps_num_unique_elements = 0; for (i = 2; i < narg; i++) { - if (strcmp(arg[i],"NULL") == 0) { - if (!lmps_hybrid) - error->all(FLERR,"Invalid args for non-hybrid pair coefficients"); - lmps_map_species_to_unique[i-1] = -1; - continue; - } - for (j = 0; j < lmps_num_unique_elements; j++) - if (strcmp(arg[i],lmps_unique_elements[j]) == 0) break; - lmps_map_species_to_unique[i-1] = j; - if (j == lmps_num_unique_elements) { - n = strlen(arg[i]) + 1; - lmps_unique_elements[j] = new char[n]; - strcpy(lmps_unique_elements[j],arg[i]); - lmps_num_unique_elements++; - } + for (j = 0; j < lmps_num_unique_elements; j++) + if (strcmp(arg[i],lmps_unique_elements[j]) == 0) break; + lmps_map_species_to_unique[i-1] = j; + if (j == lmps_num_unique_elements) { + n = strlen(arg[i]) + 1; + lmps_unique_elements[j] = new char[n]; + strcpy(lmps_unique_elements[j],arg[i]); + lmps_num_unique_elements++; + } } int count = 0; @@ -419,43 +391,18 @@ void PairKIM::init_style() else { kim_model_init_ok = true; - - // allocate enough memory to ensure we are safe - // (by using neighbor->oneatom) - if (kim_model_using_Rij) - memory->create(Rij,3*(neighbor->oneatom),"pair:Rij"); } } - // request none, half, or full neighbor list - // depending on KIM model requirement + // make sure comm_reverse expects (at most) 9 values when newton is off + if (!lmps_using_newton) comm_reverse_off = 9; + // request full neighbor list int irequest = neighbor->request(this,instance_me); - if (kim_model_using_cluster) - { - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 0; - } - else - { - // make sure comm_reverse expects (at most) 9 values when newton is off - if (!lmps_using_newton) comm_reverse_off = 9; - - if (kim_model_using_half) - { - neighbor->requests[irequest]->half = 1; - neighbor->requests[irequest]->full = 0; - // make sure half lists also include local-ghost pairs - if (lmps_using_newton) neighbor->requests[irequest]->newton = 2; - } - else - { - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - // make sure full lists also include local-ghost pairs - if (lmps_using_newton) neighbor->requests[irequest]->newton = 0; - } - } + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + // make sure full lists also include local-ghost pairs + if (lmps_using_newton) neighbor->requests[irequest]->newton = 0; return; } @@ -476,27 +423,11 @@ double PairKIM::init_one(int i, int j) /* ---------------------------------------------------------------------- */ -void PairKIM::reinit() -{ - // This is called by fix-adapt - - // Call parent class implementation - Pair::reinit(); - - // Then reinit KIM model - int kimerror; - kimerror = pkim->model_reinit(); - kim_error(__LINE__,"model_reinit unsuccessful", kimerror); -} - -/* ---------------------------------------------------------------------- */ - int PairKIM::pack_reverse_comm(int n, int first, double *buf) { int i,m,last; double *fp; - if (lmps_hybrid) fp = &(lmps_force_tmp[0][0]); - else fp = &(atom->f[0][0]); + fp = &(atom->f[0][0]); m = 0; last = first + n; @@ -555,8 +486,7 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) { int i,j,m; double *fp; - if (lmps_hybrid) fp = &(lmps_force_tmp[0][0]); - else fp = &(atom->f[0][0]); + fp = &(atom->f[0][0]); m = 0; if ((kim_model_has_forces) && ((vflag_atom == 0) || @@ -643,13 +573,6 @@ int PairKIM::get_neigh(void **kimmdl,int *mode,int *request, int kimerror; PairKIM *self = (PairKIM *) pkim->get_sim_buffer(&kimerror); - if (self->kim_model_using_Rij) { - *pRij = &(self->Rij[0]); - } else { - *pRij = 0; - } - - // subvert KIM api by using direct access to self->list // // get neighObj from KIM API obj @@ -671,53 +594,7 @@ int PairKIM::get_neigh(void **kimmdl,int *mode,int *request, firstneigh = neiobj->firstneigh; // ptr to 1st J int value of each I atom if (*mode==0){ //iterator mode - if (*request==1) { //increment iterator - if (self->kim_iterator_position < inum) { - *atom = ilist[self->kim_iterator_position]; - *numnei = numneigh[*atom]; - - // strip off neighbor mask for molecular systems - if (!self->lmps_using_molecular) - *nei1atom = firstneigh[*atom]; - else - { - int n = *numnei; - int *ptr = firstneigh[*atom]; - int *lmps_stripped_neigh_list = self->lmps_stripped_neigh_list; - for (int i = 0; i < n; i++) - lmps_stripped_neigh_list[i] = *(ptr++) & NEIGHMASK; - *nei1atom = lmps_stripped_neigh_list; - } - - // set Rij if needed - if (self->kim_model_using_Rij) { - double* x = (double *) - (*pkim).get_data_by_index(self->kim_ind_coordinates, - &kimerror); - for (jj=0; jj < *numnei; jj++) { - int i = *atom; - j = (*nei1atom)[jj]; - self->Rij[jj*3 +0] = -x[i*3+0] + x[j*3+0]; - self->Rij[jj*3 +1] = -x[i*3+1] + x[j*3+1]; - self->Rij[jj*3 +2] = -x[i*3+2] + x[j*3+2]; - } - } - - // increment iterator - self->kim_iterator_position++; - - return KIM_STATUS_OK; //successful increment - } else if (self->kim_iterator_position == inum) { - *numnei = 0; - return KIM_STATUS_NEIGH_ITER_PAST_END; //reached end by iterator - } else if (self->kim_iterator_position > inum || inum < 0){ - self->error->one(FLERR, "KIM neighbor iterator exceeded range"); - } - } else if (*request == 0){ //restart iterator - self->kim_iterator_position = 0; - *numnei = 0; - return KIM_STATUS_NEIGH_ITER_INIT_OK; //succsesful restart - } + return KIM_STATUS_NEIGH_INVALID_MODE; //unsupported mode } else if (*mode == 1){//locator mode //... if (*request < inum) { @@ -737,18 +614,7 @@ int PairKIM::get_neigh(void **kimmdl,int *mode,int *request, *nei1atom = lmps_stripped_neigh_list; } - // set Rij if needed - if (self->kim_model_using_Rij){ - double* x = (double *) - (*pkim).get_data_by_index(self->kim_ind_coordinates, &kimerror); - for(int jj=0; jj < *numnei; jj++){ - int i = *atom; - int j = (*nei1atom)[jj]; - self->Rij[jj*3 +0] = -x[i*3+0] + x[j*3+0]; - self->Rij[jj*3 +1] = -x[i*3+1] + x[j*3+1]; - self->Rij[jj*3 +2] = -x[i*3+2] + x[j*3+2]; - } - } + *pRij = NULL; return KIM_STATUS_OK; //successful end } else if (*request >= nAtoms || inum < 0) @@ -800,8 +666,6 @@ void PairKIM::kim_init() { int kimerror; - // - // determine KIM Model capabilities (used in this function below) set_kim_model_has_flags(); @@ -827,40 +691,19 @@ void PairKIM::kim_init() test_descriptor_string = 0; } - // determine kim_model_using_* true/false values - // - // check for half or full list - kim_model_using_half = (pkim->is_half_neighbors(&kimerror)); - // - const char* NBC_method; - kimerror = pkim->get_NBC_method(&NBC_method); - kim_error(__LINE__,"NBC method not set",kimerror); - // check for CLUSTER mode - kim_model_using_cluster = (strcmp(NBC_method,"CLUSTER")==0); - // check if Rij needed for get_neigh - kim_model_using_Rij = ((strcmp(NBC_method,"NEIGH_RVEC_H")==0) || - (strcmp(NBC_method,"NEIGH_RVEC_F")==0)); - // get correct index of each variable in kim_api object - pkim->getm_index(&kimerror, 3*13, + pkim->getm_index(&kimerror, 3*12, "coordinates", &kim_ind_coordinates, 1, "cutoff", &kim_ind_cutoff, 1, "numberOfParticles", &kim_ind_numberOfParticles, 1, -#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSON_MINOR == 5 - "numberParticleTypes", &kim_ind_numberOfSpecies, 1, - "particleTypes", &kim_ind_particleSpecies, 1, -#else "numberOfSpecies", &kim_ind_numberOfSpecies, 1, "particleSpecies", &kim_ind_particleSpecies, 1, -#endif - "numberContributingParticles", &kim_ind_numberContributingParticles, - kim_model_using_half, "particleEnergy", &kim_ind_particleEnergy, (int) kim_model_has_particleEnergy, "energy", &kim_ind_energy, (int) kim_model_has_energy, "forces", &kim_ind_forces, (int) kim_model_has_forces, - "neighObject", &kim_ind_neighObject, (int) !kim_model_using_cluster, - "get_neigh", &kim_ind_get_neigh, (int) !kim_model_using_cluster, + "neighObject", &kim_ind_neighObject, 1, + "get_neigh", &kim_ind_get_neigh, 1, "particleVirial", &kim_ind_particleVirial, (int) kim_model_has_particleVirial, "virial", &kim_ind_virial, no_virial_fdotr_compute); @@ -891,21 +734,17 @@ void PairKIM::set_statics() lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); int kimerror; - pkim->setm_data_by_index(&kimerror, 4*6, + pkim->setm_data_by_index(&kimerror, 4*5, kim_ind_numberOfSpecies, 1, (void *) &(atom->ntypes), 1, kim_ind_cutoff, 1, (void *) &(kim_global_cutoff), 1, kim_ind_numberOfParticles, 1, (void *) &lmps_local_tot_num_atoms, 1, - kim_ind_numberContributingParticles, 1, (void *) &(atom->nlocal), - (int) kim_model_using_half, kim_ind_energy, 1, (void *) &(eng_vdwl), (int) kim_model_has_energy, kim_ind_virial, 1, (void *) &(virial[0]), no_virial_fdotr_compute); kim_error(__LINE__, "setm_data_by_index", kimerror); - if (!kim_model_using_cluster) - { - kimerror = pkim->set_method_by_index(kim_ind_get_neigh, 1, - (func_ptr) &get_neigh); - kim_error(__LINE__, "set_method_by_index", kimerror); - } + + kimerror = pkim->set_method_by_index(kim_ind_get_neigh, 1, + (func_ptr) &get_neigh); + kim_error(__LINE__, "set_method_by_index", kimerror); pkim->set_sim_buffer((void *)this, &kimerror); kim_error(__LINE__, "set_sim_buffer", kimerror); @@ -942,13 +781,9 @@ void PairKIM::set_volatiles() if (kim_model_has_forces) { - if (lmps_hybrid) - kimerror = pkim->set_data_by_index(kim_ind_forces, nall*3, - (void*) &(lmps_force_tmp[0][0])); - else - kimerror = pkim->set_data_by_index(kim_ind_forces, nall*3, - (void*) &(atom->f[0][0])); - kim_error(__LINE__, "setm_data_by_index", kimerror); + kimerror = pkim->set_data_by_index(kim_ind_forces, nall*3, + (void*) &(atom->f[0][0])); + kim_error(__LINE__, "set_data_by_index", kimerror); } // subvert the KIM api by direct access to this->list in get_neigh @@ -994,16 +829,10 @@ void PairKIM::set_lmps_flags() } // determine if running with pair hybrid - lmps_hybrid = (force->pair_match("hybrid",0)); - - // support cluster mode if everything is just right - lmps_support_cluster = ((domain->xperiodic == 0 && - domain->yperiodic == 0 && - domain->zperiodic == 0 - ) - && - (comm->nprocs == 1) - ); + if (force->pair_match("hybrid",0)) + { + error->all(FLERR,"pair_kim does not support hybrid."); + } // determine unit system and set lmps_units flag if ((strcmp(update->unit_style,"real")==0)) @@ -1177,30 +1006,9 @@ void PairKIM::write_descriptor(char** test_descriptor_string) "\n" "CONVENTIONS:\n" "# Name Type\n" - "ZeroBasedLists flag\n"); - // can use iterator or locator neighbor mode, unless in hybrid mode - if (lmps_hybrid) - strcat(*test_descriptor_string, - "Neigh_IterAccess flag\n"); - else - strcat(*test_descriptor_string, - "Neigh_BothAccess flag\n\n"); - - strcat(*test_descriptor_string, - "NEIGH_PURE_H flag\n" - "NEIGH_PURE_F flag\n" - "NEIGH_RVEC_H flag\n" - "NEIGH_RVEC_F flag\n"); - // @@ add code for MI_OPBC_? support ???? - if (lmps_support_cluster) - { - strcat(*test_descriptor_string, - "CLUSTER flag\n\n"); - } - else - { - strcat(*test_descriptor_string, "\n"); - } + "ZeroBasedLists flag\n" + "Neigh_LocaAccess flag\n" + "NEIGH_PURE_F flag\n\n"); // Write input section strcat(*test_descriptor_string, @@ -1208,14 +1016,8 @@ void PairKIM::write_descriptor(char** test_descriptor_string) "MODEL_INPUT:\n" "# Name Type Unit Shape\n" "numberOfParticles integer none []\n" - "numberContributingParticles integer none []\n" -#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSON_MINOR == 5 - "numberParticleTypes integer none []\n" - "particleTypes integer none " -#else "numberOfSpecies integer none []\n" "particleSpecies integer none " -#endif "[numberOfParticles]\n" "coordinates double length " "[numberOfParticles,3]\n" @@ -1256,161 +1058,3 @@ void PairKIM::write_descriptor(char** test_descriptor_string) return; } - -void *PairKIM::extract(const char *str, int &dim) -{ - void *paramData; - int kimerror=0; - int ier; - int dummyint; - int isIndexed = 0; - const int MAXLINE = 1024; - int rank; - int validParam = 0; - int numParams; - int *speciesIndex = new int[MAXLINE]; - char *paramStr = new char[MAXLINE]; - char *paramName; - char *indexStr; - char message[MAXLINE]; - int offset; - double* paramPtr; - - // set dim to 0, we will always deal with scalars to circumvent lammps species - // indexing - dim = 0; - - // copy the input str into paramStr for parsing - strcpy(paramStr, str); - // get the name of the parameter (whatever is before ":") - paramName = strtok(paramStr, ":"); - if (0 == strcmp(paramName, str)) - paramName = (char*) str; - else - isIndexed = 1; - - // parse the rest of the string into tokens deliminated by "," and convert - // them to integers, saving them into speciesIndex - int count = -1; - if (isIndexed == 1) - { - while((indexStr = strtok(NULL, ",")) != NULL) - { - count++; - ier = sscanf(indexStr, "%d", &speciesIndex[count]); - if (ier != 1) - { - ier = -1; - break; - } - } - } - if (ier == -1) - { - delete [] speciesIndex, speciesIndex = 0; - delete [] paramStr, paramStr = 0; - kim_error(__LINE__,"error in PairKIM::extract(), invalid parameter-indicie format", KIM_STATUS_FAIL); - } - - // check to make sure that the requested parameter is a valid free parameter - - kimerror = pkim->get_num_params(&numParams, &dummyint); - kim_error(__LINE__, "get_num_free_params", kimerror); - char **freeParamNames = new char*[numParams]; - for (int k = 0; k < numParams; k++) - { - kimerror = pkim->get_free_parameter(k, (const char**) &freeParamNames[k]); - kim_error(__LINE__, "get_free_parameter", kimerror); - if (0 == strcmp(paramName, freeParamNames[k])) - { - validParam = 1; - break; - } - } - delete [] freeParamNames, freeParamNames = 0; - if (validParam == 0) - { - sprintf(message, "Invalid parameter to adapt: \"%s\" is not a FREE_PARAM", paramName); - delete [] speciesIndex, speciesIndex = 0; - delete [] paramStr, paramStr = 0; - kim_error(__LINE__, message, KIM_STATUS_FAIL); - } - - // get the parameter arry from pkim object - paramData = pkim->get_data(paramName, &kimerror); - if (kimerror == KIM_STATUS_FAIL) - { - delete [] speciesIndex, speciesIndex = 0; - delete [] paramStr, paramStr = 0; - } - kim_error(__LINE__,"get_data",kimerror); - - // get rank and shape of parameter - rank = (*pkim).get_rank(paramName, &kimerror); - if (kimerror == KIM_STATUS_FAIL) - { - delete [] speciesIndex, speciesIndex = 0; - delete [] paramStr, paramStr = 0; - } - kim_error(__LINE__,"get_rank",kimerror); - - int *shape = new int[MAXLINE]; - dummyint = (*pkim).get_shape(paramName, shape, &kimerror); - if (kimerror == KIM_STATUS_FAIL) - { - delete [] speciesIndex, speciesIndex = 0; - delete [] paramStr, paramStr = 0; - delete [] shape, shape = 0; - } - kim_error(__LINE__,"get_shape",kimerror); - - delete [] paramStr, paramStr = 0; - // check that number of inputs is rank, and that input indicies are less than - // their respective dimensions in shape - if ((count+1) != rank) - { - sprintf(message, "Number of input indicies not equal to rank of specified parameter (%d)", rank); - kimerror = KIM_STATUS_FAIL; - delete [] speciesIndex, speciesIndex = 0; - delete [] shape, shape = 0; - kim_error(__LINE__,message, kimerror); - } - if (isIndexed == 1) - { - for (int i=0; i <= count; i++) - { - if (shape[i] <= speciesIndex[i] || speciesIndex[i] < 0) - { - kimerror = KIM_STATUS_FAIL; - break; - } - } - } - delete [] shape, shape = 0; - if (kimerror == KIM_STATUS_FAIL) - { - sprintf(message, "One or more parameter indicies out of bounds"); - delete [] speciesIndex, speciesIndex = 0; - kim_error(__LINE__, message, kimerror); - } - - // Cast it to a double - paramPtr = static_cast(paramData); - - // If it is indexed (not just a scalar for the whole model), then get pointer - // corresponding to specified indicies by calculating the adress offset using - // specified indicies and the shape - if (isIndexed == 1) - { - offset = 0; - for (int i = 0; i < (rank-1); i++) - { - offset = (offset + speciesIndex[i]) * shape[i+1]; - } - offset = offset + speciesIndex[(rank - 1)]; - paramPtr = (paramPtr + offset); - } - delete [] speciesIndex, speciesIndex = 0; - - return ((void*) paramPtr); -} diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index fb4cda8af9..493aa9066a 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -18,8 +18,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the openkim-api-v1.5.0 package and for use with - the kim-api-v1.6.0 (and newer) package + Designed for use with the kim-api-v1.6.0 (and newer) package ------------------------------------------------------------------------- */ #ifdef PAIR_CLASS @@ -49,11 +48,9 @@ namespace LAMMPS_NS { virtual void coeff(int, char**); virtual void init_style(); virtual double init_one(int, int); - virtual void reinit(); virtual int pack_reverse_comm(int, int, double*); virtual void unpack_reverse_comm(int, int*, double*); virtual double memory_usage(); - void *extract(const char *, int &); private: // (nearly) all bool flags are not initialized in constructor, but set @@ -80,9 +77,6 @@ namespace LAMMPS_NS { // values set in set_lmps_flags(), called from init_style() bool lmps_using_newton; bool lmps_using_molecular; - bool lmps_hybrid; // true if running with pair hybrid - bool lmps_support_cluster; // true if running in mode compat. - // with CLUSTER enum unit_sys {REAL, METAL, SI, CGS, ELECTRON}; unit_sys lmps_units; @@ -95,9 +89,6 @@ namespace LAMMPS_NS { // values set in kim_init(), after call to string_init(_) bool kim_init_ok; - bool kim_model_using_half; - bool kim_model_using_cluster; - bool kim_model_using_Rij; int kim_ind_coordinates; int kim_ind_numberOfParticles; int kim_ind_numberContributingParticles; @@ -125,16 +116,9 @@ namespace LAMMPS_NS { // values set in compute() int lmps_maxalloc; // max allocated memory value int* kim_particleSpecies; // array of KIM particle species - double** lmps_force_tmp; // temp storage for f, when running in - // hybrid mode needed to avoid resetting - // f to zero in each object int* lmps_stripped_neigh_list; // neighbors of one atom, used when LAMMPS // is in molecular mode - // values used in get_neigh() - int kim_iterator_position; //get_neigh iterator current position - double *Rij; - // KIM specific helper functions void kim_error(int, const char *, int); void kim_init(); @@ -199,19 +183,19 @@ Self-explanatory. Check the input script or data file. W: KIM Model does not provide `energy'; Potential energy will be zero -UNDOCUMENTED +Self-explanatory. W: KIM Model does not provide `forces'; Forces will be zero -UNDOCUMENTED +Self-explanatory. W: KIM Model does not provide `particleEnergy'; energy per atom will be zero -UNDOCUMENTED +Self-explanatory. W: KIM Model does not provide `particleVirial'; virial per atom will be zero -UNDOCUMENTED + E: Test_descriptor_string already allocated From 8bbba22867fd451d451875b72b3c462b79815c9d Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Fri, 22 Jun 2018 13:33:15 -0500 Subject: [PATCH 0006/1242] First working version of pair_kim with kim-api-v2 --- lib/kim/Install.py | 8 +- lib/kim/Makefile.lammps | 6 +- src/KIM/pair_kim.cpp | 677 ++++++++++++++++------------------------ src/KIM/pair_kim.h | 40 ++- 4 files changed, 289 insertions(+), 442 deletions(-) diff --git a/lib/kim/Install.py b/lib/kim/Install.py index d098250906..1bcaffd34a 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -21,7 +21,7 @@ Syntax from lib dir: python Install.py -b -v version -a kim-name specify one or more options, order does not matter -v = version of KIM API library to use - default = kim-api-v1.9.5 (current as of May 2018) + default = kim-api-v2.0.0-beta.0 (current as of June 2018) -b = download and build base KIM API library with example Models this will delete any previous installation in the current folder -n = do NOT download and build base KIM API library. @@ -109,7 +109,7 @@ nargs = len(args) if nargs == 0: error() thisdir = os.environ['PWD'] -version = "kim-api-v1.9.5" +version = "kim-api-v2.0.0-beta.0" buildflag = False everythingflag = False @@ -234,7 +234,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-v1-collections-management install system OpenKIM' % (kimdir) + cmd = '%s/bin/kim-api-v2-collections-management install system OpenKIM' % (kimdir) txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) if verboseflag: print(txt.decode("UTF-8")) @@ -251,6 +251,6 @@ if addflag: error() # download single model - cmd = '%s/bin/kim-api-v1-collections-management install system %s' % (kimdir.decode("UTF-8"), addmodelname) + cmd = '%s/bin/kim-api-v2-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 d73891d1e2..c7c9d9fd2f 100644 --- a/lib/kim/Makefile.lammps +++ b/lib/kim/Makefile.lammps @@ -18,10 +18,10 @@ include ../../lib/kim/Makefile.KIM_DIR -ifeq ($(wildcard $(KIM_INSTALL_DIR)/bin/kim-api-v1-build-config),) - KIM_CONFIG_HELPER = kim-api-v1-build-config +ifeq ($(wildcard $(KIM_INSTALL_DIR)/bin/kim-api-v2-build-config),) + KIM_CONFIG_HELPER = kim-api-v2-build-config else - KIM_CONFIG_HELPER = $(KIM_INSTALL_DIR)/bin/kim-api-v1-build-config + KIM_CONFIG_HELPER = $(KIM_INSTALL_DIR)/bin/kim-api-v2-build-config endif ifeq ($(shell $(KIM_CONFIG_HELPER) --version 2> /dev/null),) $(error $(KIM_CONFIG_HELPER) utility is not available. Something is wrong with your KIM API package setup) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 8947bd6c3b..413c5303e1 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -37,10 +37,6 @@ #include "domain.h" #include "error.h" -// includes from KIM -#include "KIM_API.h" -#include "KIM_API_status.h" - using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ @@ -55,24 +51,15 @@ PairKIM::PairKIM(LAMMPS *lmp) : lmps_num_unique_elements(0), lmps_units(METAL), pkim(0), - kim_ind_coordinates(-1), - kim_ind_numberOfParticles(-1), - kim_ind_numberContributingParticles(-1), - kim_ind_numberOfSpecies(-1), - kim_ind_particleSpecies(-1), - kim_ind_get_neigh(-1), - kim_ind_neighObject(-1), - kim_ind_cutoff(-1), - kim_ind_energy(-1), - kim_ind_particleEnergy(-1), - kim_ind_forces(-1), - kim_ind_virial(-1), - kim_ind_particleVirial(-1), + pargs(0), kim_particle_codes(0), lmps_local_tot_num_atoms(0), - kim_global_cutoff(0.0), + kim_global_influence_distance(0.0), + kim_number_of_cutoffs(0), + kim_cutoff_values(0), lmps_maxalloc(0), kim_particleSpecies(0), + kim_particleContributing(0), lmps_stripped_neigh_list(0) { // Initialize Pair data members to appropriate values @@ -104,6 +91,7 @@ PairKIM::~PairKIM() // clean up local memory used to support KIM interface memory->destroy(kim_particleSpecies); + memory->destroy(kim_particleContributing); memory->destroy(lmps_stripped_neigh_list); // clean up allocated memory for standard Pair class usage @@ -131,13 +119,27 @@ void PairKIM::compute(int eflag , int vflag) else ev_unset(); - // grow kim_particleSpecies array if necessary + // grow kim_particleSpecies and kim_particleContributing array if necessary // needs to be atom->nmax in length if (atom->nmax > lmps_maxalloc) { memory->destroy(kim_particleSpecies); + memory->destroy(kim_particleContributing); lmps_maxalloc = atom->nmax; - memory->create(kim_particleSpecies,lmps_maxalloc,"pair:kim_particleSpecies"); + memory->create(kim_particleSpecies,lmps_maxalloc, + "pair:kim_particleSpecies"); + int kimerror = pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::particleSpeciesCodes, + kim_particleSpecies); + memory->create(kim_particleContributing,lmps_maxalloc, + "pair:kim_particleContributing"); + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::particleContributing, + kim_particleContributing); + if (kimerror) + error->all( + FLERR, + "Unable to set KIM particle species codes and/or contributing"); } // kim_particleSpecies = KIM atom species for each LAMMPS atom @@ -151,23 +153,17 @@ void PairKIM::compute(int eflag , int vflag) ielement = lmps_map_species_to_unique[species[i]]; ielement = MAX(ielement,0); kim_particleSpecies[i] = kim_particle_codes[ielement]; + + kim_particleContributing[i] = ( (inlocal) ? 1 : 0 ); } // pass current atom pointers to KIM set_volatiles(); - pkim->setm_compute_by_index(&kimerror,3*3, - kim_ind_particleEnergy, eflag_atom, - (int) kim_model_has_particleEnergy, - kim_ind_particleVirial, vflag_atom, - (int) kim_model_has_particleVirial, - kim_ind_virial, vflag_global!=0, - no_virial_fdotr_compute); - kim_error(__LINE__,"setm_compute_by_index",kimerror); - // compute via KIM model - kimerror = pkim->model_compute(); - kim_error(__LINE__,"PairKIM::pkim->model_compute() error",kimerror); + kimerror = pkim->Compute(pargs); + if (kimerror) error->all(FLERR,"KIM Compute returned error"); + // assemble force and particleVirial if needed if (!lmps_using_newton) comm->reverse_comm_pair(this); @@ -280,17 +276,6 @@ void PairKIM::settings(int narg, char **arg) kim_modelname = new char[nmlen+1]; strcpy(kim_modelname, arg[1]); - // set print_kim_file - // @@@ should be removed for v2; update docs - if ((2 == narg) || ('0' == *(arg[2]))) - { - print_kim_file = false; - } - else - { - print_kim_file = true; - } - return; } @@ -385,13 +370,6 @@ void PairKIM::init_style() if (!kim_init_ok) { kim_init(); - kimerror = pkim->model_init(); - if (kimerror != KIM_STATUS_OK) - kim_error(__LINE__, "KIM API:model_init() failed", kimerror); - else - { - kim_model_init_ok = true; - } } // make sure comm_reverse expects (at most) 9 values when newton is off @@ -418,7 +396,7 @@ double PairKIM::init_one(int i, int j) if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - return kim_global_cutoff; + return kim_global_influence_distance; } /* ---------------------------------------------------------------------- */ @@ -554,38 +532,31 @@ double PairKIM::memory_usage() KIM-specific interface ------------------------------------------------------------------------- */ -void PairKIM::kim_error(int ln, const char* msg, int errcode) +int PairKIM::get_neigh(void const * const dataObject, + int const numberOfCutoffs, double const * const cutoffs, + int const neighborListIndex, int const particleNumber, + int * const numberOfNeighbors, + int const ** const neighborsOfParticle) { - if (errcode == KIM_STATUS_OK) return; - KIM_API_model::report_error(ln,(char *) __FILE__, (char *) msg,errcode); - error->all(__FILE__,ln,"Internal KIM error"); + PairKIM const * const Model + = reinterpret_cast(dataObject); - return; -} + if ((numberOfCutoffs != 1) || (cutoffs[0] > Model->kim_cutoff_values[0])) + return true; -/* ---------------------------------------------------------------------- */ + if (neighborListIndex != 0) return true; -int PairKIM::get_neigh(void **kimmdl,int *mode,int *request, - int *atom, int *numnei, int **nei1atom, double **pRij) -{ - KIM_API_model *pkim = (KIM_API_model *) *kimmdl; + // initialize numNeigh + *numberOfNeighbors = 0; - int kimerror; - PairKIM *self = (PairKIM *) pkim->get_sim_buffer(&kimerror); + if ((particleNumber >= Model->lmps_local_tot_num_atoms) || + (particleNumber < 0)) /* invalid id */ + { + return true; + } - // subvert KIM api by using direct access to self->list - // - // get neighObj from KIM API obj - // NeighList * neiobj = (NeighList * ) - // (*pkim).get_data_by_index(self->kim_ind_neighObject, &kimerror); - NeighList * neiobj = self->list; - - // subvert KIM api by using direct acces to self->lmps_local_tot_num_atoms - // - //int * pnAtoms = (int *) - // (*pkim).get_data_by_index(self->kim_ind_numberOfParticles, &kimerror); - //int nAtoms = *pnAtoms; - int nAtoms = self->lmps_local_tot_num_atoms; + NeighList * neiobj = Model->list; + int nAtoms = Model->lmps_local_tot_num_atoms; int j, jj, inum, *ilist, *numneigh, **firstneigh; inum = neiobj->inum; //# of I atoms neighbors are stored for @@ -593,40 +564,21 @@ int PairKIM::get_neigh(void **kimmdl,int *mode,int *request, numneigh = neiobj->numneigh; // # of J neighbors for each I atom firstneigh = neiobj->firstneigh; // ptr to 1st J int value of each I atom - if (*mode==0){ //iterator mode - return KIM_STATUS_NEIGH_INVALID_MODE; //unsupported mode - } else if (*mode == 1){//locator mode - //... - if (*request < inum) { - *atom = *request; - *numnei = numneigh[*atom]; + *numberOfNeighbors = numneigh[particleNumber]; - // strip off neighbor mask for molecular systems - if (!self->lmps_using_molecular) - *nei1atom = firstneigh[*atom]; - else - { - int n = *numnei; - int *ptr = firstneigh[*atom]; - int *lmps_stripped_neigh_list = self->lmps_stripped_neigh_list; - for (int i = 0; i < n; i++) - lmps_stripped_neigh_list[i] = *(ptr++) & NEIGHMASK; - *nei1atom = lmps_stripped_neigh_list; - } - - *pRij = NULL; - return KIM_STATUS_OK; //successful end - } - else if (*request >= nAtoms || inum < 0) - return KIM_STATUS_NEIGH_INVALID_REQUEST; - else if (*request >= inum) { - *atom = *request; - *numnei = 0; - return KIM_STATUS_OK; //successfull but no neighbors in the list - } - } else return KIM_STATUS_NEIGH_INVALID_MODE; //invalid mode - - return -16; //should not get here: unspecified error + // strip off neighbor mask for molecular systems + if (!Model->lmps_using_molecular) + *neighborsOfParticle = firstneigh[particleNumber]; + else + { + int n = *numberOfNeighbors; + int *ptr = firstneigh[particleNumber]; + int *lmps_stripped_neigh_list = Model->lmps_stripped_neigh_list; + for (int i = 0; i < n; i++) + lmps_stripped_neigh_list[i] = *(ptr++) & NEIGHMASK; + *neighborsOfParticle = lmps_stripped_neigh_list; + } + return false; } /* ---------------------------------------------------------------------- */ @@ -637,19 +589,15 @@ void PairKIM::kim_free() if (kim_model_init_ok) { - kimerror = pkim->model_destroy(); - kim_model_init_ok = false; - } - if (kim_init_ok) - { - pkim->free(&kimerror); - kim_init_ok = false; - } - if (pkim != 0) - { - delete pkim; - pkim = 0; + int kimerror = pkim->ComputeArgumentsDestroy(&pargs); + if (kimerror) + error->all(FLERR,"Unable to destroy Compute Arguments Object"); + + KIM::Model::Destroy(&pkim); + kim_model_init_ok = false; } + kim_init_ok = false; + if (kim_particle_codes_ok) { delete [] kim_particle_codes; @@ -666,58 +614,47 @@ void PairKIM::kim_init() { int kimerror; + // initialize KIM model + int requestedUnitsAccepted; + kimerror = KIM::Model::Create( + KIM::NUMBERING::zeroBased, + lengthUnit, energyUnit, chargeUnit, temperatureUnit, timeUnit, + kim_modelname, + &requestedUnitsAccepted, + &pkim); + if (kimerror) + error->all(FLERR,"KIM ModelCreate failed"); + else { + if (!requestedUnitsAccepted) { + // @@@ error for now. Fix as needed + error->all(FLERR,"KIM Model did not accept the requested unit system"); + } + + kimerror = pkim->ComputeArgumentsCreate(&pargs); + if (kimerror) + error->all(FLERR,"KIM ComputeArgumentsCreate failed"); + else + kim_init_ok = true; + } + // determine KIM Model capabilities (used in this function below) set_kim_model_has_flags(); - // create appropriate KIM descriptor file - char* test_descriptor_string = 0; - // allocate memory for test_descriptor_string and write descriptor file - write_descriptor(&test_descriptor_string); - // print descriptor - if (print_kim_file) - { - error->message(FLERR, test_descriptor_string); - } - - // initialize KIM model - pkim = new KIM_API_model(); - kimerror = pkim->string_init(test_descriptor_string, kim_modelname); - if (kimerror != KIM_STATUS_OK) - kim_error(__LINE__,"KIM initialization failed", kimerror); - else - { - kim_init_ok = true; - delete [] test_descriptor_string; - test_descriptor_string = 0; - } - - // get correct index of each variable in kim_api object - pkim->getm_index(&kimerror, 3*12, - "coordinates", &kim_ind_coordinates, 1, - "cutoff", &kim_ind_cutoff, 1, - "numberOfParticles", &kim_ind_numberOfParticles, 1, - "numberOfSpecies", &kim_ind_numberOfSpecies, 1, - "particleSpecies", &kim_ind_particleSpecies, 1, - "particleEnergy", &kim_ind_particleEnergy, - (int) kim_model_has_particleEnergy, - "energy", &kim_ind_energy, (int) kim_model_has_energy, - "forces", &kim_ind_forces, (int) kim_model_has_forces, - "neighObject", &kim_ind_neighObject, 1, - "get_neigh", &kim_ind_get_neigh, 1, - "particleVirial", &kim_ind_particleVirial, - (int) kim_model_has_particleVirial, - "virial", &kim_ind_virial, no_virial_fdotr_compute); - kim_error(__LINE__,"getm_index",kimerror); - // setup mapping between LAMMPS unique elements and KIM species codes kim_particle_codes = new int[lmps_num_unique_elements]; kim_particle_codes_ok = true; for(int i = 0; i < lmps_num_unique_elements; i++){ int kimerror; - kim_particle_codes[i] - = pkim->get_species_code(lmps_unique_elements[i], &kimerror); - kim_error(__LINE__, "create_kim_particle_codes: symbol not found ", - kimerror); + int supported; + int code; + kimerror = pkim->GetSpeciesSupportAndCode( + KIM::SpeciesName(lmps_unique_elements[i]), + &supported, + &code); + if (supported) + kim_particle_codes[i] = code; + else + error->all(FLERR,"create_kim_particle_codes: symbol not found "); } // set pointer values in KIM API object that will not change during run @@ -733,21 +670,26 @@ void PairKIM::set_statics() // set total number of atoms lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); - int kimerror; - pkim->setm_data_by_index(&kimerror, 4*5, - kim_ind_numberOfSpecies, 1, (void *) &(atom->ntypes), 1, - kim_ind_cutoff, 1, (void *) &(kim_global_cutoff), 1, - kim_ind_numberOfParticles, 1, (void *) &lmps_local_tot_num_atoms, 1, - kim_ind_energy, 1, (void *) &(eng_vdwl), (int) kim_model_has_energy, - kim_ind_virial, 1, (void *) &(virial[0]), no_virial_fdotr_compute); - kim_error(__LINE__, "setm_data_by_index", kimerror); + pkim->GetInfluenceDistance(&kim_global_influence_distance); + pkim->GetNeighborListCutoffsPointer(&kim_number_of_cutoffs, + &kim_cutoff_values); - kimerror = pkim->set_method_by_index(kim_ind_get_neigh, 1, - (func_ptr) &get_neigh); - kim_error(__LINE__, "set_method_by_index", kimerror); + int kimerror = pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::numberOfParticles, + &lmps_local_tot_num_atoms); + if (kim_model_has_energy) + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::partialEnergy, + &(eng_vdwl)); - pkim->set_sim_buffer((void *)this, &kimerror); - kim_error(__LINE__, "set_sim_buffer", kimerror); + kimerror = pargs->SetCallbackPointer( + KIM::COMPUTE_CALLBACK_NAME::GetNeighborList, + KIM::LANGUAGE_NAME::cpp, + reinterpret_cast(get_neigh), + reinterpret_cast(this)); + + if (kimerror) + error->all(FLERR,"Unable to register KIM static pointers"); return; } @@ -758,56 +700,56 @@ void PairKIM::set_volatiles() { int kimerror; lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); - intptr_t nall = (intptr_t) lmps_local_tot_num_atoms; - pkim->setm_data_by_index(&kimerror, 4*2, - kim_ind_coordinates, 3*nall, (void*) &(atom->x[0][0]), 1, - kim_ind_particleSpecies, nall, (void*) kim_particleSpecies, 1); - kim_error(__LINE__, "setm_data_by_index", kimerror); + kimerror = pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::coordinates, + &(atom->x[0][0])); if (kim_model_has_particleEnergy && (eflag_atom == 1)) { - kimerror = pkim->set_data_by_index(kim_ind_particleEnergy, nall, - (void*) eatom); - kim_error(__LINE__, "set_data_by_index", kimerror); - } - - if (kim_model_has_particleVirial && (vflag_atom == 1)) - { - kimerror = pkim->set_data_by_index(kim_ind_particleVirial, 6*nall, - (void*) &(vatom[0][0])); - kim_error(__LINE__, "set_data_by_index", kimerror); + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::partialParticleEnergy, + eatom); } if (kim_model_has_forces) { - kimerror = pkim->set_data_by_index(kim_ind_forces, nall*3, - (void*) &(atom->f[0][0])); - kim_error(__LINE__, "set_data_by_index", kimerror); + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::partialForces, + &(atom->f[0][0])); } - // subvert the KIM api by direct access to this->list in get_neigh - // - //if (!kim_model_using_cluster) - // kimerror = pkim->set_data_by_index(kim_ind_neighObject, 1, - // (void*) this->list); - if (kim_model_has_particleVirial) { - if(vflag_atom != 1) { - pkim->set_compute_by_index(kim_ind_particleVirial, KIM_COMPUTE_FALSE, - &kimerror); - } else { - pkim->set_compute_by_index(kim_ind_particleVirial, KIM_COMPUTE_TRUE, - &kimerror); - } + if(vflag_atom != 1) { + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial, + &(vatom[0][0])); + } else { + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial, + reinterpret_cast(NULL)); + } } if (no_virial_fdotr_compute == 1) { - pkim->set_compute_by_index(kim_ind_virial, - ((vflag_global != 1) ? KIM_COMPUTE_FALSE : KIM_COMPUTE_TRUE), - &kimerror); + if (kim_model_has_virial) + { + if (vflag_global == 1) + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::partialVirial, + &(virial[0])); + else + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::partialVirial, + reinterpret_cast(NULL)); + } + } + + if (kimerror) + { + error->all(FLERR,"Unable to set KIM volatile pointers"); } return; @@ -835,20 +777,46 @@ void PairKIM::set_lmps_flags() } // determine unit system and set lmps_units flag - if ((strcmp(update->unit_style,"real")==0)) - lmps_units = REAL; - else if ((strcmp(update->unit_style,"metal")==0)) - lmps_units = METAL; - else if ((strcmp(update->unit_style,"si")==0)) - lmps_units = SI; - else if ((strcmp(update->unit_style,"cgs")==0)) - lmps_units = CGS; - else if ((strcmp(update->unit_style,"electron")==0)) - lmps_units = ELECTRON; - else if ((strcmp(update->unit_style,"lj")==0)) - error->all(FLERR,"LAMMPS unit_style lj not supported by KIM models"); - else - error->all(FLERR,"Unknown unit_style"); + if ((strcmp(update->unit_style,"real")==0)) { + lmps_units = REAL; + lengthUnit = KIM::LENGTH_UNIT::A; + energyUnit = KIM::ENERGY_UNIT::kcal_mol; + chargeUnit = KIM::CHARGE_UNIT::e; + temperatureUnit = KIM::TEMPERATURE_UNIT::K; + timeUnit = KIM::TIME_UNIT::fs; + } else if ((strcmp(update->unit_style,"metal")==0)) { + lmps_units = METAL; + lengthUnit = KIM::LENGTH_UNIT::A; + energyUnit = KIM::ENERGY_UNIT::eV; + chargeUnit = KIM::CHARGE_UNIT::e; + temperatureUnit = KIM::TEMPERATURE_UNIT::K; + timeUnit = KIM::TIME_UNIT::ps; + } else if ((strcmp(update->unit_style,"si")==0)) { + lmps_units = SI; + lengthUnit = KIM::LENGTH_UNIT::m; + energyUnit = KIM::ENERGY_UNIT::J; + chargeUnit = KIM::CHARGE_UNIT::C; + temperatureUnit = KIM::TEMPERATURE_UNIT::K; + timeUnit = KIM::TIME_UNIT::s; + } else if ((strcmp(update->unit_style,"cgs")==0)) { + lmps_units = CGS; + lengthUnit = KIM::LENGTH_UNIT::cm; + energyUnit = KIM::ENERGY_UNIT::erg; + chargeUnit = KIM::CHARGE_UNIT::statC; + temperatureUnit = KIM::TEMPERATURE_UNIT::K; + timeUnit = KIM::TIME_UNIT::s; + } else if ((strcmp(update->unit_style,"electron")==0)) { + lmps_units = ELECTRON; + lengthUnit = KIM::LENGTH_UNIT::Bohr; + energyUnit = KIM::ENERGY_UNIT::Hartree; + chargeUnit = KIM::CHARGE_UNIT::e; + temperatureUnit = KIM::TEMPERATURE_UNIT::K; + timeUnit = KIM::TIME_UNIT::fs; + } else if ((strcmp(update->unit_style,"lj")==0)) { + error->all(FLERR,"LAMMPS unit_style lj not supported by KIM models"); + } else { + error->all(FLERR,"Unknown unit_style"); + } return; } @@ -857,204 +825,85 @@ void PairKIM::set_lmps_flags() void PairKIM::set_kim_model_has_flags() { - KIM_API_model mdl; - + // @@ the procedure below should be improved to be more comprehensive + // @@ and ensure that there are no additions/changes to the kim-api + // @@ that could cause a problem. This should be done using the + // @@ "discoverability" features of the kim-api int kimerror; + KIM::SupportStatus supportStatus; - // get KIM API object representing the KIM Model only - kimerror = mdl.model_info(kim_modelname); - kim_error(__LINE__,"KIM initialization failed", kimerror); + // determine if the KIM Model can compute the total partialEnergy - // determine if the KIM Model can compute the total energy - mdl.get_index((char*) "energy", &kimerror); - kim_model_has_energy = (kimerror == KIM_STATUS_OK); - if (!kim_model_has_energy) - error->warning(FLERR,"KIM Model does not provide `energy'; " + // determine if the KIM Model can compute the energy + kimerror = pargs->GetArgumentSupportStatus( + KIM::COMPUTE_ARGUMENT_NAME::partialEnergy, + &supportStatus); + if (kimerror) + error->all(FLERR,"Unable to get KIM Support Status"); + if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { + kim_model_has_energy = false; + error->warning(FLERR,"KIM Model does not provide `partialEnergy'; " "Potential energy will be zero"); + } else { + kim_model_has_energy = true; + } - // determine if the KIM Model can compute the forces - mdl.get_index((char*) "forces", &kimerror); - kim_model_has_forces = (kimerror == KIM_STATUS_OK); - if (!kim_model_has_forces) - error->warning(FLERR,"KIM Model does not provide `forces'; " + // determine if the KIM Model can compute the partialForces + kimerror = pargs->GetArgumentSupportStatus( + KIM::COMPUTE_ARGUMENT_NAME::partialForces, + &supportStatus); + if (kimerror) + error->all(FLERR,"Unable to get KIM Support Status"); + if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { + kim_model_has_forces = false; + error->warning(FLERR,"KIM Model does not provide `partialForce'; " "Forces will be zero"); + } else { + kim_model_has_forces = true; + } - // determine if the KIM Model can compute the particleEnergy - mdl.get_index((char*) "particleEnergy", &kimerror); - kim_model_has_particleEnergy = (kimerror == KIM_STATUS_OK); - if (!kim_model_has_particleEnergy) - error->warning(FLERR,"KIM Model does not provide `particleEnergy'; " + // determine if the KIM Model can compute the partialVirial + kimerror = pargs->GetArgumentSupportStatus( + KIM::COMPUTE_ARGUMENT_NAME::partialVirial, + &supportStatus); + if (kimerror) + error->all(FLERR,"Unable to get KIM Support Status"); + if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { + kim_model_has_virial = false; + error->warning(FLERR,"KIM Model does not provide `partialVirial'. " + "pair_kim now using `LAMMPSvirial' option."); + no_virial_fdotr_compute = 0; + } else { + kim_model_has_virial = true; + } + + // determine if the KIM Model can compute the partialParticleEnergy + kimerror = pargs->GetArgumentSupportStatus( + KIM::COMPUTE_ARGUMENT_NAME::partialParticleEnergy, + &supportStatus); + if (kimerror) + error->all(FLERR,"Unable to get KIM Support Status"); + if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { + kim_model_has_particleEnergy = false; + error->warning(FLERR,"KIM Model does not provide `partialParticleEnergy'; " "energy per atom will be zero"); + } else { + kim_model_has_particleEnergy = true; + } - // determine if the KIM Model can compute the particleVerial - mdl.get_index((char*) "particleVirial", &kimerror); - kim_model_has_particleVirial = (kimerror == KIM_STATUS_OK); - mdl.get_index((char*) "process_dEdr", &kimerror); - kim_model_has_particleVirial = kim_model_has_particleVirial || - (kimerror == KIM_STATUS_OK); - if (!kim_model_has_particleVirial) - error->warning(FLERR,"KIM Model does not provide `particleVirial'; " + // determine if the KIM Model can compute the partialParticleVirial + kimerror = pargs->GetArgumentSupportStatus( + KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial, + &supportStatus); + if (kimerror) + error->all(FLERR,"Unable to get KIM Support Status"); + if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { + kim_model_has_particleVirial = false; + error->warning(FLERR,"KIM Model does not provide `partialParticleVirial'; " "virial per atom will be zero"); - - // tear down KIM API object - mdl.free(&kimerror); - // now destructor will do the remaining tear down for mdl - - return; -} - -/* ---------------------------------------------------------------------- */ - -void PairKIM::write_descriptor(char** test_descriptor_string) -{ - // allocate memory - if (*test_descriptor_string != 0) - error->all(FLERR, "Test_descriptor_string already allocated"); - // assuming 75 lines at 100 characters each (should be plenty) - *test_descriptor_string = new char[100*75]; - // initialize - strcpy(*test_descriptor_string, ""); - - // Write Test name and units - strcat(*test_descriptor_string, - "#\n" - "# BEGINNING OF KIM DESCRIPTOR FILE\n" - "#\n" - "# This file is automatically generated from LAMMPS pair_style " - "kim command\n"); - strcat(*test_descriptor_string, - "\n" - "# The call number is (pair_style).(init_style): "); - char tmp_num[100]; - sprintf(tmp_num, "%i.%i\n", settings_call_count, init_style_call_count); - strcat(*test_descriptor_string, tmp_num); - strcat(*test_descriptor_string, - "#\n" - "\n" -#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSION_MINOR == 5 -#else - "KIM_API_Version := 1.6.0\n\n" -#endif - "# Base units\n"); - switch (lmps_units) - { - case REAL: - strcat(*test_descriptor_string, - "Unit_length := A\n" - "Unit_energy := kcal/mol\n" - "Unit_charge := e\n" - "Unit_temperature := K\n" - "Unit_time := fs\n\n"); - break; - case METAL: - strcat(*test_descriptor_string, - "Unit_length := A\n" - "Unit_energy := eV\n" - "Unit_charge := e\n" - "Unit_temperature := K\n" - "Unit_time := ps\n\n"); - break; - case SI: - strcat(*test_descriptor_string, - "Unit_length := m\n" - "Unit_energy := J\n" - "Unit_charge := C\n" - "Unit_temperature := K\n" - "Unit_time := s\n\n"); - break; - case CGS: - strcat(*test_descriptor_string, - "Unit_length := cm\n" - "Unit_energy := erg\n" - "Unit_charge := statC\n" - "Unit_temperature := K\n" - "Unit_time := s\n\n"); - break; - case ELECTRON: - strcat(*test_descriptor_string, - "Unit_length := Bohr\n" - "Unit_energy := Hartree\n" - "Unit_charge := e\n" - "Unit_temperature := K\n" - "Unit_time := fs\n\n"); - break; - } - - // Write Supported species section - strcat(*test_descriptor_string, - "\n" -#if KIM_API_VERSION_MAJOR == 1 && KIM_API_VERSON_MINOR == 5 - "SUPPORTED_ATOM/PARTICLES_TYPES:\n" -#else - "PARTICLE_SPECIES:\n" -#endif - "# Symbol/name Type code\n"); - int code=1; - char* tmp_line = 0; - tmp_line = new char[100]; - for (int i=0; i < lmps_num_unique_elements; i++){ - sprintf(tmp_line, "%-24s%-16s%-3i\n", lmps_unique_elements[i], - "spec", code++); - strcat(*test_descriptor_string, tmp_line); - } - delete [] tmp_line; - tmp_line = 0; - strcat(*test_descriptor_string, "\n"); - - // Write conventions section - strcat(*test_descriptor_string, - "\n" - "CONVENTIONS:\n" - "# Name Type\n" - "ZeroBasedLists flag\n" - "Neigh_LocaAccess flag\n" - "NEIGH_PURE_F flag\n\n"); - - // Write input section - strcat(*test_descriptor_string, - "\n" - "MODEL_INPUT:\n" - "# Name Type Unit Shape\n" - "numberOfParticles integer none []\n" - "numberOfSpecies integer none []\n" - "particleSpecies integer none " - "[numberOfParticles]\n" - "coordinates double length " - "[numberOfParticles,3]\n" - "neighObject pointer none []\n" - "get_neigh method none []\n"); - - // Write output section - strcat(*test_descriptor_string, - "\n" - "MODEL_OUPUT:\n" - "# Name Type Unit Shape\n" - "compute method none []\n" - "destroy method none []\n" - "cutoff double length []\n"); - if (!kim_model_has_energy) strcat(*test_descriptor_string,"# "); - strcat(*test_descriptor_string, - "energy double energy []\n"); - if (!kim_model_has_forces) strcat(*test_descriptor_string, "# "); - strcat(*test_descriptor_string, - "forces double force " - "[numberOfParticles,3]\n"); - if (!kim_model_has_particleEnergy) strcat(*test_descriptor_string, "# "); - strcat(*test_descriptor_string, - "particleEnergy double energy " - "[numberOfParticles]\n"); - if (no_virial_fdotr_compute != 1) strcat(*test_descriptor_string, "# "); - strcat(*test_descriptor_string, - "virial double energy [6]\n"); - if (!kim_model_has_particleVirial) strcat(*test_descriptor_string, "# "); - strcat(*test_descriptor_string, - "particleVirial double energy " - "[numberOfParticles,6]\n" - "\n"); - strcat(*test_descriptor_string, - "#\n" - "# END OF KIM DESCRIPTOR FILE\n" - "#\n"); + } else { + kim_model_has_particleVirial = true; + } return; } diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 493aa9066a..07790fb44b 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -33,6 +33,7 @@ PairStyle(kim,PairKIM) // includes from KIM & LAMMPS class KIM_API_model; #include "pair.h" +#include "KIM_SimulatorHeaders.hpp" namespace LAMMPS_NS { @@ -61,7 +62,6 @@ namespace LAMMPS_NS { // values set in settings() char* kim_modelname; - bool print_kim_file; // values set in coeff() @@ -79,29 +79,23 @@ namespace LAMMPS_NS { bool lmps_using_molecular; enum unit_sys {REAL, METAL, SI, CGS, ELECTRON}; unit_sys lmps_units; + KIM::LengthUnit lengthUnit; + KIM::EnergyUnit energyUnit; + KIM::ChargeUnit chargeUnit; + KIM::TemperatureUnit temperatureUnit; + KIM::TimeUnit timeUnit; // values set in set_kim_model_has_flags(), called by kim_init() - KIM_API_model* pkim; + KIM::Model * pkim; + KIM::ComputeArguments * pargs; bool kim_model_has_energy; bool kim_model_has_forces; + bool kim_model_has_virial; bool kim_model_has_particleEnergy; bool kim_model_has_particleVirial; // values set in kim_init(), after call to string_init(_) bool kim_init_ok; - int kim_ind_coordinates; - int kim_ind_numberOfParticles; - int kim_ind_numberContributingParticles; - int kim_ind_numberOfSpecies; - int kim_ind_particleSpecies; - int kim_ind_get_neigh; - int kim_ind_neighObject; - int kim_ind_cutoff; - int kim_ind_energy; - int kim_ind_particleEnergy; - int kim_ind_forces; - int kim_ind_virial; - int kim_ind_particleVirial; // values set in init_style(), after calling pkim->model_init() bool kim_model_init_ok; @@ -111,27 +105,31 @@ namespace LAMMPS_NS { // values set in set_statics(), called at end of kim_init(), // then again in set_volatiles(), called in compute() int lmps_local_tot_num_atoms; - double kim_global_cutoff; // KIM Model cutoff value + double kim_global_influence_distance; // KIM Model cutoff value + int kim_number_of_cutoffs; + double const * kim_cutoff_values; // values set in compute() int lmps_maxalloc; // max allocated memory value int* kim_particleSpecies; // array of KIM particle species + int* kim_particleContributing; // array of KIM particle contributing int* lmps_stripped_neigh_list; // neighbors of one atom, used when LAMMPS // is in molecular mode // KIM specific helper functions - void kim_error(int, const char *, int); void kim_init(); void kim_free(); void set_statics(); void set_volatiles(); void set_lmps_flags(); void set_kim_model_has_flags(); - void write_descriptor(char** test_descriptor_string); // static methods used as callbacks from KIM - static int get_neigh(void** kimmdl, int* mode, int* request, - int* atom, int* numnei, int** nei1atom, - double** pRij); + static int get_neigh( + void const * const dataObject, + int const numberOfCutoffs, double const * const cutoffs, + int const neighborListIndex, int const particleNumber, + int * const numberOfNeighbors, + int const ** const neighborsOfParticle); }; } From 906a12353c97a4a7ba47bd97e708109e957fd908 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sun, 24 Jun 2018 08:28:34 -0500 Subject: [PATCH 0007/1242] Fixup neighbor list settings for pair_kim --- src/KIM/pair_kim.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 413c5303e1..34deca3862 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -379,8 +379,7 @@ void PairKIM::init_style() int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->full = 1; - // make sure full lists also include local-ghost pairs - if (lmps_using_newton) neighbor->requests[irequest]->newton = 0; + neighbor->requests[irequest]->ghost = 1; return; } From da9441471a373ca3c7bf1c6d5525a1ce20d01540 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sun, 24 Jun 2018 08:44:28 -0500 Subject: [PATCH 0008/1242] Fixup partialVirial bug in pair_kim --- src/KIM/pair_kim.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 34deca3862..040c90b42b 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -723,11 +723,11 @@ void PairKIM::set_volatiles() if(vflag_atom != 1) { kimerror = kimerror || pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial, - &(vatom[0][0])); + reinterpret_cast(NULL)); } else { kimerror = kimerror || pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial, - reinterpret_cast(NULL)); + &(vatom[0][0])); } } From 8a8b968d55c715f87d7ff57df75796de3ad28251 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sun, 24 Jun 2018 15:23:25 -0500 Subject: [PATCH 0009/1242] Fixup the pressure/virial computation in pair_kim --- src/KIM/pair_kim.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 040c90b42b..d1f5887341 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -735,14 +735,18 @@ void PairKIM::set_volatiles() { if (kim_model_has_virial) { - if (vflag_global == 1) - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::partialVirial, - &(virial[0])); - else + if (vflag_global == 0) + { kimerror = kimerror || pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::partialVirial, reinterpret_cast(NULL)); + } + else + { + kimerror = kimerror || pargs->SetArgumentPointer( + KIM::COMPUTE_ARGUMENT_NAME::partialVirial, + &(virial[0])); + } } } From 5958b24edc01d60b20c26b0e6a3b62a294505f0e Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 27 Jun 2018 11:06:18 -0500 Subject: [PATCH 0010/1242] Adjust some internal pair_kim things --- src/KIM/pair_kim.cpp | 24 ++++++++---------------- src/KIM/pair_kim.h | 23 +++++++++++------------ 2 files changed, 19 insertions(+), 28 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index d1f5887341..3fc94944fc 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -52,11 +52,11 @@ PairKIM::PairKIM(LAMMPS *lmp) : lmps_units(METAL), pkim(0), pargs(0), - kim_particle_codes(0), lmps_local_tot_num_atoms(0), kim_global_influence_distance(0.0), kim_number_of_cutoffs(0), kim_cutoff_values(0), + kim_particle_codes(0), lmps_maxalloc(0), kim_particleSpecies(0), kim_particleContributing(0), @@ -119,6 +119,8 @@ void PairKIM::compute(int eflag , int vflag) else ev_unset(); + // @@@@ can we strip the neighbor list here (like pair_meamc does)? + // grow kim_particleSpecies and kim_particleContributing array if necessary // needs to be atom->nmax in length if (atom->nmax > lmps_maxalloc) { @@ -158,7 +160,7 @@ void PairKIM::compute(int eflag , int vflag) } // pass current atom pointers to KIM - set_volatiles(); + set_argument_pointers(); // compute via KIM model kimerror = pkim->Compute(pargs); @@ -656,16 +658,6 @@ void PairKIM::kim_init() error->all(FLERR,"create_kim_particle_codes: symbol not found "); } - // set pointer values in KIM API object that will not change during run - set_statics(); - - return; -} - -/* ---------------------------------------------------------------------- */ - -void PairKIM::set_statics() -{ // set total number of atoms lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); @@ -673,7 +665,7 @@ void PairKIM::set_statics() pkim->GetNeighborListCutoffsPointer(&kim_number_of_cutoffs, &kim_cutoff_values); - int kimerror = pargs->SetArgumentPointer( + kimerror = pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::numberOfParticles, &lmps_local_tot_num_atoms); if (kim_model_has_energy) @@ -688,14 +680,14 @@ void PairKIM::set_statics() reinterpret_cast(this)); if (kimerror) - error->all(FLERR,"Unable to register KIM static pointers"); + error->all(FLERR,"Unable to register KIM pointers"); return; } /* ---------------------------------------------------------------------- */ -void PairKIM::set_volatiles() +void PairKIM::set_argument_pointers() { int kimerror; lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); @@ -752,7 +744,7 @@ void PairKIM::set_volatiles() if (kimerror) { - error->all(FLERR,"Unable to set KIM volatile pointers"); + error->all(FLERR,"Unable to set KIM argument pointers"); } return; diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 07790fb44b..37807ebfbc 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -48,6 +48,7 @@ namespace LAMMPS_NS { virtual void settings(int, char**); virtual void coeff(int, char**); virtual void init_style(); + //virtual void init_list(int id, NeighList *ptr); virtual double init_one(int, int); virtual int pack_reverse_comm(int, int, double*); virtual void unpack_reverse_comm(int, int*, double*); @@ -85,30 +86,29 @@ namespace LAMMPS_NS { KIM::TemperatureUnit temperatureUnit; KIM::TimeUnit timeUnit; - // values set in set_kim_model_has_flags(), called by kim_init() + KIM::Model * pkim; KIM::ComputeArguments * pargs; + + // values set in set_kim_model_has_flags(), called by kim_init() bool kim_model_has_energy; bool kim_model_has_forces; bool kim_model_has_virial; bool kim_model_has_particleEnergy; bool kim_model_has_particleVirial; - // values set in kim_init(), after call to string_init(_) + // values set in kim_init() bool kim_init_ok; - - // values set in init_style(), after calling pkim->model_init() - bool kim_model_init_ok; - bool kim_particle_codes_ok; - int *kim_particle_codes; - - // values set in set_statics(), called at end of kim_init(), - // then again in set_volatiles(), called in compute() int lmps_local_tot_num_atoms; double kim_global_influence_distance; // KIM Model cutoff value int kim_number_of_cutoffs; double const * kim_cutoff_values; + // values set in init_style() + bool kim_model_init_ok; + bool kim_particle_codes_ok; + int *kim_particle_codes; + // values set in compute() int lmps_maxalloc; // max allocated memory value int* kim_particleSpecies; // array of KIM particle species @@ -119,8 +119,7 @@ namespace LAMMPS_NS { // KIM specific helper functions void kim_init(); void kim_free(); - void set_statics(); - void set_volatiles(); + void set_argument_pointers(); void set_lmps_flags(); void set_kim_model_has_flags(); // static methods used as callbacks from KIM From cb077829356450d8a64161c67428adc3110b4d6a Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 27 Jun 2018 12:46:13 -0500 Subject: [PATCH 0011/1242] Multiple neig lists working in pair_kim --- src/KIM/pair_kim.cpp | 57 ++++++++++++++++++++++++++++++++------------ src/KIM/pair_kim.h | 3 ++- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 3fc94944fc..afc4a89675 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -56,6 +56,7 @@ PairKIM::PairKIM(LAMMPS *lmp) : kim_global_influence_distance(0.0), kim_number_of_cutoffs(0), kim_cutoff_values(0), + neighborLists(0), kim_particle_codes(0), lmps_maxalloc(0), kim_particleSpecies(0), @@ -102,6 +103,13 @@ PairKIM::~PairKIM() delete [] lmps_map_species_to_unique; } + // clean up neighborlist pointers + if (neighborLists) + { + delete [] neighborLists; + neighborLists = 0; + } + // clean up KIM interface (if necessary) kim_free(); @@ -378,14 +386,30 @@ void PairKIM::init_style() if (!lmps_using_newton) comm_reverse_off = 9; // request full neighbor list - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - neighbor->requests[irequest]->ghost = 1; + for (int i = 0; i < kim_number_of_cutoffs; ++i) + { + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->id = i; + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + neighbor->requests[irequest]->ghost = 1; + neighbor->requests[irequest]->cut = 1; + neighbor->requests[irequest]->cutoff = kim_cutoff_values[i]; + } return; } +/* ---------------------------------------------------------------------- + neighbor callback to inform pair style of neighbor list to use + half or full +------------------------------------------------------------------------- */ + +void PairKIM::init_list(int id, NeighList *ptr) +{ + neighborLists[id] = ptr; +} + /* ---------------------------------------------------------------------- init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ @@ -525,7 +549,7 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) double PairKIM::memory_usage() { - double bytes = lmps_maxalloc * sizeof(int); + double bytes = 2 * lmps_maxalloc * sizeof(int); return bytes; } @@ -542,21 +566,18 @@ int PairKIM::get_neigh(void const * const dataObject, PairKIM const * const Model = reinterpret_cast(dataObject); - if ((numberOfCutoffs != 1) || (cutoffs[0] > Model->kim_cutoff_values[0])) - return true; + if (numberOfCutoffs != Model->kim_number_of_cutoffs) return true; + for (int i = 0; i < numberOfCutoffs; ++i) + { + if (Model->kim_cutoff_values[i] < cutoffs[i]) return true; + } - if (neighborListIndex != 0) return true; + // neighborListIndex and particleNumber are validated by KIM API // initialize numNeigh *numberOfNeighbors = 0; - if ((particleNumber >= Model->lmps_local_tot_num_atoms) || - (particleNumber < 0)) /* invalid id */ - { - return true; - } - - NeighList * neiobj = Model->list; + NeighList * neiobj = Model->neighborLists[neighborListIndex]; int nAtoms = Model->lmps_local_tot_num_atoms; int j, jj, inum, *ilist, *numneigh, **firstneigh; @@ -664,6 +685,12 @@ void PairKIM::kim_init() pkim->GetInfluenceDistance(&kim_global_influence_distance); pkim->GetNeighborListCutoffsPointer(&kim_number_of_cutoffs, &kim_cutoff_values); + if (neighborLists) + { + delete [] neighborLists; + neighborLists = 0; + } + neighborLists = new NeighList*[kim_number_of_cutoffs]; kimerror = pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::numberOfParticles, diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 37807ebfbc..4542b656b7 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -48,7 +48,7 @@ namespace LAMMPS_NS { virtual void settings(int, char**); virtual void coeff(int, char**); virtual void init_style(); - //virtual void init_list(int id, NeighList *ptr); + virtual void init_list(int id, NeighList *ptr); virtual double init_one(int, int); virtual int pack_reverse_comm(int, int, double*); virtual void unpack_reverse_comm(int, int*, double*); @@ -103,6 +103,7 @@ namespace LAMMPS_NS { double kim_global_influence_distance; // KIM Model cutoff value int kim_number_of_cutoffs; double const * kim_cutoff_values; + class NeighList ** neighborLists; // values set in init_style() bool kim_model_init_ok; From f1f140dd5f9bfe9bed2dcb42fb5dce990ea445b9 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 27 Jun 2018 15:13:48 -0500 Subject: [PATCH 0012/1242] remove unnecessary code in pair_kim.cpp --- src/KIM/pair_kim.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index afc4a89675..658e8cb483 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -679,9 +679,6 @@ void PairKIM::kim_init() error->all(FLERR,"create_kim_particle_codes: symbol not found "); } - // set total number of atoms - lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); - pkim->GetInfluenceDistance(&kim_global_influence_distance); pkim->GetNeighborListCutoffsPointer(&kim_number_of_cutoffs, &kim_cutoff_values); From a7e3ccd8c4e039baf9060ebecf512a29bb35e0b8 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 27 Jun 2018 15:50:50 -0500 Subject: [PATCH 0013/1242] Finish off multi-neighbor list support for pair_kim --- src/KIM/pair_kim.cpp | 39 ++++++++++++++++++++++++++++----------- src/KIM/pair_kim.h | 1 + 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 658e8cb483..e41cc94ea0 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -61,6 +61,7 @@ PairKIM::PairKIM(LAMMPS *lmp) : lmps_maxalloc(0), kim_particleSpecies(0), kim_particleContributing(0), + lmps_stripped_neigh_ptr(0), lmps_stripped_neigh_list(0) { // Initialize Pair data members to appropriate values @@ -94,6 +95,12 @@ PairKIM::~PairKIM() memory->destroy(kim_particleSpecies); memory->destroy(kim_particleContributing); memory->destroy(lmps_stripped_neigh_list); + // clean up lmps_stripped_neigh_ptr + if (lmps_stripped_neigh_ptr) + { + delete [] lmps_stripped_neigh_ptr; + lmps_stripped_neigh_ptr = 0; + } // clean up allocated memory for standard Pair class usage // also, we allocate lmps_map_species_to_uniuqe in the allocate() function @@ -241,10 +248,11 @@ void PairKIM::settings(int narg, char **arg) ++settings_call_count; init_style_call_count = 0; - if (narg < 2) error->all(FLERR,"Illegal pair_style command"); + if (narg != 2) error->all(FLERR,"Illegal pair_style command"); // arg[0] is the virial handling option: "LAMMPSvirial" or "KIMvirial" // arg[1] is the KIM Model name - // arg[2] is the print-kim-file flag: 0/1 do-not/do print (default 0) + + lmps_using_molecular = (atom->molecular > 0); // ensure we are in a clean state for KIM (needed on repeated call) // first time called will do nothing... @@ -382,6 +390,22 @@ void PairKIM::init_style() kim_init(); } + // setup lmps_stripped_neigh_list for neighbors of one atom, if needed + if (lmps_using_molecular) { + memory->destroy(lmps_stripped_neigh_list); + memory->create(lmps_stripped_neigh_list, + kim_number_of_cutoffs*neighbor->oneatom, + "pair:lmps_stripped_neigh_list"); + delete [] lmps_stripped_neigh_ptr; + lmps_stripped_neigh_ptr = new int*[kim_number_of_cutoffs]; + for (int i = 0; i < kim_number_of_cutoffs; ++i) + { + lmps_stripped_neigh_ptr[0] + = &(lmps_stripped_neigh_list[(i-1)*(neighbor->oneatom)]); + } + + } + // make sure comm_reverse expects (at most) 9 values when newton is off if (!lmps_using_newton) comm_reverse_off = 9; @@ -595,7 +619,8 @@ int PairKIM::get_neigh(void const * const dataObject, { int n = *numberOfNeighbors; int *ptr = firstneigh[particleNumber]; - int *lmps_stripped_neigh_list = Model->lmps_stripped_neigh_list; + int *lmps_stripped_neigh_list + = Model->lmps_stripped_neigh_ptr[neighborListIndex]; for (int i = 0; i < n; i++) lmps_stripped_neigh_list[i] = *(ptr++) & NEIGHMASK; *neighborsOfParticle = lmps_stripped_neigh_list; @@ -781,14 +806,6 @@ void PairKIM::set_lmps_flags() // determint if newton is on or off lmps_using_newton = (force->newton_pair == 1); - // setup lmps_stripped_neigh_list for neighbors of one atom, if needed - lmps_using_molecular = (atom->molecular > 0); - if (lmps_using_molecular) { - memory->destroy(lmps_stripped_neigh_list); - memory->create(lmps_stripped_neigh_list,neighbor->oneatom, - "pair:lmps_stripped_neigh_list"); - } - // determine if running with pair hybrid if (force->pair_match("hybrid",0)) { diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 4542b656b7..a22bf1492f 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -116,6 +116,7 @@ namespace LAMMPS_NS { int* kim_particleContributing; // array of KIM particle contributing int* lmps_stripped_neigh_list; // neighbors of one atom, used when LAMMPS // is in molecular mode + int** lmps_stripped_neigh_ptr; // pointer into lists // KIM specific helper functions void kim_init(); From 199a01714864964e317208b90dcfb9c433182351 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Thu, 28 Jun 2018 09:32:28 -0500 Subject: [PATCH 0014/1242] Some cleanup in pair_kim --- src/KIM/pair_kim.cpp | 20 +++++++++++--------- src/KIM/pair_kim.h | 1 - 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index e41cc94ea0..2785d5793a 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -50,6 +50,11 @@ PairKIM::PairKIM(LAMMPS *lmp) : lmps_unique_elements(0), lmps_num_unique_elements(0), lmps_units(METAL), + lengthUnit(KIM::LENGTH_UNIT::unused), + energyUnit(KIM::ENERGY_UNIT::unused), + chargeUnit(KIM::CHARGE_UNIT::unused), + temperatureUnit(KIM::TEMPERATURE_UNIT::unused), + timeUnit(KIM::TIME_UNIT::unused), pkim(0), pargs(0), lmps_local_tot_num_atoms(0), @@ -61,8 +66,8 @@ PairKIM::PairKIM(LAMMPS *lmp) : lmps_maxalloc(0), kim_particleSpecies(0), kim_particleContributing(0), - lmps_stripped_neigh_ptr(0), - lmps_stripped_neigh_list(0) + lmps_stripped_neigh_list(0), + lmps_stripped_neigh_ptr(0) { // Initialize Pair data members to appropriate values single_enable = 0; // We do not provide the Single() function @@ -134,8 +139,6 @@ void PairKIM::compute(int eflag , int vflag) else ev_unset(); - // @@@@ can we strip the neighbor list here (like pair_meamc does)? - // grow kim_particleSpecies and kim_particleContributing array if necessary // needs to be atom->nmax in length if (atom->nmax > lmps_maxalloc) { @@ -160,7 +163,6 @@ void PairKIM::compute(int eflag , int vflag) } // kim_particleSpecies = KIM atom species for each LAMMPS atom - // set ielement to valid 0 if lmps_map_species_to_unique[] stores an un-used -1 int *species = atom->type; int nall = atom->nlocal + atom->nghost; @@ -168,7 +170,6 @@ void PairKIM::compute(int eflag , int vflag) for (int i = 0; i < nall; i++) { ielement = lmps_map_species_to_unique[species[i]]; - ielement = MAX(ielement,0); kim_particleSpecies[i] = kim_particle_codes[ielement]; kim_particleContributing[i] = ( (inlocal) ? 1 : 0 ); @@ -177,6 +178,9 @@ void PairKIM::compute(int eflag , int vflag) // pass current atom pointers to KIM set_argument_pointers(); + // set number of particles + lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); + // compute via KIM model kimerror = pkim->Compute(pargs); if (kimerror) error->all(FLERR,"KIM Compute returned error"); @@ -409,7 +413,7 @@ void PairKIM::init_style() // make sure comm_reverse expects (at most) 9 values when newton is off if (!lmps_using_newton) comm_reverse_off = 9; - // request full neighbor list + // request full neighbor lists for (int i = 0; i < kim_number_of_cutoffs; ++i) { int irequest = neighbor->request(this,instance_me); @@ -739,8 +743,6 @@ void PairKIM::kim_init() void PairKIM::set_argument_pointers() { int kimerror; - lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); - kimerror = pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::coordinates, &(atom->x[0][0])); diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index a22bf1492f..0c017e75ed 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -86,7 +86,6 @@ namespace LAMMPS_NS { KIM::TemperatureUnit temperatureUnit; KIM::TimeUnit timeUnit; - KIM::Model * pkim; KIM::ComputeArguments * pargs; From cb21051eb82f8f1e7337827bfbff1df2a9e0055a Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Thu, 28 Jun 2018 19:59:39 -0500 Subject: [PATCH 0015/1242] Update KIM Model matching code in pair_kim.cpp --- src/KIM/pair_kim.cpp | 331 +++++++++++++++++++++++++------------------ src/KIM/pair_kim.h | 11 +- 2 files changed, 195 insertions(+), 147 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 2785d5793a..5f123de45d 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -57,6 +57,11 @@ PairKIM::PairKIM(LAMMPS *lmp) : timeUnit(KIM::TIME_UNIT::unused), pkim(0), pargs(0), + kim_model_support_for_energy(KIM::SUPPORT_STATUS::notSupported), + kim_model_support_for_forces(KIM::SUPPORT_STATUS::notSupported), + kim_model_support_for_virial(KIM::SUPPORT_STATUS::notSupported), + kim_model_support_for_particleEnergy(KIM::SUPPORT_STATUS::notSupported), + kim_model_support_for_particleVirial(KIM::SUPPORT_STATUS::notSupported), lmps_local_tot_num_atoms(0), kim_global_influence_distance(0.0), kim_number_of_cutoffs(0), @@ -76,8 +81,8 @@ PairKIM::PairKIM(LAMMPS *lmp) : // BEGIN: initial values that determine the KIM state // (used by kim_free(), etc.) - kim_model_init_ok = false; kim_init_ok = false; + kim_particle_codes_ok = false; // END return; @@ -201,7 +206,9 @@ void PairKIM::compute(int eflag , int vflag) if (vflag_fdotr) virial_fdotr_compute(); } - if ((kim_model_has_particleVirial) && (vflag_atom)) + if ((kim_model_support_for_particleVirial != + KIM::SUPPORT_STATUS::notSupported) && + (vflag_atom)) { // flip sign and order of virial if KIM is computing it double tmp; for (int i = 0; i < nall; ++i) @@ -456,14 +463,17 @@ double PairKIM::init_one(int i, int j) int PairKIM::pack_reverse_comm(int n, int first, double *buf) { + using namespace KIM::SUPPORT_STATUS; + int i,m,last; double *fp; fp = &(atom->f[0][0]); m = 0; last = first + n; - if ((kim_model_has_forces) && ((vflag_atom == 0) || - (!kim_model_has_particleVirial))) + if ((kim_model_support_for_forces != notSupported) && + ((vflag_atom == 0) || + (kim_model_support_for_particleVirial == notSupported))) { for (i = first; i < last; i++) { @@ -473,8 +483,9 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) } return m; } - else if ((kim_model_has_forces) && (vflag_atom == 1) && - (kim_model_has_particleVirial)) + else if ((kim_model_support_for_forces != notSupported) && + (vflag_atom == 1) && + (kim_model_support_for_particleVirial != notSupported)) { double *va=&(vatom[0][0]); for (i = first; i < last; i++) @@ -492,8 +503,9 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) } return m; } - else if ((!kim_model_has_forces) && (vflag_atom == 1) && - (kim_model_has_particleVirial)) + else if ((kim_model_support_for_forces == notSupported) && + (vflag_atom == 1) && + (kim_model_support_for_particleVirial != notSupported)) { double *va=&(vatom[0][0]); for (i = first; i < last; i++) @@ -515,13 +527,16 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) { + using namespace KIM::SUPPORT_STATUS; + int i,j,m; double *fp; fp = &(atom->f[0][0]); m = 0; - if ((kim_model_has_forces) && ((vflag_atom == 0) || - (!kim_model_has_particleVirial))) + if ((kim_model_support_for_forces != notSupported) && + ((vflag_atom == 0) || + (kim_model_support_for_particleVirial == notSupported))) { for (i = 0; i < n; i++) { @@ -531,8 +546,9 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) fp[3*j+2]+= buf[m++]; } } - else if ((kim_model_has_forces) && (vflag_atom == 1) && - (kim_model_has_particleVirial)) + else if ((kim_model_support_for_forces != notSupported) && + (vflag_atom == 1) && + (kim_model_support_for_particleVirial != notSupported)) { double *va=&(vatom[0][0]); for (i = 0; i < n; i++) @@ -550,8 +566,9 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) va[j*6+5]+=buf[m++]; } } - else if ((!kim_model_has_forces) && (vflag_atom == 1) && - (kim_model_has_particleVirial)) + else if ((kim_model_support_for_forces == notSupported) && + (vflag_atom == 1) && + (kim_model_support_for_particleVirial != notSupported)) { double *va=&(vatom[0][0]); for (i = 0; i < n; i++) @@ -638,14 +655,13 @@ void PairKIM::kim_free() { int kimerror; - if (kim_model_init_ok) + if (kim_init_ok) { int kimerror = pkim->ComputeArgumentsDestroy(&pargs); if (kimerror) error->all(FLERR,"Unable to destroy Compute Arguments Object"); KIM::Model::Destroy(&pkim); - kim_model_init_ok = false; } kim_init_ok = false; @@ -683,9 +699,14 @@ void PairKIM::kim_init() kimerror = pkim->ComputeArgumentsCreate(&pargs); if (kimerror) + { + KIM::Model::Destroy(&pkim); error->all(FLERR,"KIM ComputeArgumentsCreate failed"); + } else + { kim_init_ok = true; + } } // determine KIM Model capabilities (used in this function below) @@ -721,7 +742,7 @@ void PairKIM::kim_init() kimerror = pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::numberOfParticles, &lmps_local_tot_num_atoms); - if (kim_model_has_energy) + if (kim_model_support_for_energy != KIM::SUPPORT_STATUS::notSupported) kimerror = kimerror || pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::partialEnergy, &(eng_vdwl)); @@ -742,63 +763,98 @@ void PairKIM::kim_init() void PairKIM::set_argument_pointers() { - int kimerror; - kimerror = pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::coordinates, - &(atom->x[0][0])); + using namespace KIM::COMPUTE_ARGUMENT_NAME; + using namespace KIM::SUPPORT_STATUS; - if (kim_model_has_particleEnergy && (eflag_atom == 1)) - { - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::partialParticleEnergy, - eatom); - } + int kimerror; + kimerror = pargs->SetArgumentPointer(coordinates, &(atom->x[0][0])); - if (kim_model_has_forces) - { - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::partialForces, - &(atom->f[0][0])); - } + // Set KIM pointer appropriately for particalEnergy + if ((kim_model_support_for_particleEnergy == required) && (eflag_atom != 1)) + { + // reallocate per-atom energy array if necessary + if (atom->nmax > maxeatom) + { + maxeatom = atom->nmax; + memory->destroy(eatom); + memory->create(eatom,comm->nthreads*maxeatom,"pair:eatom"); + } + } + if ((kim_model_support_for_particleEnergy == optional) && (eflag_atom != 1)) + { + kimerror = kimerror || pargs->SetArgumentPointer( + partialParticleEnergy, + reinterpret_cast(NULL)); + } + else if (kim_model_support_for_particleEnergy != notSupported) + { + kimerror = kimerror || pargs->SetArgumentPointer(partialParticleEnergy, + eatom); + } - if (kim_model_has_particleVirial) - { - if(vflag_atom != 1) { - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial, - reinterpret_cast(NULL)); - } else { - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial, - &(vatom[0][0])); - } - } + // Set KIM pointer appropriately for forces + if (kim_model_support_for_forces == notSupported) + { + kimerror = kimerror || pargs->SetArgumentPointer( + partialForces, + reinterpret_cast(NULL)); + } + else + { + kimerror = kimerror || pargs->SetArgumentPointer(partialForces, + &(atom->f[0][0])); + } - if (no_virial_fdotr_compute == 1) - { - if (kim_model_has_virial) - { - if (vflag_global == 0) - { - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::partialVirial, - reinterpret_cast(NULL)); - } - else - { - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::partialVirial, - &(virial[0])); - } - } - } + // Set KIM pointer appropriately for particleVirial + if ((kim_model_support_for_particleVirial == required) && (vflag_atom != 1)) + { + // reallocate per-atom virial array if necessary + if (atom->nmax > maxeatom) + { + maxvatom = atom->nmax; + memory->destroy(vatom); + memory->create(vatom,comm->nthreads*maxvatom,6,"pair:vatom"); + } + } + if ((kim_model_support_for_particleVirial == optional) && (vflag_atom != 1)) + { + kimerror = kimerror || pargs->SetArgumentPointer( + partialParticleVirial, + reinterpret_cast(NULL)); + } + else if (kim_model_support_for_particleVirial != notSupported) + { + kimerror = kimerror || pargs->SetArgumentPointer(partialParticleEnergy, + &(vatom[0][0])); + } - if (kimerror) - { - error->all(FLERR,"Unable to set KIM argument pointers"); - } + // Set KIM pointer appropriately for virial - return; + if (kim_model_support_for_virial == required) + { + kimerror = kimerror || pargs->SetArgumentPointer(partialVirial, + &(virial[0])); + } + else if ((kim_model_support_for_virial == optional) && + (no_virial_fdotr_compute == 1) && + (vflag_global)) + { + kimerror = kimerror || pargs->SetArgumentPointer(partialVirial, + &(virial[0])); + } + else if (kim_model_support_for_virial == optional) + { + kimerror = kimerror || pargs->SetArgumentPointer( + partialVirial, + reinterpret_cast(NULL)); + } + + if (kimerror) + { + error->all(FLERR,"Unable to set KIM argument pointers"); + } + + return; } /* ---------------------------------------------------------------------- */ @@ -863,85 +919,78 @@ void PairKIM::set_lmps_flags() void PairKIM::set_kim_model_has_flags() { - // @@ the procedure below should be improved to be more comprehensive - // @@ and ensure that there are no additions/changes to the kim-api - // @@ that could cause a problem. This should be done using the - // @@ "discoverability" features of the kim-api - int kimerror; - KIM::SupportStatus supportStatus; + { // BEGIN enclosing scope for using directives + using namespace KIM::COMPUTE_ARGUMENT_NAME; + using namespace KIM::SUPPORT_STATUS; - // determine if the KIM Model can compute the total partialEnergy + int numberOfComputeArgumentNames; + GetNumberOfComputeArgumentNames(&numberOfComputeArgumentNames); + for (int i = 0; i < numberOfComputeArgumentNames; ++i) + { + KIM::ComputeArgumentName computeArgumentName; + int kimerror = GetComputeArgumentName(i, &computeArgumentName); + KIM::SupportStatus supportStatus; + kimerror = pargs->GetArgumentSupportStatus(computeArgumentName, + &supportStatus); - // determine if the KIM Model can compute the energy - kimerror = pargs->GetArgumentSupportStatus( - KIM::COMPUTE_ARGUMENT_NAME::partialEnergy, - &supportStatus); - if (kimerror) - error->all(FLERR,"Unable to get KIM Support Status"); - if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { - kim_model_has_energy = false; - error->warning(FLERR,"KIM Model does not provide `partialEnergy'; " - "Potential energy will be zero"); - } else { - kim_model_has_energy = true; - } + if (computeArgumentName == partialEnergy) + kim_model_support_for_energy = supportStatus; + else if (computeArgumentName == partialForces) + kim_model_support_for_forces = supportStatus; + else if (computeArgumentName == partialVirial) + kim_model_support_for_virial = supportStatus; + else if (computeArgumentName == partialParticleEnergy) + kim_model_support_for_particleEnergy = supportStatus; + else if (computeArgumentName == partialParticleVirial) + kim_model_support_for_particleVirial = supportStatus; + else if (supportStatus == required) + { + error->all(FLERR,"KIM Model requires unsupported compute argument"); + } + } - // determine if the KIM Model can compute the partialForces - kimerror = pargs->GetArgumentSupportStatus( - KIM::COMPUTE_ARGUMENT_NAME::partialForces, - &supportStatus); - if (kimerror) - error->all(FLERR,"Unable to get KIM Support Status"); - if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { - kim_model_has_forces = false; - error->warning(FLERR,"KIM Model does not provide `partialForce'; " - "Forces will be zero"); - } else { - kim_model_has_forces = true; - } + if (kim_model_support_for_energy == notSupported) + error->warning(FLERR,"KIM Model does not provide `partialEnergy'; " + "Potential energy will be zero"); - // determine if the KIM Model can compute the partialVirial - kimerror = pargs->GetArgumentSupportStatus( - KIM::COMPUTE_ARGUMENT_NAME::partialVirial, - &supportStatus); - if (kimerror) - error->all(FLERR,"Unable to get KIM Support Status"); - if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { - kim_model_has_virial = false; - error->warning(FLERR,"KIM Model does not provide `partialVirial'. " - "pair_kim now using `LAMMPSvirial' option."); - no_virial_fdotr_compute = 0; - } else { - kim_model_has_virial = true; - } + if (kim_model_support_for_forces == notSupported) + error->warning(FLERR,"KIM Model does not provide `partialForce'; " + "Forces will be zero"); - // determine if the KIM Model can compute the partialParticleEnergy - kimerror = pargs->GetArgumentSupportStatus( - KIM::COMPUTE_ARGUMENT_NAME::partialParticleEnergy, - &supportStatus); - if (kimerror) - error->all(FLERR,"Unable to get KIM Support Status"); - if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { - kim_model_has_particleEnergy = false; - error->warning(FLERR,"KIM Model does not provide `partialParticleEnergy'; " - "energy per atom will be zero"); - } else { - kim_model_has_particleEnergy = true; - } + if (kim_model_support_for_virial == notSupported) + error->warning(FLERR,"KIM Model does not provide `partialVirial'. " + "pair_kim now using `LAMMPSvirial' option."); - // determine if the KIM Model can compute the partialParticleVirial - kimerror = pargs->GetArgumentSupportStatus( - KIM::COMPUTE_ARGUMENT_NAME::partialParticleVirial, - &supportStatus); - if (kimerror) - error->all(FLERR,"Unable to get KIM Support Status"); - if (KIM::SUPPORT_STATUS::notSupported == supportStatus) { - kim_model_has_particleVirial = false; - error->warning(FLERR,"KIM Model does not provide `partialParticleVirial'; " - "virial per atom will be zero"); - } else { - kim_model_has_particleVirial = true; - } + if (kim_model_support_for_particleEnergy == notSupported) + error->warning(FLERR,"KIM Model does not provide `partialParticleEnergy'; " + "energy per atom will be zero"); + + if (kim_model_support_for_particleVirial == notSupported) + error->warning(FLERR,"KIM Model does not provide `partialParticleVirial'; " + "virial per atom will be zero"); + } // END enclosing scope for using directives + + + { // BEGIN enclosing scope for using directives + using namespace KIM::COMPUTE_CALLBACK_NAME; + using namespace KIM::SUPPORT_STATUS; + + int numberOfComputeCallbackNames; + GetNumberOfComputeCallbackNames(&numberOfComputeCallbackNames); + for (int i = 0; i < numberOfComputeCallbackNames; ++i) + { + KIM::ComputeCallbackName computeCallbackName; + int kimerror = GetComputeCallbackName(i, &computeCallbackName); + KIM::SupportStatus supportStatus; + kimerror = pargs->GetCallbackSupportStatus(computeCallbackName, + &supportStatus); + + if (supportStatus == required) + { + error->all(FLERR,"KIM Model requires unsupported compute callback"); + } + } + } // END enclosing scope for using directives return; } diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 0c017e75ed..a236a3f87a 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -90,11 +90,11 @@ namespace LAMMPS_NS { KIM::ComputeArguments * pargs; // values set in set_kim_model_has_flags(), called by kim_init() - bool kim_model_has_energy; - bool kim_model_has_forces; - bool kim_model_has_virial; - bool kim_model_has_particleEnergy; - bool kim_model_has_particleVirial; + KIM::SupportStatus kim_model_support_for_energy; + KIM::SupportStatus kim_model_support_for_forces; + KIM::SupportStatus kim_model_support_for_virial; + KIM::SupportStatus kim_model_support_for_particleEnergy; + KIM::SupportStatus kim_model_support_for_particleVirial; // values set in kim_init() bool kim_init_ok; @@ -105,7 +105,6 @@ namespace LAMMPS_NS { class NeighList ** neighborLists; // values set in init_style() - bool kim_model_init_ok; bool kim_particle_codes_ok; int *kim_particle_codes; From 955fe583d8e24ae4e054b74410e60db256ac0f60 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Fri, 29 Jun 2018 10:53:19 -0500 Subject: [PATCH 0016/1242] Updated docs for new pair_kim --- cmake/CMakeLists.txt | 20 +++++++++---------- cmake/Modules/FindKIM.cmake | 4 ++-- doc/src/Section_packages.txt | 37 ++++++++++++++++++------------------ doc/src/fix_adapt.txt | 9 +-------- doc/src/pair_kim.txt | 22 +++++---------------- examples/kim/in.kim.lj | 10 +++++----- examples/kim/in.kim.lj.lmp | 10 +++++----- lib/kim/Install.py | 8 ++++---- lib/kim/README | 4 ++-- src/KIM/README | 3 +-- 10 files changed, 53 insertions(+), 74 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index bf57398c71..4672b4a3db 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -309,7 +309,7 @@ if(PKG_VORONOI) ExternalProject_Add(voro_build URL http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz URL_MD5 2338b824c3b7b25590e18e8df5d68af9 - CONFIGURE_COMMAND "" BUILD_IN_SOURCE 1 INSTALL_COMMAND "" + CONFIGURE_COMMAND "" BUILD_IN_SOURCE 1 INSTALL_COMMAND "" ) ExternalProject_get_property(voro_build SOURCE_DIR) set(VORO_LIBRARIES ${SOURCE_DIR}/src/libvoro++.a) @@ -367,7 +367,7 @@ if(PKG_USER-SMD) if(DOWNLOAD_Eigen3) include(ExternalProject) ExternalProject_Add(Eigen3_build - URL http://bitbucket.org/eigen/eigen/get/3.3.4.tar.gz + URL http://bitbucket.org/eigen/eigen/get/3.3.4.tar.gz URL_MD5 1a47e78efe365a97de0c022d127607c3 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" ) @@ -407,14 +407,14 @@ if(PKG_KIM) if(DOWNLOAD_KIM) include(ExternalProject) ExternalProject_Add(kim_build - URL https://github.com/openkim/kim-api/archive/v1.9.5.tar.gz - URL_MD5 9f66efc128da33039e30659f36fc6d00 + URL https://github.com/openkim/kim-api/archive/v2.0.0-beta.0.tar.gz + URL_MD5 2c099fe2603fda9a6904fc50d626f71b BUILD_IN_SOURCE 1 CONFIGURE_COMMAND /configure --prefix= ) ExternalProject_get_property(kim_build INSTALL_DIR) - set(KIM_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api-v1) - set(KIM_LIBRARIES ${INSTALL_DIR}/lib/libkim-api-v1.so) + set(KIM_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api-v2) + set(KIM_LIBRARIES ${INSTALL_DIR}/lib/libkim-api-v2.so) list(APPEND LAMMPS_DEPS kim_build) else() find_package(KIM) @@ -706,7 +706,7 @@ if(PKG_USER-INTEL) endif() if(PKG_GPU) - if (CMAKE_VERSION VERSION_LESS "3.1") + if (CMAKE_VERSION VERSION_LESS "3.1") message(FATAL_ERROR "For the GPU package you need at least cmake-3.1") endif() set(GPU_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/GPU) @@ -892,7 +892,7 @@ if(BUILD_EXE) add_dependencies(lmp ${LAMMPS_DEPS}) endif() endif() - + set_target_properties(lmp PROPERTIES OUTPUT_NAME lmp${LAMMPS_MACHINE}) install(TARGETS lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) if(ENABLE_TESTING) @@ -954,14 +954,14 @@ message(STATUS "<<< Build configuration >>> get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) list (FIND LANGUAGES "Fortran" _index) if (${_index} GREATER -1) - message(STATUS "Fortran Compiler ${CMAKE_Fortran_COMPILER} + message(STATUS "Fortran Compiler ${CMAKE_Fortran_COMPILER} Type ${CMAKE_Fortran_COMPILER_ID} Version ${CMAKE_Fortran_COMPILER_VERSION} Fortran Flags ${CMAKE_Fortran_FLAGS} ${CMAKE_Fortran_FLAGS_${BTYPE}}") endif() list (FIND LANGUAGES "C" _index) if (${_index} GREATER -1) - message(STATUS "C Compiler ${CMAKE_C_COMPILER} + message(STATUS "C Compiler ${CMAKE_C_COMPILER} Type ${CMAKE_C_COMPILER_ID} Version ${CMAKE_C_COMPILER_VERSION} C Flags ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BTYPE}}") diff --git a/cmake/Modules/FindKIM.cmake b/cmake/Modules/FindKIM.cmake index a01f817cf6..e29f26e01d 100644 --- a/cmake/Modules/FindKIM.cmake +++ b/cmake/Modules/FindKIM.cmake @@ -6,9 +6,9 @@ # KIM_FOUND - True if kim found. # -find_path(KIM_INCLUDE_DIR KIM_API.h PATH_SUFFIXES kim-api-v1) +find_path(KIM_INCLUDE_DIR KIM_SimulatorHeaders.hpp PATH_SUFFIXES kim-api-v2) -find_library(KIM_LIBRARY NAMES kim-api-v1) +find_library(KIM_LIBRARY NAMES kim-api-v2) set(KIM_LIBRARIES ${KIM_LIBRARY}) set(KIM_INCLUDE_DIRS ${KIM_INCLUDE_DIR}) diff --git a/doc/src/Section_packages.txt b/doc/src/Section_packages.txt index 218866e271..839a02b4b6 100644 --- a/doc/src/Section_packages.txt +++ b/doc/src/Section_packages.txt @@ -516,8 +516,7 @@ Elliott (U Minnesota) and James Sethna (Cornell U). [Authors:] Ryan Elliott (U Minnesota) is the main developer for the KIM API which the "pair_style kim"_pair_kim.html command uses. He -developed the pair style in collaboration with Valeriu Smirichinski (U -Minnesota). +developed the pair style. [Install or un-install:] @@ -530,11 +529,11 @@ lib/kim/Install.py script with the specified args. make lib-kim # print help message make lib-kim args="-b " # (re-)install KIM API lib with only example models -make lib-kim args="-b -a Glue_Ercolessi_Adams_Al__MO_324507536345_001" # ditto plus one model +make lib-kim args="-b -a Glue_Ercolessi_Adams_Al__MO_324507536345_002" # ditto plus one model make lib-kim args="-b -a everything" # install KIM API lib with all models -make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # add one model or model driver -make lib-kim args="-p /usr/local/kim-api" # use an existing KIM API installation at the provided location -make lib-kim args="-p /usr/local/kim-api -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # ditto but add one model or driver :pre +make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_003" # add one model or model driver +make lib-kim args="-p /usr/local/lib/kim-api-v2" # use an existing KIM API installation at the provided location +make lib-kim args="-p /usr/local/lib/kim-api-v2 -a EAM_Dynamo_Ackland_W__MO_141627196590_003" # ditto but add one model or driver :pre 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 @@ -730,13 +729,13 @@ args: make lib-latte # print help message make lib-latte args="-b" # download and build in lib/latte/LATTE-master make lib-latte args="-p $HOME/latte" # use existing LATTE installation in $HOME/latte -make lib-latte args="-b -m gfortran" # download and build in lib/latte and +make lib-latte args="-b -m gfortran" # download and build in lib/latte and # copy Makefile.lammps.gfortran to Makefile.lammps :pre Note that 3 symbolic (soft) links, "includelink" and "liblink" and "filelink.o", are created in lib/latte to point into the LATTE home dir. -When LAMMPS builds in src it will use these links. You should +When LAMMPS builds in src it will use these links. You should also check that the Makefile.lammps file you create is appropriate for the compiler you use on your system to build LATTE. @@ -1667,7 +1666,7 @@ This package provides "fix bocs"_fix_bocs.html, a modified version of "fix npt"_fix_nh.html which includes the pressure correction to the barostat as outlined in: -N. J. H. Dunn and W. G. Noid, "Bottom-up coarse-grained models that +N. J. H. Dunn and W. G. Noid, "Bottom-up coarse-grained models that accurately describe the structure, pressure, and compressibility of molecular liquids," J. Chem. Phys. 143, 243148 (2015). @@ -2279,13 +2278,13 @@ based on the Fortran version of Greg Wagner (Northwestern U) while at Sandia. [Install or un-install:] - + make yes-user-meamc make machine :pre - + make no-user-meamc make machine :pre - + [Supporting info:] src/USER-MEAMC: filenames -> commands @@ -2310,13 +2309,13 @@ algorithm. [Author:] Zhen Li (Division of Applied Mathematics, Brown University) [Install or un-install:] - + make yes-user-meso make machine :pre - + make no-user-meso make machine :pre - + [Supporting info:] src/USER-MESO: filenames -> commands @@ -2336,17 +2335,17 @@ USER-MOFFF package :link(USER-MOFFF),h4 [Contents:] Pair, angle and improper styles needed to employ the MOF-FF -force field by Schmid and coworkers with LAMMPS. +force field by Schmid and coworkers with LAMMPS. MOF-FF is a first principles derived force field with the primary aim -to simulate MOFs and related porous framework materials, using spherical +to simulate MOFs and related porous framework materials, using spherical Gaussian charges. It is described in S. Bureekaew et al., Phys. Stat. Sol. B 2013, 250, 1128-1141. -For the usage of MOF-FF see the example in the example directory as +For the usage of MOF-FF see the example in the example directory as well as the "MOF+"_MOFplus website. :link(MOFplus,https://www.mofplus.org/content/show/MOF-FF) -[Author:] Hendrik Heenen (Technical U of Munich), +[Author:] Hendrik Heenen (Technical U of Munich), Rochus Schmid (Ruhr-University Bochum). [Install or un-install:] diff --git a/doc/src/fix_adapt.txt b/doc/src/fix_adapt.txt index 7a34f2ff44..939a664501 100644 --- a/doc/src/fix_adapt.txt +++ b/doc/src/fix_adapt.txt @@ -123,8 +123,7 @@ meaning of these parameters: "lubricate"_pair_lubricate.html: mu: global: "gauss"_pair_gauss.html: a: type pairs: "morse"_pair_morse.html: d0,r0,alpha: type pairs: -"soft"_pair_soft.html: a: type pairs: -"kim"_pair_kim.html: PARAM_FREE_*:i,j,...: global :tb(c=3,s=:) +"soft"_pair_soft.html: a: type pairs: :tb(c=3,s=:) NOTE: It is easy to add new pairwise potentials and their parameters to this list. All it typically takes is adding an extract() method to @@ -132,12 +131,6 @@ the pair_*.cpp file associated with the potential. Some parameters are global settings for the pair style, e.g. the viscosity setting "mu" for "pair_style lubricate"_pair_lubricate.html. -For "pair_kim"_pair_kim.html, all free parameters supported by the -KIM Model are available (e.g., PARAM_FREE_sigmas provided by the -LennardJones612_Universal__MO_826355984548_001 Model). If the free -parameter corresponds to an array, then the particular array element -to be adapted must be specified (e.g., "PARAM_FREE_sigmas:10", to -adapt the tenth entry of the sigmas array). Other parameters apply to atom type pairs within the pair style, e.g. the prefactor "a" for "pair_style soft"_pair_soft.html. diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index c5d910e27c..3d105e2226 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -10,18 +10,14 @@ pair_style kim command :h3 [Syntax:] -pair_style kim virialmode model printflag :pre +pair_style kim virialmode model :pre virialmode = KIMvirial or LAMMPSvirial model = name of KIM model (potential) -printflag = 1/0 do or do not print KIM descriptor file, optional :ul [Examples:] -pair_style kim KIMvirial model_Ar_P_Morse -pair_coeff * * Ar Ar :pre - -pair_style kim KIMvirial model_Ar_P_Morse 1 +pair_style kim KIMvirial ex_model_Ar_P_LJ pair_coeff * * Ar Ar :pre [Description:] @@ -66,10 +62,6 @@ potential as KIM defines it. In principle, LAMMPS can invoke any KIM model. You should get an error or warning message from either LAMMPS or KIM if there is an incompatibility. -The argument {printflag} is optional. If it is set to a non-zero -value then a KIM descriptor file is printed when KIM is invoked. This -can be useful for debugging. The default is to not print this file. - Only a single pair_coeff command is used with the {kim} style which specifies the mapping of LAMMPS atom types to KIM elements. This is done by specifying N additional arguments after the * * in the @@ -86,18 +78,14 @@ pair_coeff * * Si Si Si C :pre The 1st 2 arguments must be * * so as to span all LAMMPS atom types. The first three Si arguments map LAMMPS atom types 1,2,3 to Si as defined within KIM. The final C argument maps LAMMPS atom type 4 to C -as defined within KIM. If a mapping value is specified as NULL, the -mapping is not performed. This can only be used when a {kim} -potential is used as part of the {hybrid} pair style. The NULL values -are placeholders for atom types that will be used with other -potentials. +as defined within KIM. :line In addition to the usual LAMMPS error messages, the KIM library itself may generate errors, which should be printed to the screen. In this case it is also useful to check the kim.log file for additional error -information. This file kim.log should be generated in the same +information. The file kim.log should be generated in the same directory where LAMMPS is running. To download, build, and install the KIM library on your system, see @@ -130,7 +118,7 @@ LAMMPS was built with that package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info. This current version of pair_style kim is compatible with the -kim-api package version 1.6.0 and higher. +kim-api package version 2.0.0-beta.0 and higher. [Related commands:] diff --git a/examples/kim/in.kim.lj b/examples/kim/in.kim.lj index f33b258be8..a8e2b9616b 100644 --- a/examples/kim/in.kim.lj +++ b/examples/kim/in.kim.lj @@ -16,14 +16,14 @@ region box block 0 ${xx} 0 ${yy} 0 ${zz} create_box 1 box create_atoms 1 box -#pair_style lj/cut 8.1500 -#pair_coeff 1 1 0.0031 2.7400 +#pair_style lj/cut 7.5548200 +#pair_coeff 1 1 0.0123529 1.8887100 #pair_modify shift yes -pair_style kim KIMvirial ex_model_Ne_P_fastLJ -pair_coeff * * Ne +pair_style kim KIMvirial LennardJones612_Ar +pair_coeff * * Ar -mass 1 20.18 +mass 1 39.95 velocity all create 200.0 232345 loop geom neighbor 0.3 bin diff --git a/examples/kim/in.kim.lj.lmp b/examples/kim/in.kim.lj.lmp index 8879024590..ddb7624945 100644 --- a/examples/kim/in.kim.lj.lmp +++ b/examples/kim/in.kim.lj.lmp @@ -16,14 +16,14 @@ region box block 0 ${xx} 0 ${yy} 0 ${zz} create_box 1 box create_atoms 1 box -pair_style lj/cut 8.1500 -pair_coeff 1 1 0.0031 2.7400 +pair_style lj/cut 7.5548200 +pair_coeff 1 1 0.0123529 1.8887100 pair_modify shift yes -#pair_style kim KIMvirial ex_model_Ne_P_fastLJ -#pair_coeff * * Ne +#pair_style kim KIMvirial LennardJones612_Ar +#pair_coeff * * Ar -mass 1 20.18 +mass 1 39.95 velocity all create 200.0 232345 loop geom neighbor 0.3 bin diff --git a/lib/kim/Install.py b/lib/kim/Install.py index 1bcaffd34a..f9eb1c5eed 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -12,11 +12,11 @@ help = """ Syntax from src dir: make lib-kim args="-b -v version -a kim-name" or: make lib-kim args="-b -a everything" or: make lib-kim args="-n -a kim-name" - or: make lib-kim args="-p /usr/local/open-kim -a kim-name" + or: make lib-kim args="-p /usr/local/lib/kim-api-v2 -a kim-name" Syntax from lib dir: python Install.py -b -v version -a kim-name or: python Install.py -b -a everything or: python Install.py -n -a kim-name - or: python Install.py -p /usr/local/open-kim -a kim-name + or: python Install.py -p /usr/local/lib/kim-api-v2 -a kim-name specify one or more options, order does not matter @@ -36,9 +36,9 @@ specify one or more options, order does not matter Examples: make lib-kim args="-b" # install KIM API lib with only example models -make lib-kim args="-a Glue_Ercolessi_Adams_Al__MO_324507536345_001" # Ditto plus one model +make lib-kim args="-a Glue_Ercolessi_Adams_Al__MO_324507536345_002" # Ditto plus one model make lib-kim args="-b -a everything" # install KIM API lib with all models -make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # only add one model or model driver +make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_003" # only add one model or model driver See the list of KIM model drivers here: https://openkim.org/kim-items/model-drivers/alphabetical diff --git a/lib/kim/README b/lib/kim/README index ce4ea1bdff..80d77d3332 100644 --- a/lib/kim/README +++ b/lib/kim/README @@ -46,8 +46,8 @@ $ rm -rf kim-api-vX.Y.Z.txz 5. To add items do the following (replace the kim item name with your desired value) -$ source ${PWD}/kim-api-vX.Y.Z/bin/kim-api-v1-activate -$ kim-api-v1-collections-management install system Pair_Johnson_Fe__MO_857282754307_002 +$ source ${PWD}/kim-api-vX.Y.Z/bin/kim-api-vX-activate +$ kim-api-vX-collections-management install system Pair_Johnson_Fe__MO_857282754307_002 ----------------- diff --git a/src/KIM/README b/src/KIM/README index 496db92cf2..a69206596f 100644 --- a/src/KIM/README +++ b/src/KIM/README @@ -26,5 +26,4 @@ library you can test it using an input file from the examples dir: ./lmp_serial < lammps/examples/kim/in.kim.lj -This pair_style was written by Valeriu Smirichinski and Ryan -S. Elliott (U Minn). +This pair_style was written by Ryan S. Elliott (U Minn). From 68ec8822ee4b09476d4496eb56522f5d2478a3ec Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Fri, 29 Jun 2018 16:24:15 -0500 Subject: [PATCH 0017/1242] Update example/kim/log.* --- examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.1 | 33 ---------- examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.4 | 33 ---------- examples/kim/log.28Jun15.kim.lj.ubuntu.1 | 33 ---------- examples/kim/log.28Jun15.kim.lj.ubuntu.4 | 33 ---------- examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.1 | 66 +++++++++++++++++++ examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.4 | 66 +++++++++++++++++++ examples/kim/log.29Jun18.kim.lj.ubuntu.1 | 68 ++++++++++++++++++++ examples/kim/log.29Jun18.kim.lj.ubuntu.4 | 68 ++++++++++++++++++++ 8 files changed, 268 insertions(+), 132 deletions(-) delete mode 100644 examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.1 delete mode 100644 examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.4 delete mode 100644 examples/kim/log.28Jun15.kim.lj.ubuntu.1 delete mode 100644 examples/kim/log.28Jun15.kim.lj.ubuntu.4 create mode 100644 examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.1 create mode 100644 examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.4 create mode 100644 examples/kim/log.29Jun18.kim.lj.ubuntu.1 create mode 100644 examples/kim/log.29Jun18.kim.lj.ubuntu.4 diff --git a/examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.1 b/examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.1 deleted file mode 100644 index efae0587a1..0000000000 --- a/examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.1 +++ /dev/null @@ -1,33 +0,0 @@ -LAMMPS (15 May 2015) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 1 by 1 MPI processor grid -Created 32000 atoms -Neighbor list info ... - 1 neighbor list requests - update every 1 steps, delay 0 steps, check yes - master list distance cutoff = 8.45 -Setting up run ... -Memory usage per processor = 9.18789 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 -741.55469 0 85.684388 -34.939092 - 100 108.37517 -362.56658 0 85.694308 3963.7892 -Loop time of 2.95205 on 1 procs for 100 steps with 32000 atoms - -Pair time (%) = 2.52074 (85.3894) -Neigh time (%) = 0.347949 (11.7867) -Comm time (%) = 0.0228171 (0.772925) -Outpt time (%) = 0.000188828 (0.00639649) -Other time (%) = 0.0603588 (2.04464) - -Nlocal: 32000 ave 32000 max 32000 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 20131 ave 20131 max 20131 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1.88909e+06 ave 1.88909e+06 max 1.88909e+06 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 1889091 -Ave neighs/atom = 59.0341 -Neighbor list builds = 5 -Dangerous builds = 0 diff --git a/examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.4 b/examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.4 deleted file mode 100644 index 12c1c76695..0000000000 --- a/examples/kim/log.28Jun15.kim.lj.lmp.ubuntu.4 +++ /dev/null @@ -1,33 +0,0 @@ -LAMMPS (15 May 2015) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 2 by 2 MPI processor grid -Created 32000 atoms -Neighbor list info ... - 1 neighbor list requests - update every 1 steps, delay 0 steps, check yes - master list distance cutoff = 8.45 -Setting up run ... -Memory usage per processor = 4.58461 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 -741.55469 0 85.684388 -34.939092 - 100 108.37517 -362.56658 0 85.694308 3963.7892 -Loop time of 6.15911 on 4 procs for 100 steps with 32000 atoms - -Pair time (%) = 1.76201 (28.6083) -Neigh time (%) = 0.265002 (4.30261) -Comm time (%) = 3.64452 (59.1729) -Outpt time (%) = 0.0169877 (0.275815) -Other time (%) = 0.470582 (7.64042) - -Nlocal: 8000 ave 8010 max 7989 min -Histogram: 1 0 0 0 0 2 0 0 0 1 -Nghost: 9240.25 ave 9249 max 9228 min -Histogram: 1 0 0 0 1 0 0 0 0 2 -Neighs: 472273 ave 473390 max 471652 min -Histogram: 2 0 0 1 0 0 0 0 0 1 - -Total # of neighbors = 1889091 -Ave neighs/atom = 59.0341 -Neighbor list builds = 5 -Dangerous builds = 0 diff --git a/examples/kim/log.28Jun15.kim.lj.ubuntu.1 b/examples/kim/log.28Jun15.kim.lj.ubuntu.1 deleted file mode 100644 index 95284453b1..0000000000 --- a/examples/kim/log.28Jun15.kim.lj.ubuntu.1 +++ /dev/null @@ -1,33 +0,0 @@ -LAMMPS (15 May 2015) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 1 by 1 MPI processor grid -Created 32000 atoms -Neighbor list info ... - 1 neighbor list requests - update every 1 steps, delay 0 steps, check yes - master list distance cutoff = 8.45 -Setting up run ... -Memory usage per processor = 9.43789 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 -741.55469 0 85.684388 -34.939092 - 100 108.37517 -362.56658 0 85.694308 3963.7892 -Loop time of 3.79746 on 1 procs for 100 steps with 32000 atoms - -Pair time (%) = 3.18686 (83.9207) -Neigh time (%) = 0.524724 (13.8178) -Comm time (%) = 0.0244031 (0.642616) -Outpt time (%) = 0.000174046 (0.00458321) -Other time (%) = 0.061305 (1.61437) - -Nlocal: 32000 ave 32000 max 32000 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 20131 ave 20131 max 20131 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 2.09236e+06 ave 2.09236e+06 max 2.09236e+06 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 2092355 -Ave neighs/atom = 65.3861 -Neighbor list builds = 5 -Dangerous builds = 0 diff --git a/examples/kim/log.28Jun15.kim.lj.ubuntu.4 b/examples/kim/log.28Jun15.kim.lj.ubuntu.4 deleted file mode 100644 index 7eaf58aad4..0000000000 --- a/examples/kim/log.28Jun15.kim.lj.ubuntu.4 +++ /dev/null @@ -1,33 +0,0 @@ -LAMMPS (15 May 2015) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 2 by 2 MPI processor grid -Created 32000 atoms -Neighbor list info ... - 1 neighbor list requests - update every 1 steps, delay 0 steps, check yes - master list distance cutoff = 8.45 -Setting up run ... -Memory usage per processor = 4.70961 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 -741.55469 0 85.684388 -34.939092 - 100 108.37517 -362.56658 0 85.694308 3963.7892 -Loop time of 7.25305 on 4 procs for 100 steps with 32000 atoms - -Pair time (%) = 2.52571 (34.8227) -Neigh time (%) = 0.500287 (6.8976) -Comm time (%) = 3.70236 (51.0456) -Outpt time (%) = 0.00146681 (0.0202234) -Other time (%) = 0.523229 (7.21391) - -Nlocal: 8000 ave 8010 max 7989 min -Histogram: 1 0 0 0 0 2 0 0 0 1 -Nghost: 9240.25 ave 9249 max 9228 min -Histogram: 1 0 0 0 1 0 0 0 0 2 -Neighs: 555266 ave 555920 max 554805 min -Histogram: 2 0 0 0 0 1 0 0 0 1 - -Total # of neighbors = 2221065 -Ave neighs/atom = 69.4083 -Neighbor list builds = 5 -Dangerous builds = 0 diff --git a/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.1 b/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.1 new file mode 100644 index 0000000000..76106e009f --- /dev/null +++ b/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.1 @@ -0,0 +1,66 @@ +-------------------------------------------------------------------------- +[[30970,1],0]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 1 by 1 MPI processor grid +Created 32000 atoms + Time spent = 0.0031676 secs +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 7.85482 + ghost atom cutoff = 7.85482 + binsize = 3.92741, bins = 23 23 23 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 16.58 | 16.58 | 16.58 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 -495.29247 0 331.94661 -978.84224 + 100 212.66365 -547.67175 0 331.94665 -1054.2086 +Loop time of 1.40245 on 1 procs for 100 steps with 32000 atoms + +Performance: 6.161 ns/day, 3.896 hours/ns, 71.304 timesteps/s +100.0% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.2556 | 1.2556 | 1.2556 | 0.0 | 89.53 +Neigh | 0.098976 | 0.098976 | 0.098976 | 0.0 | 7.06 +Comm | 0.011525 | 0.011525 | 0.011525 | 0.0 | 0.82 +Output | 0.00021903 | 0.00021903 | 0.00021903 | 0.0 | 0.02 +Modify | 0.023739 | 0.023739 | 0.023739 | 0.0 | 1.69 +Other | | 0.01244 | | | 0.89 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 19911 ave 19911 max 19911 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 1.36493e+06 ave 1.36493e+06 max 1.36493e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 1364931 +Ave neighs/atom = 42.6541 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:01 diff --git a/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.4 b/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.4 new file mode 100644 index 0000000000..634c038efd --- /dev/null +++ b/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.4 @@ -0,0 +1,66 @@ +-------------------------------------------------------------------------- +[[30962,1],0]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 2 by 2 MPI processor grid +Created 32000 atoms + Time spent = 0.00143054 secs +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 7.85482 + ghost atom cutoff = 7.85482 + binsize = 3.92741, bins = 23 23 23 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 6.875 | 6.875 | 6.875 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 -495.29247 0 331.94661 -978.84224 + 100 212.66365 -547.67175 0 331.94665 -1054.2086 +Loop time of 1.55473 on 4 procs for 100 steps with 32000 atoms + +Performance: 5.557 ns/day, 4.319 hours/ns, 64.320 timesteps/s +23.8% 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.47168 | 0.51922 | 0.58923 | 6.2 | 33.40 +Neigh | 0.061309 | 0.077009 | 0.10276 | 5.7 | 4.95 +Comm | 0.87185 | 0.92596 | 0.95327 | 3.4 | 59.56 +Output | 0.00035269 | 0.00047555 | 0.00055331 | 0.0 | 0.03 +Modify | 0.0060711 | 0.00616 | 0.0062612 | 0.1 | 0.40 +Other | | 0.0259 | | | 1.67 + +Nlocal: 8000 ave 8014 max 7988 min +Histogram: 1 0 0 1 1 0 0 0 0 1 +Nghost: 9131 ave 9143 max 9117 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Neighs: 341233 ave 341715 max 340679 min +Histogram: 1 0 0 0 1 0 0 1 0 1 + +Total # of neighbors = 1364931 +Ave neighs/atom = 42.6541 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:01 diff --git a/examples/kim/log.29Jun18.kim.lj.ubuntu.1 b/examples/kim/log.29Jun18.kim.lj.ubuntu.1 new file mode 100644 index 0000000000..c1875916db --- /dev/null +++ b/examples/kim/log.29Jun18.kim.lj.ubuntu.1 @@ -0,0 +1,68 @@ +-------------------------------------------------------------------------- +[[30495,1],0]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 1 by 1 MPI processor grid +Created 32000 atoms + Time spent = 0.00259765 secs +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 7.85482 + ghost atom cutoff = 7.85482 + binsize = 3.92741, bins = 23 23 23 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: full, newton on, ghost, cut 7.55482 + pair build: full/bin/ghost + stencil: full/ghost/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 27.14 | 27.14 | 27.14 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 -495.29247 0 331.94661 -978.84224 + 100 212.65961 -547.66877 0 331.93294 -1053.7732 +Loop time of 2.12331 on 1 procs for 100 steps with 32000 atoms + +Performance: 4.069 ns/day, 5.898 hours/ns, 47.096 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.7197 | 1.7197 | 1.7197 | 0.0 | 80.99 +Neigh | 0.35501 | 0.35501 | 0.35501 | 0.0 | 16.72 +Comm | 0.012289 | 0.012289 | 0.012289 | 0.0 | 0.58 +Output | 0.00021102 | 0.00021102 | 0.00021102 | 0.0 | 0.01 +Modify | 0.023484 | 0.023484 | 0.023484 | 0.0 | 1.11 +Other | | 0.01266 | | | 0.60 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 19911 ave 19911 max 19911 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 2.569e+06 ave 2.569e+06 max 2.569e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2568996 +Ave neighs/atom = 80.2811 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/examples/kim/log.29Jun18.kim.lj.ubuntu.4 b/examples/kim/log.29Jun18.kim.lj.ubuntu.4 new file mode 100644 index 0000000000..5ef352a667 --- /dev/null +++ b/examples/kim/log.29Jun18.kim.lj.ubuntu.4 @@ -0,0 +1,68 @@ +-------------------------------------------------------------------------- +[[30487,1],0]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 2 by 2 MPI processor grid +Created 32000 atoms + Time spent = 0.00128874 secs +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 7.85482 + ghost atom cutoff = 7.85482 + binsize = 3.92741, bins = 23 23 23 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: full, newton on, ghost, cut 7.55482 + pair build: full/bin/ghost + stencil: full/ghost/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 10.82 | 10.82 | 10.82 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 -495.29247 0 331.94661 -978.84224 + 100 212.65961 -547.66877 0 331.93294 -1053.7732 +Loop time of 2.58934 on 4 procs for 100 steps with 32000 atoms + +Performance: 3.337 ns/day, 7.193 hours/ns, 38.620 timesteps/s +24.3% 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.85344 | 0.94031 | 1.0212 | 7.2 | 36.31 +Neigh | 0.40159 | 0.42603 | 0.43728 | 2.2 | 16.45 +Comm | 1.1013 | 1.1823 | 1.2796 | 6.9 | 45.66 +Output | 0.00041301 | 0.00056702 | 0.00081648 | 0.0 | 0.02 +Modify | 0.0062882 | 0.0063459 | 0.0064657 | 0.1 | 0.25 +Other | | 0.03375 | | | 1.30 + +Nlocal: 8000 ave 8014 max 7988 min +Histogram: 1 0 0 1 1 0 0 0 0 1 +Nghost: 9131 ave 9143 max 9117 min +Histogram: 1 0 0 0 0 1 1 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 642249 ave 643365 max 641215 min +Histogram: 1 0 0 0 2 0 0 0 0 1 + +Total # of neighbors = 2568996 +Ave neighs/atom = 80.2811 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:03 From 5bdc29533123fa6f1d0ef487215ad2496c3bc6cd Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sun, 1 Jul 2018 16:23:17 -0500 Subject: [PATCH 0018/1242] Add skin to pair_kim neigh-list cutoffs & update docs --- doc/src/pair_kim.txt | 7 +++++-- examples/kim/in.kim.lj | 6 ++++++ lib/kim/README | 12 +++++++++--- src/KIM/pair_kim.cpp | 3 ++- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index 3d105e2226..4599779ca8 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -47,8 +47,11 @@ section of Section packages"_Section_packages.html#KIM 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. +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 "Making +LAMMPS"_Section_start.html#start_3 section and the ./lib/kim/README for details +on how to build LAMMSPS with the kim-api and how to install the example models. :line diff --git a/examples/kim/in.kim.lj b/examples/kim/in.kim.lj index a8e2b9616b..4ce7af97c4 100644 --- a/examples/kim/in.kim.lj +++ b/examples/kim/in.kim.lj @@ -1,4 +1,10 @@ # 3d Lennard-Jones melt +# +# This example requires that the example models provided with +# the kim-api package are installed. see the ./lib/kim/README or +# ./lib/kim/Install.py files for details on how to install these +# example models. +# variable x index 1 variable y index 1 diff --git a/lib/kim/README b/lib/kim/README index 80d77d3332..6bcad18ce0 100644 --- a/lib/kim/README +++ b/lib/kim/README @@ -36,14 +36,20 @@ $ ./configure --prefix=${PWD}/../installed-kim-api-vX.Y.Z $ make $ make install -$ cd .. -4. Remove source and build files +4. To install the example models shipped with the kim-api + +$ cd examples +$ make model-drivers-all-system +$ make models-all-system +$ cd ../.. + +5. Remove source and build files $ rm -rf kim-api-vX.Y.Z $ rm -rf kim-api-vX.Y.Z.txz -5. To add items do the following (replace the kim item name with your +6. To add items do the following (replace the kim item name with your desired value) $ source ${PWD}/kim-api-vX.Y.Z/bin/kim-api-vX-activate diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 5f123de45d..79ced5b9e9 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -429,7 +429,8 @@ void PairKIM::init_style() neighbor->requests[irequest]->full = 1; neighbor->requests[irequest]->ghost = 1; neighbor->requests[irequest]->cut = 1; - neighbor->requests[irequest]->cutoff = kim_cutoff_values[i]; + neighbor->requests[irequest]->cutoff + = kim_cutoff_values[i] + neighbor->skin; } return; From 0fbc6bebf545c2d53a2acefc14f5289bfd08b365 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 2 Jul 2018 21:48:47 -0500 Subject: [PATCH 0019/1242] Fix no-virial support -> LAMMPSvirial in pair_kim --- src/KIM/pair_kim.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 79ced5b9e9..ee9bac000d 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -958,9 +958,13 @@ void PairKIM::set_kim_model_has_flags() error->warning(FLERR,"KIM Model does not provide `partialForce'; " "Forces will be zero"); - if (kim_model_support_for_virial == notSupported) + if ((no_virial_fdotr_compute == 1) && + (kim_model_support_for_virial == notSupported)) + { error->warning(FLERR,"KIM Model does not provide `partialVirial'. " "pair_kim now using `LAMMPSvirial' option."); + no_virial_fdotr_compute = 0; + } if (kim_model_support_for_particleEnergy == notSupported) error->warning(FLERR,"KIM Model does not provide `partialParticleEnergy'; " From 0264e044e2d7db5635fae76f74c09bd71b6b392d Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 2 Jul 2018 21:51:05 -0500 Subject: [PATCH 0020/1242] Update example/kim input files --- examples/kim/in.kim.lj | 8 ++++---- examples/kim/in.kim.lj.lmp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/kim/in.kim.lj b/examples/kim/in.kim.lj index 4ce7af97c4..851243bed8 100644 --- a/examples/kim/in.kim.lj +++ b/examples/kim/in.kim.lj @@ -22,11 +22,11 @@ region box block 0 ${xx} 0 ${yy} 0 ${zz} create_box 1 box create_atoms 1 box -#pair_style lj/cut 7.5548200 -#pair_coeff 1 1 0.0123529 1.8887100 -#pair_modify shift yes +#pair_style lj/cut 8.1500 +#pair_coeff 1 1 0.0104 3.4000 +#pair_modify shift no -pair_style kim KIMvirial LennardJones612_Ar +pair_style kim LAMMPSvirial LennardJones_Ar pair_coeff * * Ar mass 1 39.95 diff --git a/examples/kim/in.kim.lj.lmp b/examples/kim/in.kim.lj.lmp index ddb7624945..aa6dbcad6f 100644 --- a/examples/kim/in.kim.lj.lmp +++ b/examples/kim/in.kim.lj.lmp @@ -16,11 +16,11 @@ region box block 0 ${xx} 0 ${yy} 0 ${zz} create_box 1 box create_atoms 1 box -pair_style lj/cut 7.5548200 -pair_coeff 1 1 0.0123529 1.8887100 -pair_modify shift yes +pair_style lj/cut 8.1500 +pair_coeff 1 1 0.0104 3.4000 +pair_modify shift no -#pair_style kim KIMvirial LennardJones612_Ar +#pair_style kim KIMvirial LennardJones_Ar #pair_coeff * * Ar mass 1 39.95 From 7eeb96f1afdc3aa1a37cd5429727e3549b8ebcc0 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Tue, 3 Jul 2018 23:37:54 -0500 Subject: [PATCH 0021/1242] Update pair_kim to work with new neig. list Hints --- examples/kim/in.kim.lj | 4 +- examples/kim/in.kim.lj.lmp | 2 +- examples/kim/in.kim.lj.lmp.newton-on | 35 ++++ ...g.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1} | 42 ++-- ...g.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4} | 52 ++--- ...tu.1 => log.04Jul2018.kim.lj.lmp.ubuntu.1} | 48 +++-- .../kim/log.04Jul2018.kim.lj.lmp.ubuntu.4 | 66 ++++++ examples/kim/log.04Jul2018.kim.lj.ubuntu.1 | 69 +++++++ examples/kim/log.04Jul2018.kim.lj.ubuntu.4 | 78 ++++++++ examples/kim/log.29Jun18.kim.lj.ubuntu.4 | 68 ------- src/KIM/pair_kim.cpp | 188 ++++++++++-------- src/KIM/pair_kim.h | 10 +- 12 files changed, 433 insertions(+), 229 deletions(-) create mode 100644 examples/kim/in.kim.lj.lmp.newton-on rename examples/kim/{log.29Jun18.kim.lj.lmp.ubuntu.1 => log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1} (56%) rename examples/kim/{log.29Jun18.kim.lj.lmp.ubuntu.4 => log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4} (50%) rename examples/kim/{log.29Jun18.kim.lj.ubuntu.1 => log.04Jul2018.kim.lj.lmp.ubuntu.1} (52%) create mode 100644 examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.4 create mode 100644 examples/kim/log.04Jul2018.kim.lj.ubuntu.1 create mode 100644 examples/kim/log.04Jul2018.kim.lj.ubuntu.4 delete mode 100644 examples/kim/log.29Jun18.kim.lj.ubuntu.4 diff --git a/examples/kim/in.kim.lj b/examples/kim/in.kim.lj index 851243bed8..a17ec982da 100644 --- a/examples/kim/in.kim.lj +++ b/examples/kim/in.kim.lj @@ -16,6 +16,7 @@ variable zz equal 20*$z units metal atom_style atomic +newton off lattice fcc 4.4300 region box block 0 ${xx} 0 ${yy} 0 ${zz} @@ -24,9 +25,8 @@ create_atoms 1 box #pair_style lj/cut 8.1500 #pair_coeff 1 1 0.0104 3.4000 -#pair_modify shift no -pair_style kim LAMMPSvirial LennardJones_Ar +pair_style kim KIMvirial LennardJones_Ar pair_coeff * * Ar mass 1 39.95 diff --git a/examples/kim/in.kim.lj.lmp b/examples/kim/in.kim.lj.lmp index aa6dbcad6f..a10e3e2e90 100644 --- a/examples/kim/in.kim.lj.lmp +++ b/examples/kim/in.kim.lj.lmp @@ -10,6 +10,7 @@ variable zz equal 20*$z units metal atom_style atomic +newton off lattice fcc 4.4300 region box block 0 ${xx} 0 ${yy} 0 ${zz} @@ -18,7 +19,6 @@ create_atoms 1 box pair_style lj/cut 8.1500 pair_coeff 1 1 0.0104 3.4000 -pair_modify shift no #pair_style kim KIMvirial LennardJones_Ar #pair_coeff * * Ar diff --git a/examples/kim/in.kim.lj.lmp.newton-on b/examples/kim/in.kim.lj.lmp.newton-on new file mode 100644 index 0000000000..d17bc14984 --- /dev/null +++ b/examples/kim/in.kim.lj.lmp.newton-on @@ -0,0 +1,35 @@ +# 3d Lennard-Jones melt + +variable x index 1 +variable y index 1 +variable z index 1 + +variable xx equal 20*$x +variable yy equal 20*$y +variable zz equal 20*$z + +units metal +atom_style atomic +newton on + +lattice fcc 4.4300 +region box block 0 ${xx} 0 ${yy} 0 ${zz} +create_box 1 box +create_atoms 1 box + +pair_style lj/cut 8.1500 +pair_coeff 1 1 0.0104 3.4000 + +#pair_style kim KIMvirial LennardJones_Ar +#pair_coeff * * Ar + +mass 1 39.95 +velocity all create 200.0 232345 loop geom + +neighbor 0.3 bin +neigh_modify delay 0 every 1 check yes + +fix 1 all nve +#fix 1 all npt temp 1.0 1.0 1.0 iso 1.0 1.0 3.0 + +run 100 diff --git a/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.1 b/examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1 similarity index 56% rename from examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.1 rename to examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1 index 76106e009f..70eae36a48 100644 --- a/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.1 +++ b/examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[30970,1],0]: A high-performance Open MPI point-to-point messaging module +[[19053,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,13 +16,13 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.0031676 secs + Time spent = 0.00270113 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 7.85482 - ghost atom cutoff = 7.85482 - binsize = 3.92741, bins = 23 23 23 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 1 neighbor lists, perpetual/occasional/extra = 1 0 0 (1) pair lj/cut, perpetual attributes: half, newton on @@ -33,34 +33,34 @@ Setting up Verlet run ... Unit style : metal Current step : 0 Time step : 0.001 -Per MPI rank memory allocation (min/avg/max) = 16.58 | 16.58 | 16.58 Mbytes +Per MPI rank memory allocation (min/avg/max) = 19.23 | 19.23 | 19.23 Mbytes Step Temp E_pair E_mol TotEng Press - 0 200 -495.29247 0 331.94661 -978.84224 - 100 212.66365 -547.67175 0 331.94665 -1054.2086 -Loop time of 1.40245 on 1 procs for 100 steps with 32000 atoms + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 2.18554 on 1 procs for 100 steps with 32000 atoms -Performance: 6.161 ns/day, 3.896 hours/ns, 71.304 timesteps/s -100.0% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 3.953 ns/day, 6.071 hours/ns, 45.755 timesteps/s +99.6% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.2556 | 1.2556 | 1.2556 | 0.0 | 89.53 -Neigh | 0.098976 | 0.098976 | 0.098976 | 0.0 | 7.06 -Comm | 0.011525 | 0.011525 | 0.011525 | 0.0 | 0.82 -Output | 0.00021903 | 0.00021903 | 0.00021903 | 0.0 | 0.02 -Modify | 0.023739 | 0.023739 | 0.023739 | 0.0 | 1.69 -Other | | 0.01244 | | | 0.89 +Pair | 2.0006 | 2.0006 | 2.0006 | 0.0 | 91.54 +Neigh | 0.13933 | 0.13933 | 0.13933 | 0.0 | 6.38 +Comm | 0.011122 | 0.011122 | 0.011122 | 0.0 | 0.51 +Output | 0.00020978 | 0.00020978 | 0.00020978 | 0.0 | 0.01 +Modify | 0.022358 | 0.022358 | 0.022358 | 0.0 | 1.02 +Other | | 0.01188 | | | 0.54 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 19911 ave 19911 max 19911 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 1.36493e+06 ave 1.36493e+06 max 1.36493e+06 min +Neighs: 2.12688e+06 ave 2.12688e+06 max 2.12688e+06 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 1364931 -Ave neighs/atom = 42.6541 +Total # of neighbors = 2126875 +Ave neighs/atom = 66.4648 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:00:01 +Total wall time: 0:00:02 diff --git a/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.4 b/examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4 similarity index 50% rename from examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.4 rename to examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4 index 634c038efd..e7157c11b8 100644 --- a/examples/kim/log.29Jun18.kim.lj.lmp.ubuntu.4 +++ b/examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[30962,1],0]: A high-performance Open MPI point-to-point messaging module +[[19045,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,13 +16,13 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.00143054 secs + Time spent = 0.00117056 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 7.85482 - ghost atom cutoff = 7.85482 - binsize = 3.92741, bins = 23 23 23 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 1 neighbor lists, perpetual/occasional/extra = 1 0 0 (1) pair lj/cut, perpetual attributes: half, newton on @@ -33,34 +33,34 @@ Setting up Verlet run ... Unit style : metal Current step : 0 Time step : 0.001 -Per MPI rank memory allocation (min/avg/max) = 6.875 | 6.875 | 6.875 Mbytes +Per MPI rank memory allocation (min/avg/max) = 7.632 | 7.632 | 7.632 Mbytes Step Temp E_pair E_mol TotEng Press - 0 200 -495.29247 0 331.94661 -978.84224 - 100 212.66365 -547.67175 0 331.94665 -1054.2086 -Loop time of 1.55473 on 4 procs for 100 steps with 32000 atoms + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 2.34104 on 4 procs for 100 steps with 32000 atoms -Performance: 5.557 ns/day, 4.319 hours/ns, 64.320 timesteps/s -23.8% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 3.691 ns/day, 6.503 hours/ns, 42.716 timesteps/s +24.0% 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.47168 | 0.51922 | 0.58923 | 6.2 | 33.40 -Neigh | 0.061309 | 0.077009 | 0.10276 | 5.7 | 4.95 -Comm | 0.87185 | 0.92596 | 0.95327 | 3.4 | 59.56 -Output | 0.00035269 | 0.00047555 | 0.00055331 | 0.0 | 0.03 -Modify | 0.0060711 | 0.00616 | 0.0062612 | 0.1 | 0.40 -Other | | 0.0259 | | | 1.67 +Pair | 0.91499 | 0.96396 | 1.0567 | 5.6 | 41.18 +Neigh | 0.092245 | 0.11781 | 0.14572 | 6.0 | 5.03 +Comm | 1.1264 | 1.2287 | 1.2906 | 5.6 | 52.49 +Output | 0.00045199 | 0.00051154 | 0.00060273 | 0.0 | 0.02 +Modify | 0.0058738 | 0.0059629 | 0.0061675 | 0.2 | 0.25 +Other | | 0.02406 | | | 1.03 -Nlocal: 8000 ave 8014 max 7988 min -Histogram: 1 0 0 1 1 0 0 0 0 1 -Nghost: 9131 ave 9143 max 9117 min -Histogram: 1 0 0 0 0 1 1 0 0 1 -Neighs: 341233 ave 341715 max 340679 min -Histogram: 1 0 0 0 1 0 0 1 0 1 +Nlocal: 8000 ave 8018 max 7967 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 9131 ave 9164 max 9113 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Neighs: 531719 ave 533273 max 529395 min +Histogram: 1 0 0 0 1 0 0 0 0 2 -Total # of neighbors = 1364931 -Ave neighs/atom = 42.6541 +Total # of neighbors = 2126875 +Ave neighs/atom = 66.4648 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:00:01 +Total wall time: 0:00:02 diff --git a/examples/kim/log.29Jun18.kim.lj.ubuntu.1 b/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.1 similarity index 52% rename from examples/kim/log.29Jun18.kim.lj.ubuntu.1 rename to examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.1 index c1875916db..217568072c 100644 --- a/examples/kim/log.29Jun18.kim.lj.ubuntu.1 +++ b/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.1 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[30495,1],0]: A high-performance Open MPI point-to-point messaging module +[[19074,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,53 +16,51 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00259765 secs + Time spent = 0.00251478 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 7.85482 - ghost atom cutoff = 7.85482 - binsize = 3.92741, bins = 23 23 23 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair kim, perpetual - attributes: full, newton on, ghost, cut 7.55482 - pair build: full/bin/ghost - stencil: full/ghost/bin/3d + (1) pair lj/cut, perpetual + attributes: half, newton off + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff bin: standard Setting up Verlet run ... Unit style : metal Current step : 0 Time step : 0.001 -Per MPI rank memory allocation (min/avg/max) = 27.14 | 27.14 | 27.14 Mbytes +Per MPI rank memory allocation (min/avg/max) = 20.37 | 20.37 | 20.37 Mbytes Step Temp E_pair E_mol TotEng Press - 0 200 -495.29247 0 331.94661 -978.84224 - 100 212.65961 -547.66877 0 331.93294 -1053.7732 -Loop time of 2.12331 on 1 procs for 100 steps with 32000 atoms + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 2.6218 on 1 procs for 100 steps with 32000 atoms -Performance: 4.069 ns/day, 5.898 hours/ns, 47.096 timesteps/s +Performance: 3.295 ns/day, 7.283 hours/ns, 38.142 timesteps/s 99.9% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.7197 | 1.7197 | 1.7197 | 0.0 | 80.99 -Neigh | 0.35501 | 0.35501 | 0.35501 | 0.0 | 16.72 -Comm | 0.012289 | 0.012289 | 0.012289 | 0.0 | 0.58 -Output | 0.00021102 | 0.00021102 | 0.00021102 | 0.0 | 0.01 -Modify | 0.023484 | 0.023484 | 0.023484 | 0.0 | 1.11 -Other | | 0.01266 | | | 0.60 +Pair | 2.2623 | 2.2623 | 2.2623 | 0.0 | 86.29 +Neigh | 0.31859 | 0.31859 | 0.31859 | 0.0 | 12.15 +Comm | 0.005914 | 0.005914 | 0.005914 | 0.0 | 0.23 +Output | 0.00033105 | 0.00033105 | 0.00033105 | 0.0 | 0.01 +Modify | 0.023461 | 0.023461 | 0.023461 | 0.0 | 0.89 +Other | | 0.01123 | | | 0.43 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 19911 ave 19911 max 19911 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 0 ave 0 max 0 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -FullNghs: 2.569e+06 ave 2.569e+06 max 2.569e+06 min +Neighs: 2.3705e+06 ave 2.3705e+06 max 2.3705e+06 min Histogram: 1 0 0 0 0 0 0 0 0 0 -Total # of neighbors = 2568996 -Ave neighs/atom = 80.2811 +Total # of neighbors = 2370499 +Ave neighs/atom = 74.0781 Neighbor list builds = 3 Dangerous builds = 0 Total wall time: 0:00:02 diff --git a/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.4 b/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.4 new file mode 100644 index 0000000000..806c674efb --- /dev/null +++ b/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.4 @@ -0,0 +1,66 @@ +-------------------------------------------------------------------------- +[[19098,1],0]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 2 by 2 MPI processor grid +Created 32000 atoms + Time spent = 0.00123697 secs +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton off + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 8.013 | 8.013 | 8.013 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 2.88232 on 4 procs for 100 steps with 32000 atoms + +Performance: 2.998 ns/day, 8.006 hours/ns, 34.694 timesteps/s +24.6% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 1.3577 | 1.415 | 1.467 | 3.7 | 49.09 +Neigh | 0.25761 | 0.28189 | 0.29894 | 3.2 | 9.78 +Comm | 0.58287 | 0.73218 | 0.85561 | 11.5 | 25.40 +Output | 0.00082721 | 0.0029034 | 0.0051877 | 3.1 | 0.10 +Modify | 0.0058569 | 0.015767 | 0.033242 | 8.6 | 0.55 +Other | | 0.4346 | | | 15.08 + +Nlocal: 8000 ave 8018 max 7967 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 9131 ave 9164 max 9113 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Neighs: 630904 ave 632094 max 628209 min +Histogram: 1 0 0 0 0 0 0 1 0 2 + +Total # of neighbors = 2523614 +Ave neighs/atom = 78.8629 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/kim/log.04Jul2018.kim.lj.ubuntu.1 b/examples/kim/log.04Jul2018.kim.lj.ubuntu.1 new file mode 100644 index 0000000000..3832bd060a --- /dev/null +++ b/examples/kim/log.04Jul2018.kim.lj.ubuntu.1 @@ -0,0 +1,69 @@ +-------------------------------------------------------------------------- +[[19111,1],0]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 1 by 1 MPI processor grid +Created 32000 atoms + Time spent = 0.00257231 secs +WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: half, newton off, cut 8.45 + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 21.26 | 21.26 | 21.26 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 1270.4248 + 100 95.179725 6718.814 0 7112.496 604.59343 +Loop time of 3.22934 on 1 procs for 100 steps with 32000 atoms + +Performance: 2.675 ns/day, 8.970 hours/ns, 30.966 timesteps/s +99.9% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.821 | 2.821 | 2.821 | 0.0 | 87.36 +Neigh | 0.35198 | 0.35198 | 0.35198 | 0.0 | 10.90 +Comm | 0.0081757 | 0.0081757 | 0.0081757 | 0.0 | 0.25 +Output | 0.00030922 | 0.00030922 | 0.00030922 | 0.0 | 0.01 +Modify | 0.032856 | 0.032856 | 0.032856 | 0.0 | 1.02 +Other | | 0.01501 | | | 0.46 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 19911 ave 19911 max 19911 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 2.3705e+06 ave 2.3705e+06 max 2.3705e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2370499 +Ave neighs/atom = 74.0781 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/kim/log.04Jul2018.kim.lj.ubuntu.4 b/examples/kim/log.04Jul2018.kim.lj.ubuntu.4 new file mode 100644 index 0000000000..70b2f82812 --- /dev/null +++ b/examples/kim/log.04Jul2018.kim.lj.ubuntu.4 @@ -0,0 +1,78 @@ +-------------------------------------------------------------------------- +[[19135,1],1]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 2 by 2 MPI processor grid +Created 32000 atoms + Time spent = 0.00154417 secs +WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) +WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) +WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) +WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: half, newton off, cut 8.45 + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 8.528 | 8.528 | 8.528 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 1270.4248 + 100 95.179725 6718.814 0 7112.496 604.59343 +Loop time of 3.17877 on 4 procs for 100 steps with 32000 atoms + +Performance: 2.718 ns/day, 8.830 hours/ns, 31.459 timesteps/s +24.3% CPU use with 4 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.0514 | 2.1009 | 2.1859 | 3.6 | 66.09 +Neigh | 0.29304 | 0.31706 | 0.33568 | 2.7 | 9.97 +Comm | 0.61926 | 0.72709 | 0.77083 | 7.3 | 22.87 +Output | 0.00035457 | 0.00043741 | 0.000547 | 0.0 | 0.01 +Modify | 0.0066107 | 0.0067653 | 0.0069097 | 0.1 | 0.21 +Other | | 0.02653 | | | 0.83 + +Nlocal: 8000 ave 8018 max 7967 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 9131 ave 9164 max 9113 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Neighs: 630904 ave 632094 max 628209 min +Histogram: 1 0 0 0 0 0 0 1 0 2 + +Total # of neighbors = 2523614 +Ave neighs/atom = 78.8629 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/kim/log.29Jun18.kim.lj.ubuntu.4 b/examples/kim/log.29Jun18.kim.lj.ubuntu.4 deleted file mode 100644 index 5ef352a667..0000000000 --- a/examples/kim/log.29Jun18.kim.lj.ubuntu.4 +++ /dev/null @@ -1,68 +0,0 @@ --------------------------------------------------------------------------- -[[30487,1],0]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 2 by 2 MPI processor grid -Created 32000 atoms - Time spent = 0.00128874 secs -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 7.85482 - ghost atom cutoff = 7.85482 - binsize = 3.92741, bins = 23 23 23 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair kim, perpetual - attributes: full, newton on, ghost, cut 7.55482 - pair build: full/bin/ghost - stencil: full/ghost/bin/3d - bin: standard -Setting up Verlet run ... - Unit style : metal - Current step : 0 - Time step : 0.001 -Per MPI rank memory allocation (min/avg/max) = 10.82 | 10.82 | 10.82 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 -495.29247 0 331.94661 -978.84224 - 100 212.65961 -547.66877 0 331.93294 -1053.7732 -Loop time of 2.58934 on 4 procs for 100 steps with 32000 atoms - -Performance: 3.337 ns/day, 7.193 hours/ns, 38.620 timesteps/s -24.3% 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.85344 | 0.94031 | 1.0212 | 7.2 | 36.31 -Neigh | 0.40159 | 0.42603 | 0.43728 | 2.2 | 16.45 -Comm | 1.1013 | 1.1823 | 1.2796 | 6.9 | 45.66 -Output | 0.00041301 | 0.00056702 | 0.00081648 | 0.0 | 0.02 -Modify | 0.0062882 | 0.0063459 | 0.0064657 | 0.1 | 0.25 -Other | | 0.03375 | | | 1.30 - -Nlocal: 8000 ave 8014 max 7988 min -Histogram: 1 0 0 1 1 0 0 0 0 1 -Nghost: 9131 ave 9143 max 9117 min -Histogram: 1 0 0 0 0 1 1 0 0 1 -Neighs: 0 ave 0 max 0 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -FullNghs: 642249 ave 643365 max 641215 min -Histogram: 1 0 0 0 2 0 0 0 0 1 - -Total # of neighbors = 2568996 -Ave neighs/atom = 80.2811 -Neighbor list builds = 3 -Dangerous builds = 0 -Total wall time: 0:00:03 diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index ee9bac000d..ca39b5601e 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -12,13 +12,11 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Ryan S. Elliott, - Valeriu Smirichinski, - Ellad Tadmor + Contributing authors: Ryan S. Elliott (UMinn) ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v1.6.0 (and newer) package + Designed for use with the kim-api-v2.0.0-beta.1 (and newer) package ------------------------------------------------------------------------- */ #include @@ -45,9 +43,9 @@ PairKIM::PairKIM(LAMMPS *lmp) : Pair(lmp), settings_call_count(0), init_style_call_count(0), - kim_modelname(0), - lmps_map_species_to_unique(0), - lmps_unique_elements(0), + kim_modelname(NULL), + lmps_map_species_to_unique(NULL), + lmps_unique_elements(NULL), lmps_num_unique_elements(0), lmps_units(METAL), lengthUnit(KIM::LENGTH_UNIT::unused), @@ -55,8 +53,8 @@ PairKIM::PairKIM(LAMMPS *lmp) : chargeUnit(KIM::CHARGE_UNIT::unused), temperatureUnit(KIM::TEMPERATURE_UNIT::unused), timeUnit(KIM::TIME_UNIT::unused), - pkim(0), - pargs(0), + pkim(NULL), + pargs(NULL), kim_model_support_for_energy(KIM::SUPPORT_STATUS::notSupported), kim_model_support_for_forces(KIM::SUPPORT_STATUS::notSupported), kim_model_support_for_virial(KIM::SUPPORT_STATUS::notSupported), @@ -64,15 +62,17 @@ PairKIM::PairKIM(LAMMPS *lmp) : kim_model_support_for_particleVirial(KIM::SUPPORT_STATUS::notSupported), lmps_local_tot_num_atoms(0), kim_global_influence_distance(0.0), - kim_number_of_cutoffs(0), - kim_cutoff_values(0), - neighborLists(0), - kim_particle_codes(0), + kim_number_of_neighbor_lists(0), + kim_cutoff_values(NULL), + padding_neighbor_hints(NULL), + half_list_hints(NULL), + neighborLists(NULL), + kim_particle_codes(NULL), lmps_maxalloc(0), - kim_particleSpecies(0), - kim_particleContributing(0), - lmps_stripped_neigh_list(0), - lmps_stripped_neigh_ptr(0) + kim_particleSpecies(NULL), + kim_particleContributing(NULL), + lmps_stripped_neigh_list(NULL), + lmps_stripped_neigh_ptr(NULL) { // Initialize Pair data members to appropriate values single_enable = 0; // We do not provide the Single() function @@ -101,6 +101,13 @@ PairKIM::~PairKIM() delete [] lmps_unique_elements[i]; delete [] lmps_unique_elements; + if (kim_particle_codes_ok) + { + delete [] kim_particle_codes; + kim_particle_codes = NULL; + kim_particle_codes_ok = false; + } + // clean up local memory used to support KIM interface memory->destroy(kim_particleSpecies); memory->destroy(kim_particleContributing); @@ -281,20 +288,6 @@ void PairKIM::settings(int narg, char **arg) // set lmps_* bool flags set_lmps_flags(); - // set virial handling - if (strcmp(arg[0],"LAMMPSvirial") == 0) - { - no_virial_fdotr_compute = 0; - } - else if (strcmp(arg[0],"KIMvirial") == 0) - { - no_virial_fdotr_compute = 1; - } - else - { - error->all(FLERR,"Unrecognized virial argument in pair_style command"); - } - // set KIM Model name int nmlen = strlen(arg[1]); if (kim_modelname != 0) @@ -305,6 +298,26 @@ void PairKIM::settings(int narg, char **arg) kim_modelname = new char[nmlen+1]; strcpy(kim_modelname, arg[1]); + // initialize KIM Model + kim_init(); + + // set virial handling + if (strcmp(arg[0],"KIMvirial") == 0) + { + if (kim_model_support_for_virial == KIM::SUPPORT_STATUS::notSupported) + no_virial_fdotr_compute = 0; + else + no_virial_fdotr_compute = 1; + } + else if (strcmp(arg[0],"LAMMPSvirial") == 0) + { + no_virial_fdotr_compute = 0; + } + else + { + error->all(FLERR,"Unrecognized virial argument in pair_style command"); + } + return; } @@ -351,7 +364,7 @@ void PairKIM::coeff(int narg, char **arg) // Assume all species arguments are valid - // errors will be detected by kim_api_init() matching + // errors will be detected by below lmps_num_unique_elements = 0; for (i = 2; i < narg; i++) { for (j = 0; j < lmps_num_unique_elements; j++) @@ -378,6 +391,29 @@ void PairKIM::coeff(int narg, char **arg) if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); + // setup mapping between LAMMPS unique elements and KIM species codes + if (kim_particle_codes_ok) + { + delete [] kim_particle_codes; + kim_particle_codes = NULL; + kim_particle_codes_ok = false; + } + kim_particle_codes = new int[lmps_num_unique_elements]; + kim_particle_codes_ok = true; + for(int i = 0; i < lmps_num_unique_elements; i++){ + int kimerror; + int supported; + int code; + kimerror = pkim->GetSpeciesSupportAndCode( + KIM::SpeciesName(lmps_unique_elements[i]), + &supported, + &code); + if (supported) + kim_particle_codes[i] = code; + else + error->all(FLERR,"create_kim_particle_codes: symbol not found "); + } + return; } @@ -394,22 +430,16 @@ void PairKIM::init_style() error->all(FLERR,"PairKIM only works with 3D problems"); int kimerror; - // KIM and Model initialization (only once) - // also sets kim_ind_* and kim_* bool flags - if (!kim_init_ok) - { - kim_init(); - } // setup lmps_stripped_neigh_list for neighbors of one atom, if needed if (lmps_using_molecular) { memory->destroy(lmps_stripped_neigh_list); memory->create(lmps_stripped_neigh_list, - kim_number_of_cutoffs*neighbor->oneatom, + kim_number_of_neighbor_lists*neighbor->oneatom, "pair:lmps_stripped_neigh_list"); delete [] lmps_stripped_neigh_ptr; - lmps_stripped_neigh_ptr = new int*[kim_number_of_cutoffs]; - for (int i = 0; i < kim_number_of_cutoffs; ++i) + lmps_stripped_neigh_ptr = new int*[kim_number_of_neighbor_lists]; + for (int i = 0; i < kim_number_of_neighbor_lists; ++i) { lmps_stripped_neigh_ptr[0] = &(lmps_stripped_neigh_list[(i-1)*(neighbor->oneatom)]); @@ -420,14 +450,32 @@ void PairKIM::init_style() // make sure comm_reverse expects (at most) 9 values when newton is off if (!lmps_using_newton) comm_reverse_off = 9; - // request full neighbor lists - for (int i = 0; i < kim_number_of_cutoffs; ++i) + // request full neighbor lists (unless hints allow for better alternatives) + for (int i = 0; i < kim_number_of_neighbor_lists; ++i) { int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->id = i; - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - neighbor->requests[irequest]->ghost = 1; + if (half_list_hints[i]) + { + neighbor->requests[irequest]->half = 1; + if (! lmps_using_newton) neighbor->requests[irequest]->newton = 2; + neighbor->requests[irequest]->full = 0; + } + else + { + neighbor->requests[irequest]->half = 0; + if (! lmps_using_newton) neighbor->requests[irequest]->newton = 0; + neighbor->requests[irequest]->full = 1; + } + if (padding_neighbor_hints[i]) + { + neighbor->requests[irequest]->ghost = 0; + } + else + { + neighbor->requests[irequest]->ghost = 1; + + } neighbor->requests[irequest]->cut = 1; neighbor->requests[irequest]->cutoff = kim_cutoff_values[i] + neighbor->skin; @@ -604,7 +652,8 @@ double PairKIM::memory_usage() ------------------------------------------------------------------------- */ int PairKIM::get_neigh(void const * const dataObject, - int const numberOfCutoffs, double const * const cutoffs, + int const numberOfNeighborLists, + double const * const cutoffs, int const neighborListIndex, int const particleNumber, int * const numberOfNeighbors, int const ** const neighborsOfParticle) @@ -612,8 +661,9 @@ int PairKIM::get_neigh(void const * const dataObject, PairKIM const * const Model = reinterpret_cast(dataObject); - if (numberOfCutoffs != Model->kim_number_of_cutoffs) return true; - for (int i = 0; i < numberOfCutoffs; ++i) + if (numberOfNeighborLists != Model->kim_number_of_neighbor_lists) + return true; + for (int i = 0; i < numberOfNeighborLists; ++i) { if (Model->kim_cutoff_values[i] < cutoffs[i]) return true; } @@ -666,13 +716,6 @@ void PairKIM::kim_free() } kim_init_ok = false; - if (kim_particle_codes_ok) - { - delete [] kim_particle_codes; - kim_particle_codes = 0; - kim_particle_codes_ok = false; - } - return; } @@ -713,32 +756,17 @@ void PairKIM::kim_init() // determine KIM Model capabilities (used in this function below) set_kim_model_has_flags(); - // setup mapping between LAMMPS unique elements and KIM species codes - kim_particle_codes = new int[lmps_num_unique_elements]; - kim_particle_codes_ok = true; - for(int i = 0; i < lmps_num_unique_elements; i++){ - int kimerror; - int supported; - int code; - kimerror = pkim->GetSpeciesSupportAndCode( - KIM::SpeciesName(lmps_unique_elements[i]), - &supported, - &code); - if (supported) - kim_particle_codes[i] = code; - else - error->all(FLERR,"create_kim_particle_codes: symbol not found "); - } - pkim->GetInfluenceDistance(&kim_global_influence_distance); - pkim->GetNeighborListCutoffsPointer(&kim_number_of_cutoffs, - &kim_cutoff_values); + pkim->GetNeighborListPointers(&kim_number_of_neighbor_lists, + &kim_cutoff_values, + &padding_neighbor_hints, + &half_list_hints); if (neighborLists) { delete [] neighborLists; neighborLists = 0; } - neighborLists = new NeighList*[kim_number_of_cutoffs]; + neighborLists = new NeighList*[kim_number_of_neighbor_lists]; kimerror = pargs->SetArgumentPointer( KIM::COMPUTE_ARGUMENT_NAME::numberOfParticles, @@ -932,7 +960,7 @@ void PairKIM::set_kim_model_has_flags() int kimerror = GetComputeArgumentName(i, &computeArgumentName); KIM::SupportStatus supportStatus; kimerror = pargs->GetArgumentSupportStatus(computeArgumentName, - &supportStatus); + &supportStatus); if (computeArgumentName == partialEnergy) kim_model_support_for_energy = supportStatus; @@ -958,12 +986,10 @@ void PairKIM::set_kim_model_has_flags() error->warning(FLERR,"KIM Model does not provide `partialForce'; " "Forces will be zero"); - if ((no_virial_fdotr_compute == 1) && - (kim_model_support_for_virial == notSupported)) + if (kim_model_support_for_virial == notSupported) { error->warning(FLERR,"KIM Model does not provide `partialVirial'. " - "pair_kim now using `LAMMPSvirial' option."); - no_virial_fdotr_compute = 0; + "pair_kim will always use `LAMMPSvirial' option."); } if (kim_model_support_for_particleEnergy == notSupported) diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index a236a3f87a..8929fd2b75 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -12,13 +12,11 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing authors: Ryan S. Elliott, - Valeriu Smirichinski, - Ellad Tadmor (U Minn) + Contributing authors: Ryan S. Elliott (UMinn) ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v1.6.0 (and newer) package + Designed for use with the kim-api-v2.0.0-beta.1 (and newer) package ------------------------------------------------------------------------- */ #ifdef PAIR_CLASS @@ -100,8 +98,10 @@ namespace LAMMPS_NS { bool kim_init_ok; int lmps_local_tot_num_atoms; double kim_global_influence_distance; // KIM Model cutoff value - int kim_number_of_cutoffs; + int kim_number_of_neighbor_lists; double const * kim_cutoff_values; + int const * padding_neighbor_hints; + int const * half_list_hints; class NeighList ** neighborLists; // values set in init_style() From 90a9b7ccd12c1a54daa29f1383cc23a32c8c910b Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 11 Jul 2018 10:29:45 -0700 Subject: [PATCH 0022/1242] Remove pair_kim support for partialVirial - do it w/fdotr --- src/KIM/pair_kim.cpp | 100 ++++++++++++------------------------------- src/KIM/pair_kim.h | 2 +- 2 files changed, 28 insertions(+), 74 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index ca39b5601e..404e4f9cf0 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -57,7 +57,6 @@ PairKIM::PairKIM(LAMMPS *lmp) : pargs(NULL), kim_model_support_for_energy(KIM::SUPPORT_STATUS::notSupported), kim_model_support_for_forces(KIM::SUPPORT_STATUS::notSupported), - kim_model_support_for_virial(KIM::SUPPORT_STATUS::notSupported), kim_model_support_for_particleEnergy(KIM::SUPPORT_STATUS::notSupported), kim_model_support_for_particleVirial(KIM::SUPPORT_STATUS::notSupported), lmps_local_tot_num_atoms(0), @@ -78,6 +77,9 @@ PairKIM::PairKIM(LAMMPS *lmp) : single_enable = 0; // We do not provide the Single() function restartinfo = 0; // We do not write any restart info one_coeff = 1; // We only allow one coeff * * call + // set to 1, regardless use of fdotr, to avoid ev_set()'s futzing with + // vflag_global + no_virial_fdotr_compute = 1; // BEGIN: initial values that determine the KIM state // (used by kim_free(), etc.) @@ -197,25 +199,21 @@ void PairKIM::compute(int eflag , int vflag) kimerror = pkim->Compute(pargs); if (kimerror) error->all(FLERR,"KIM Compute returned error"); - // assemble force and particleVirial if needed - if (!lmps_using_newton) comm->reverse_comm_pair(this); - - if ((no_virial_fdotr_compute == 1) && (vflag_global)) - { // flip sign and order of virial if KIM is computing it - for (int i = 0; i < 3; ++i) virial[i] = -1.0*virial[i]; - double tmp = virial[3]; - virial[3] = -virial[5]; - virial[4] = -virial[4]; - virial[5] = -tmp; - } - else - { // compute virial via LAMMPS fdotr mechanism - if (vflag_fdotr) virial_fdotr_compute(); + // compute virial before reverse comm! + if (vflag_global) + { + virial_fdotr_compute(); } - if ((kim_model_support_for_particleVirial != - KIM::SUPPORT_STATUS::notSupported) && - (vflag_atom)) + // if newton is off, perform reverse comm + if (!lmps_using_newton) + { + comm->reverse_comm_pair(this); + } + + if ((vflag_atom) && + (kim_model_support_for_particleVirial != + KIM::SUPPORT_STATUS::notSupported)) { // flip sign and order of virial if KIM is computing it double tmp; for (int i = 0; i < nall; ++i) @@ -266,9 +264,8 @@ void PairKIM::settings(int narg, char **arg) ++settings_call_count; init_style_call_count = 0; - if (narg != 2) error->all(FLERR,"Illegal pair_style command"); - // arg[0] is the virial handling option: "LAMMPSvirial" or "KIMvirial" - // arg[1] is the KIM Model name + if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + // arg[0] is the KIM Model name lmps_using_molecular = (atom->molecular > 0); @@ -289,35 +286,18 @@ void PairKIM::settings(int narg, char **arg) set_lmps_flags(); // set KIM Model name - int nmlen = strlen(arg[1]); + int nmlen = strlen(arg[0]); if (kim_modelname != 0) { delete [] kim_modelname; kim_modelname = 0; } kim_modelname = new char[nmlen+1]; - strcpy(kim_modelname, arg[1]); + strcpy(kim_modelname, arg[0]); // initialize KIM Model kim_init(); - // set virial handling - if (strcmp(arg[0],"KIMvirial") == 0) - { - if (kim_model_support_for_virial == KIM::SUPPORT_STATUS::notSupported) - no_virial_fdotr_compute = 0; - else - no_virial_fdotr_compute = 1; - } - else if (strcmp(arg[0],"LAMMPSvirial") == 0) - { - no_virial_fdotr_compute = 0; - } - else - { - error->all(FLERR,"Unrecognized virial argument in pair_style command"); - } - return; } @@ -458,13 +438,11 @@ void PairKIM::init_style() if (half_list_hints[i]) { neighbor->requests[irequest]->half = 1; - if (! lmps_using_newton) neighbor->requests[irequest]->newton = 2; neighbor->requests[irequest]->full = 0; } else { neighbor->requests[irequest]->half = 0; - if (! lmps_using_newton) neighbor->requests[irequest]->newton = 0; neighbor->requests[irequest]->full = 1; } if (padding_neighbor_hints[i]) @@ -476,6 +454,9 @@ void PairKIM::init_style() neighbor->requests[irequest]->ghost = 1; } + // always want all owned/ghost pairs + neighbor->requests[irequest]->newton = 2; + // set cutoff neighbor->requests[irequest]->cut = 1; neighbor->requests[irequest]->cutoff = kim_cutoff_values[i] + neighbor->skin; @@ -737,7 +718,6 @@ void PairKIM::kim_init() error->all(FLERR,"KIM ModelCreate failed"); else { if (!requestedUnitsAccepted) { - // @@@ error for now. Fix as needed error->all(FLERR,"KIM Model did not accept the requested unit system"); } @@ -857,27 +837,6 @@ void PairKIM::set_argument_pointers() &(vatom[0][0])); } - // Set KIM pointer appropriately for virial - - if (kim_model_support_for_virial == required) - { - kimerror = kimerror || pargs->SetArgumentPointer(partialVirial, - &(virial[0])); - } - else if ((kim_model_support_for_virial == optional) && - (no_virial_fdotr_compute == 1) && - (vflag_global)) - { - kimerror = kimerror || pargs->SetArgumentPointer(partialVirial, - &(virial[0])); - } - else if (kim_model_support_for_virial == optional) - { - kimerror = kimerror || pargs->SetArgumentPointer( - partialVirial, - reinterpret_cast(NULL)); - } - if (kimerror) { error->all(FLERR,"Unable to set KIM argument pointers"); @@ -966,15 +925,16 @@ void PairKIM::set_kim_model_has_flags() kim_model_support_for_energy = supportStatus; else if (computeArgumentName == partialForces) kim_model_support_for_forces = supportStatus; - else if (computeArgumentName == partialVirial) - kim_model_support_for_virial = supportStatus; else if (computeArgumentName == partialParticleEnergy) kim_model_support_for_particleEnergy = supportStatus; else if (computeArgumentName == partialParticleVirial) kim_model_support_for_particleVirial = supportStatus; else if (supportStatus == required) { - error->all(FLERR,"KIM Model requires unsupported compute argument"); + std::stringstream msg; + msg << "KIM Model requires unsupported compute argument: " + << computeArgumentName.String(); + error->all(FLERR, msg.str().c_str()); } } @@ -986,12 +946,6 @@ void PairKIM::set_kim_model_has_flags() error->warning(FLERR,"KIM Model does not provide `partialForce'; " "Forces will be zero"); - if (kim_model_support_for_virial == notSupported) - { - error->warning(FLERR,"KIM Model does not provide `partialVirial'. " - "pair_kim will always use `LAMMPSvirial' option."); - } - if (kim_model_support_for_particleEnergy == notSupported) error->warning(FLERR,"KIM Model does not provide `partialParticleEnergy'; " "energy per atom will be zero"); diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 8929fd2b75..afba20651d 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -32,6 +32,7 @@ PairStyle(kim,PairKIM) class KIM_API_model; #include "pair.h" #include "KIM_SimulatorHeaders.hpp" +#include namespace LAMMPS_NS { @@ -90,7 +91,6 @@ namespace LAMMPS_NS { // values set in set_kim_model_has_flags(), called by kim_init() KIM::SupportStatus kim_model_support_for_energy; KIM::SupportStatus kim_model_support_for_forces; - KIM::SupportStatus kim_model_support_for_virial; KIM::SupportStatus kim_model_support_for_particleEnergy; KIM::SupportStatus kim_model_support_for_particleVirial; From fcec1498e31bb98313ae10d4afa8802ad72d82fd Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 11 Jul 2018 10:34:07 -0700 Subject: [PATCH 0023/1242] update input example scripts for pair_kim --- ...in.kim.lj.lmp => in.kim.lj.lmp.newton-off} | 2 +- examples/kim/in.kim.lj.lmp.newton-on | 2 +- .../kim/{in.kim.lj => in.kim.lj.newton-off} | 2 +- examples/kim/in.kim.lj.newton-on | 41 +++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) rename examples/kim/{in.kim.lj.lmp => in.kim.lj.lmp.newton-off} (92%) rename examples/kim/{in.kim.lj => in.kim.lj.newton-off} (94%) create mode 100644 examples/kim/in.kim.lj.newton-on diff --git a/examples/kim/in.kim.lj.lmp b/examples/kim/in.kim.lj.lmp.newton-off similarity index 92% rename from examples/kim/in.kim.lj.lmp rename to examples/kim/in.kim.lj.lmp.newton-off index a10e3e2e90..197755294a 100644 --- a/examples/kim/in.kim.lj.lmp +++ b/examples/kim/in.kim.lj.lmp.newton-off @@ -20,7 +20,7 @@ create_atoms 1 box pair_style lj/cut 8.1500 pair_coeff 1 1 0.0104 3.4000 -#pair_style kim KIMvirial LennardJones_Ar +#pair_style kim LennardJones_Ar #pair_coeff * * Ar mass 1 39.95 diff --git a/examples/kim/in.kim.lj.lmp.newton-on b/examples/kim/in.kim.lj.lmp.newton-on index d17bc14984..f9f79e2bb2 100644 --- a/examples/kim/in.kim.lj.lmp.newton-on +++ b/examples/kim/in.kim.lj.lmp.newton-on @@ -20,7 +20,7 @@ create_atoms 1 box pair_style lj/cut 8.1500 pair_coeff 1 1 0.0104 3.4000 -#pair_style kim KIMvirial LennardJones_Ar +#pair_style kim LennardJones_Ar #pair_coeff * * Ar mass 1 39.95 diff --git a/examples/kim/in.kim.lj b/examples/kim/in.kim.lj.newton-off similarity index 94% rename from examples/kim/in.kim.lj rename to examples/kim/in.kim.lj.newton-off index a17ec982da..82cf5ba602 100644 --- a/examples/kim/in.kim.lj +++ b/examples/kim/in.kim.lj.newton-off @@ -26,7 +26,7 @@ create_atoms 1 box #pair_style lj/cut 8.1500 #pair_coeff 1 1 0.0104 3.4000 -pair_style kim KIMvirial LennardJones_Ar +pair_style kim LennardJones_Ar pair_coeff * * Ar mass 1 39.95 diff --git a/examples/kim/in.kim.lj.newton-on b/examples/kim/in.kim.lj.newton-on new file mode 100644 index 0000000000..3a95f1dbb0 --- /dev/null +++ b/examples/kim/in.kim.lj.newton-on @@ -0,0 +1,41 @@ +# 3d Lennard-Jones melt +# +# This example requires that the example models provided with +# the kim-api package are installed. see the ./lib/kim/README or +# ./lib/kim/Install.py files for details on how to install these +# example models. +# + +variable x index 1 +variable y index 1 +variable z index 1 + +variable xx equal 20*$x +variable yy equal 20*$y +variable zz equal 20*$z + +units metal +atom_style atomic +newton on + +lattice fcc 4.4300 +region box block 0 ${xx} 0 ${yy} 0 ${zz} +create_box 1 box +create_atoms 1 box + +#pair_style lj/cut 8.1500 +#pair_coeff 1 1 0.0104 3.4000 + +pair_style kim LennardJones_Ar +pair_coeff * * Ar + +mass 1 39.95 +velocity all create 200.0 232345 loop geom + +neighbor 0.3 bin +neigh_modify delay 0 every 1 check yes + +fix 1 all nve +#fix 1 all npt temp 1.0 1.0 1.0 iso 1.0 1.0 3.0 + +run 100 From af42251142914046b1b2d2f5bb4983704d3ee648 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 11 Jul 2018 13:42:26 -0700 Subject: [PATCH 0024/1242] Update doc/src/pair_kim.txt --- doc/src/pair_kim.txt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index 4599779ca8..a53de79abf 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -10,14 +10,13 @@ pair_style kim command :h3 [Syntax:] -pair_style kim virialmode model :pre +pair_style kim model :pre -virialmode = KIMvirial or LAMMPSvirial model = name of KIM model (potential) [Examples:] -pair_style kim KIMvirial ex_model_Ar_P_LJ +pair_style kim ex_model_Ar_P_LJ pair_coeff * * Ar Ar :pre [Description:] @@ -55,11 +54,6 @@ on how to build LAMMSPS with the kim-api and how to install the example models. :line -The argument {virialmode} determines how the global virial is -calculated. If {KIMvirial} is specified, the KIM model performs the -global virial calculation (if it knows how). If {LAMMPSvirial} is -specified, LAMMPS computes the global virial using its fdotr mechanism. - The argument {model} is the name of the KIM model for a specific potential as KIM defines it. In principle, LAMMPS can invoke any KIM model. You should get an error or warning message from either LAMMPS @@ -121,7 +115,7 @@ LAMMPS was built with that package. See the "Making LAMMPS"_Section_start.html#start_3 section for more info. This current version of pair_style kim is compatible with the -kim-api package version 2.0.0-beta.0 and higher. +kim-api package version 2.0.0-beta.1 and higher. [Related commands:] From 81e33f5f7893bd0ab799fb92a8f12a81f38bc8aa Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 11 Jul 2018 14:25:35 -0700 Subject: [PATCH 0025/1242] Minor fixes & Error message updates in pair_kim.h --- src/KIM/pair_kim.cpp | 13 +++++--- src/KIM/pair_kim.h | 79 ++++++++++++++++++++++++-------------------- 2 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 404e4f9cf0..88f576bad2 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -193,7 +193,7 @@ void PairKIM::compute(int eflag , int vflag) set_argument_pointers(); // set number of particles - lmps_local_tot_num_atoms = (int) (atom->nghost + atom->nlocal); + lmps_local_tot_num_atoms = (int) nall; // compute via KIM model kimerror = pkim->Compute(pargs); @@ -391,7 +391,12 @@ void PairKIM::coeff(int narg, char **arg) if (supported) kim_particle_codes[i] = code; else - error->all(FLERR,"create_kim_particle_codes: symbol not found "); + { + std::stringstream msg; + msg << "create_kim_particle_codes: symbol not found: " + << lmps_unique_elements[i]; + error->all(FLERR, msg.str().c_str()); + } } return; @@ -421,7 +426,7 @@ void PairKIM::init_style() lmps_stripped_neigh_ptr = new int*[kim_number_of_neighbor_lists]; for (int i = 0; i < kim_number_of_neighbor_lists; ++i) { - lmps_stripped_neigh_ptr[0] + lmps_stripped_neigh_ptr[i] = &(lmps_stripped_neigh_list[(i-1)*(neighbor->oneatom)]); } @@ -855,7 +860,7 @@ void PairKIM::set_lmps_flags() // determine if running with pair hybrid if (force->pair_match("hybrid",0)) { - error->all(FLERR,"pair_kim does not support hybrid."); + error->all(FLERR,"pair_kim does not support hybrid"); } // determine unit system and set lmps_units flag diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index afba20651d..bdebfbcad0 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -137,81 +137,88 @@ namespace LAMMPS_NS { /* ERROR/WARNING messages: -E: Illegal ... command +E: Unable to set KIM particle species codes and/or contributing -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. +A low-level kim-api error has occurred. -E: Unrecognized virial argument in pair_style command +E: KIM Compute returned error -Only two options are supported: LAMMPSvirial and KIMvirial +The KIM model was unable, for some reason, to complete the computation. + +E: Illegal pair_style command + +Self-explanatory. E: Incorrect args for pair coefficients -Self-explanatory. Check the input script or data file. +Self-explanatory. -E: Invalid args for non-hybrid pair coefficients +E: create_kim_particle_codes: symbol not found: XX -"NULL" is only supported in pair_coeff calls when using pair hybrid +The KIM model specified does not support the atomic species symbol E: PairKIM only works with 3D problems -This is a current limitation. +Self-explanatory. E: All pair coeffs are not set -All pair coefficients must be set in the data file or by the -pair_coeff command before running a simulation. +Self-explanatory. -E: KIM neighbor iterator exceeded range +E: Unable to destroy Compute Arguments Object -This should not happen. It likely indicates a bug -in the KIM implementation of the interatomic potential -where it is requesting neighbors incorrectly. +A low-level kim-api error has occurred. -E: LAMMPS unit_style lj not supported by KIM models +E: KIM ModelCreate failed -Self-explanatory. Check the input script or data file. +The kim-api was not able to create a model object for the specified model. -E: Unknown unit_style +E: KIM Model did not accept the requested unit system -Self-explanatory. Check the input script or data file. +The KIM Model does not support the specified LAMMPS unit system -W: KIM Model does not provide `energy'; Potential energy will be zero +E: KIM ComputeArgumentsCreate failed + +A low-level kim-api error has occurred. + +E: Unable to register KIM pointers + +A low-level kim-api error has occurred. + +E: Unable to set KIM argument pointers + +A low-level kim-api error has occurred. + +E: pair_kim does not support hybrid Self-explanatory. -W: KIM Model does not provide `forces'; Forces will be zero +E: LAMMPS unit_style lj not suppored by KIM models Self-explanatory. -W: KIM Model does not provide `particleEnergy'; energy per atom will be zero +E: KIM Model requires unsupported compute argument: XXX + +A low-level kim-api error has occurred. + +W: KIM Model does not provide `partialEnergy'; Potential energy will be zero Self-explanatory. -W: KIM Model does not provide `particleVirial'; virial per atom will be zero - - - -E: Test_descriptor_string already allocated - -This is an internal error. Contact the developers. - -U: KIM Model does not provide 'energy'; Potential energy will be zero +W: KIM Model does not provide `partialForce'; Forces will be zero Self-explanatory. -U: KIM Model does not provide 'forces'; Forces will be zero +W: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero Self-explanatory. -U: KIM Model does not provide 'particleEnergy'; energy per atom will be zero +W: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero Self-explanatory. -U: KIM Model does not provide 'particleVirial'; virial per atom will be zero +E: KIM Model requires unsupported compute callback -Self-explanatory. +A low-level kim-api error has occurred. */ From 3e734186016e9ecc8f1ec1a2235fe0ffda904bd1 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 11 Jul 2018 14:57:02 -0700 Subject: [PATCH 0026/1242] Updated example/kim log files --- ....11Jul2018.kim.lj.lmp.newton-off.ubuntu.1} | 22 +++--- ....11Jul2018.kim.lj.lmp.newton-off.ubuntu.4} | 22 +++--- ...g.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1} | 22 +++--- ...g.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4} | 22 +++--- ... log.11Jul2018.kim.lj.newton-off.ubuntu.1} | 33 ++++----- ... log.11Jul2018.kim.lj.newton-off.ubuntu.4} | 46 ++++++------ .../log.11Jul2018.kim.lj.newton-on.ubuntu.1 | 68 +++++++++++++++++ .../log.11Jul2018.kim.lj.newton-on.ubuntu.4 | 74 +++++++++++++++++++ 8 files changed, 223 insertions(+), 86 deletions(-) rename examples/kim/{log.04Jul2018.kim.lj.lmp.ubuntu.1 => log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.1} (74%) rename examples/kim/{log.04Jul2018.kim.lj.lmp.ubuntu.4 => log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.4} (74%) rename examples/kim/{log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1 => log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1} (74%) rename examples/kim/{log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4 => log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4} (74%) rename examples/kim/{log.04Jul2018.kim.lj.ubuntu.1 => log.11Jul2018.kim.lj.newton-off.ubuntu.1} (68%) rename examples/kim/{log.04Jul2018.kim.lj.ubuntu.4 => log.11Jul2018.kim.lj.newton-off.ubuntu.4} (60%) create mode 100644 examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.1 create mode 100644 examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.4 diff --git a/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.1 b/examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.1 similarity index 74% rename from examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.1 rename to examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.1 index 217568072c..bf5864cb08 100644 --- a/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.1 +++ b/examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.1 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[19074,1],0]: A high-performance Open MPI point-to-point messaging module +[[6124,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,7 +16,7 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00251478 secs + Time spent = 0.00263722 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -37,20 +37,20 @@ Per MPI rank memory allocation (min/avg/max) = 20.37 | 20.37 | 20.37 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.6218 on 1 procs for 100 steps with 32000 atoms +Loop time of 2.59913 on 1 procs for 100 steps with 32000 atoms -Performance: 3.295 ns/day, 7.283 hours/ns, 38.142 timesteps/s -99.9% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 3.324 ns/day, 7.220 hours/ns, 38.474 timesteps/s +99.4% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 2.2623 | 2.2623 | 2.2623 | 0.0 | 86.29 -Neigh | 0.31859 | 0.31859 | 0.31859 | 0.0 | 12.15 -Comm | 0.005914 | 0.005914 | 0.005914 | 0.0 | 0.23 -Output | 0.00033105 | 0.00033105 | 0.00033105 | 0.0 | 0.01 -Modify | 0.023461 | 0.023461 | 0.023461 | 0.0 | 0.89 -Other | | 0.01123 | | | 0.43 +Pair | 2.2753 | 2.2753 | 2.2753 | 0.0 | 87.54 +Neigh | 0.28456 | 0.28456 | 0.28456 | 0.0 | 10.95 +Comm | 0.0055908 | 0.0055908 | 0.0055908 | 0.0 | 0.22 +Output | 0.00034594 | 0.00034594 | 0.00034594 | 0.0 | 0.01 +Modify | 0.023011 | 0.023011 | 0.023011 | 0.0 | 0.89 +Other | | 0.01037 | | | 0.40 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.4 b/examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.4 similarity index 74% rename from examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.4 rename to examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.4 index 806c674efb..7f51d447fd 100644 --- a/examples/kim/log.04Jul2018.kim.lj.lmp.ubuntu.4 +++ b/examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.4 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[19098,1],0]: A high-performance Open MPI point-to-point messaging module +[[6116,1],1]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,7 +16,7 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.00123697 secs + Time spent = 0.00125703 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -37,20 +37,20 @@ Per MPI rank memory allocation (min/avg/max) = 8.013 | 8.013 | 8.013 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.88232 on 4 procs for 100 steps with 32000 atoms +Loop time of 2.99901 on 4 procs for 100 steps with 32000 atoms -Performance: 2.998 ns/day, 8.006 hours/ns, 34.694 timesteps/s -24.6% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 2.881 ns/day, 8.331 hours/ns, 33.344 timesteps/s +24.4% CPU use with 4 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 1.3577 | 1.415 | 1.467 | 3.7 | 49.09 -Neigh | 0.25761 | 0.28189 | 0.29894 | 3.2 | 9.78 -Comm | 0.58287 | 0.73218 | 0.85561 | 11.5 | 25.40 -Output | 0.00082721 | 0.0029034 | 0.0051877 | 3.1 | 0.10 -Modify | 0.0058569 | 0.015767 | 0.033242 | 8.6 | 0.55 -Other | | 0.4346 | | | 15.08 +Pair | 1.3704 | 1.4012 | 1.439 | 2.3 | 46.72 +Neigh | 0.252 | 0.27028 | 0.28236 | 2.2 | 9.01 +Comm | 0.66355 | 0.73942 | 0.82223 | 6.5 | 24.66 +Output | 0.0037821 | 0.0090774 | 0.016142 | 5.1 | 0.30 +Modify | 0.0058855 | 0.019317 | 0.044855 | 11.4 | 0.64 +Other | | 0.5597 | | | 18.66 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 diff --git a/examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1 b/examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1 similarity index 74% rename from examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1 rename to examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1 index 70eae36a48..7be22a7f60 100644 --- a/examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.1 +++ b/examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[19053,1],0]: A high-performance Open MPI point-to-point messaging module +[[5635,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,7 +16,7 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00270113 secs + Time spent = 0.00226572 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -37,20 +37,20 @@ Per MPI rank memory allocation (min/avg/max) = 19.23 | 19.23 | 19.23 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.18554 on 1 procs for 100 steps with 32000 atoms +Loop time of 2.26274 on 1 procs for 100 steps with 32000 atoms -Performance: 3.953 ns/day, 6.071 hours/ns, 45.755 timesteps/s -99.6% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 3.818 ns/day, 6.285 hours/ns, 44.194 timesteps/s +99.0% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 2.0006 | 2.0006 | 2.0006 | 0.0 | 91.54 -Neigh | 0.13933 | 0.13933 | 0.13933 | 0.0 | 6.38 -Comm | 0.011122 | 0.011122 | 0.011122 | 0.0 | 0.51 -Output | 0.00020978 | 0.00020978 | 0.00020978 | 0.0 | 0.01 -Modify | 0.022358 | 0.022358 | 0.022358 | 0.0 | 1.02 -Other | | 0.01188 | | | 0.54 +Pair | 2.0589 | 2.0589 | 2.0589 | 0.0 | 90.99 +Neigh | 0.15362 | 0.15362 | 0.15362 | 0.0 | 6.79 +Comm | 0.012277 | 0.012277 | 0.012277 | 0.0 | 0.54 +Output | 0.0003387 | 0.0003387 | 0.0003387 | 0.0 | 0.01 +Modify | 0.02416 | 0.02416 | 0.02416 | 0.0 | 1.07 +Other | | 0.01346 | | | 0.59 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4 b/examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4 similarity index 74% rename from examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4 rename to examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4 index e7157c11b8..d910afbbc2 100644 --- a/examples/kim/log.04Jul2018.kim.lj.lmp.newton-on.ubuntu.4 +++ b/examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[19045,1],0]: A high-performance Open MPI point-to-point messaging module +[[5659,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,7 +16,7 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.00117056 secs + Time spent = 0.00213171 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -37,20 +37,20 @@ Per MPI rank memory allocation (min/avg/max) = 7.632 | 7.632 | 7.632 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.34104 on 4 procs for 100 steps with 32000 atoms +Loop time of 2.44628 on 4 procs for 100 steps with 32000 atoms -Performance: 3.691 ns/day, 6.503 hours/ns, 42.716 timesteps/s -24.0% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 3.532 ns/day, 6.795 hours/ns, 40.878 timesteps/s +24.2% 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.91499 | 0.96396 | 1.0567 | 5.6 | 41.18 -Neigh | 0.092245 | 0.11781 | 0.14572 | 6.0 | 5.03 -Comm | 1.1264 | 1.2287 | 1.2906 | 5.6 | 52.49 -Output | 0.00045199 | 0.00051154 | 0.00060273 | 0.0 | 0.02 -Modify | 0.0058738 | 0.0059629 | 0.0061675 | 0.2 | 0.25 -Other | | 0.02406 | | | 1.03 +Pair | 0.98717 | 1.0434 | 1.1582 | 6.6 | 42.65 +Neigh | 0.10195 | 0.12588 | 0.15258 | 5.2 | 5.15 +Comm | 1.1525 | 1.2449 | 1.3061 | 5.1 | 50.89 +Output | 0.0005828 | 0.00075188 | 0.00087256 | 0.0 | 0.03 +Modify | 0.0057955 | 0.0059132 | 0.006044 | 0.1 | 0.24 +Other | | 0.02542 | | | 1.04 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 diff --git a/examples/kim/log.04Jul2018.kim.lj.ubuntu.1 b/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.1 similarity index 68% rename from examples/kim/log.04Jul2018.kim.lj.ubuntu.1 rename to examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.1 index 3832bd060a..c8c1919de5 100644 --- a/examples/kim/log.04Jul2018.kim.lj.ubuntu.1 +++ b/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.1 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[19111,1],0]: A high-performance Open MPI point-to-point messaging module +[[5713,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,10 +16,9 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00257231 secs -WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) + Time spent = 0.00256546 secs +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -38,22 +37,22 @@ Setting up Verlet run ... Time step : 0.001 Per MPI rank memory allocation (min/avg/max) = 21.26 | 21.26 | 21.26 Mbytes Step Temp E_pair E_mol TotEng Press - 0 200 6290.8194 0 7118.0584 1270.4248 - 100 95.179725 6718.814 0 7112.496 604.59343 -Loop time of 3.22934 on 1 procs for 100 steps with 32000 atoms + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 2.69522 on 1 procs for 100 steps with 32000 atoms -Performance: 2.675 ns/day, 8.970 hours/ns, 30.966 timesteps/s -99.9% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 3.206 ns/day, 7.487 hours/ns, 37.103 timesteps/s +99.8% CPU use with 1 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 2.821 | 2.821 | 2.821 | 0.0 | 87.36 -Neigh | 0.35198 | 0.35198 | 0.35198 | 0.0 | 10.90 -Comm | 0.0081757 | 0.0081757 | 0.0081757 | 0.0 | 0.25 -Output | 0.00030922 | 0.00030922 | 0.00030922 | 0.0 | 0.01 -Modify | 0.032856 | 0.032856 | 0.032856 | 0.0 | 1.02 -Other | | 0.01501 | | | 0.46 +Pair | 2.3655 | 2.3655 | 2.3655 | 0.0 | 87.77 +Neigh | 0.28659 | 0.28659 | 0.28659 | 0.0 | 10.63 +Comm | 0.0061924 | 0.0061924 | 0.0061924 | 0.0 | 0.23 +Output | 0.00034901 | 0.00034901 | 0.00034901 | 0.0 | 0.01 +Modify | 0.025061 | 0.025061 | 0.025061 | 0.0 | 0.93 +Other | | 0.01157 | | | 0.43 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -66,4 +65,4 @@ Total # of neighbors = 2370499 Ave neighs/atom = 74.0781 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:00:03 +Total wall time: 0:00:02 diff --git a/examples/kim/log.04Jul2018.kim.lj.ubuntu.4 b/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.4 similarity index 60% rename from examples/kim/log.04Jul2018.kim.lj.ubuntu.4 rename to examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.4 index 70b2f82812..c8d5faeb20 100644 --- a/examples/kim/log.04Jul2018.kim.lj.ubuntu.4 +++ b/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.4 @@ -1,5 +1,5 @@ -------------------------------------------------------------------------- -[[19135,1],1]: A high-performance Open MPI point-to-point messaging module +[[5673,1],0]: A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces: Module: OpenFabrics (openib) @@ -16,19 +16,15 @@ Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.00154417 secs -WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) -WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) -WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) -WARNING: KIM Model does not provide `partialVirial'. pair_kim will always use `LAMMPSvirial' option. (../pair_kim.cpp:987) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:992) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:996) + Time spent = 0.00215514 secs +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -47,22 +43,22 @@ Setting up Verlet run ... Time step : 0.001 Per MPI rank memory allocation (min/avg/max) = 8.528 | 8.528 | 8.528 Mbytes Step Temp E_pair E_mol TotEng Press - 0 200 6290.8194 0 7118.0584 1270.4248 - 100 95.179725 6718.814 0 7112.496 604.59343 -Loop time of 3.17877 on 4 procs for 100 steps with 32000 atoms + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 3.06157 on 4 procs for 100 steps with 32000 atoms -Performance: 2.718 ns/day, 8.830 hours/ns, 31.459 timesteps/s -24.3% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 2.822 ns/day, 8.504 hours/ns, 32.663 timesteps/s +24.4% CPU use with 4 MPI tasks x no OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 2.0514 | 2.1009 | 2.1859 | 3.6 | 66.09 -Neigh | 0.29304 | 0.31706 | 0.33568 | 2.7 | 9.97 -Comm | 0.61926 | 0.72709 | 0.77083 | 7.3 | 22.87 -Output | 0.00035457 | 0.00043741 | 0.000547 | 0.0 | 0.01 -Modify | 0.0066107 | 0.0067653 | 0.0069097 | 0.1 | 0.21 -Other | | 0.02653 | | | 0.83 +Pair | 1.9964 | 2.0369 | 2.084 | 2.5 | 66.53 +Neigh | 0.25048 | 0.27467 | 0.29605 | 3.1 | 8.97 +Comm | 0.66611 | 0.71603 | 0.74496 | 3.6 | 23.39 +Output | 0.00048383 | 0.00070085 | 0.00098836 | 0.0 | 0.02 +Modify | 0.0064885 | 0.0065907 | 0.006806 | 0.2 | 0.22 +Other | | 0.02664 | | | 0.87 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 diff --git a/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.1 b/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.1 new file mode 100644 index 0000000000..21af1a6299 --- /dev/null +++ b/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.1 @@ -0,0 +1,68 @@ +-------------------------------------------------------------------------- +[[5690,1],0]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 1 by 1 MPI processor grid +Created 32000 atoms + Time spent = 0.00258302 secs +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: half, newton off, cut 8.45 + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 20.87 | 20.87 | 20.87 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 2.7052 on 1 procs for 100 steps with 32000 atoms + +Performance: 3.194 ns/day, 7.514 hours/ns, 36.966 timesteps/s +99.6% CPU use with 1 MPI tasks x no OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.3715 | 2.3715 | 2.3715 | 0.0 | 87.67 +Neigh | 0.28386 | 0.28386 | 0.28386 | 0.0 | 10.49 +Comm | 0.012808 | 0.012808 | 0.012808 | 0.0 | 0.47 +Output | 0.00033716 | 0.00033716 | 0.00033716 | 0.0 | 0.01 +Modify | 0.02349 | 0.02349 | 0.02349 | 0.0 | 0.87 +Other | | 0.01317 | | | 0.49 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 19911 ave 19911 max 19911 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 2.3705e+06 ave 2.3705e+06 max 2.3705e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 2370499 +Ave neighs/atom = 74.0781 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:02 diff --git a/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.4 b/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.4 new file mode 100644 index 0000000000..1214436d4d --- /dev/null +++ b/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.4 @@ -0,0 +1,74 @@ +-------------------------------------------------------------------------- +[[5682,1],0]: A high-performance Open MPI point-to-point messaging module +was unable to find any relevant network interfaces: + +Module: OpenFabrics (openib) + Host: ubuntu-artful + +Another transport will be used instead, although this may result in +lower performance. + +NOTE: You can disable this warning by setting the MCA parameter +btl_base_warn_component_unused to 0. +-------------------------------------------------------------------------- +LAMMPS (22 Jun 2018) +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 2 by 2 MPI processor grid +Created 32000 atoms + Time spent = 0.00322684 secs +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: half, newton off, cut 8.45 + pair build: half/bin/newtoff + stencil: half/bin/3d/newtoff + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 8.263 | 8.263 | 8.263 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 3.1366 on 4 procs for 100 steps with 32000 atoms + +Performance: 2.755 ns/day, 8.713 hours/ns, 31.882 timesteps/s +23.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 | 1.3641 | 1.4213 | 1.4783 | 3.5 | 45.31 +Neigh | 0.25408 | 0.27714 | 0.29697 | 3.2 | 8.84 +Comm | 1.3588 | 1.4045 | 1.4806 | 4.0 | 44.78 +Output | 0.00055232 | 0.00072915 | 0.00087484 | 0.0 | 0.02 +Modify | 0.0061178 | 0.0062019 | 0.0062811 | 0.1 | 0.20 +Other | | 0.02673 | | | 0.85 + +Nlocal: 8000 ave 8018 max 7967 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 9131 ave 9164 max 9113 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Neighs: 630904 ave 632094 max 628209 min +Histogram: 1 0 0 0 0 0 0 1 0 2 + +Total # of neighbors = 2523614 +Ave neighs/atom = 78.8629 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:03 From 67e6afaab2b75f5a39c34edb7221d4a4672c69e4 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 11 Jul 2018 15:04:34 -0700 Subject: [PATCH 0027/1242] Update to KIM kim-api-v2.0.0-beta.1 --- cmake/CMakeLists.txt | 4 ++-- lib/kim/Install.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 4672b4a3db..be5bc74f1c 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -407,8 +407,8 @@ if(PKG_KIM) if(DOWNLOAD_KIM) include(ExternalProject) ExternalProject_Add(kim_build - URL https://github.com/openkim/kim-api/archive/v2.0.0-beta.0.tar.gz - URL_MD5 2c099fe2603fda9a6904fc50d626f71b + URL https://github.com/openkim/kim-api/archive/v2.0.0-beta.1.tar.gz + URL_MD5 633e331cc7942c1f0462da71f41f94be BUILD_IN_SOURCE 1 CONFIGURE_COMMAND /configure --prefix= ) diff --git a/lib/kim/Install.py b/lib/kim/Install.py index f9eb1c5eed..da0dcd2789 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -21,7 +21,7 @@ Syntax from lib dir: python Install.py -b -v version -a kim-name specify one or more options, order does not matter -v = version of KIM API library to use - default = kim-api-v2.0.0-beta.0 (current as of June 2018) + default = kim-api-v2.0.0-beta.1 (current as of July 2018) -b = download and build base KIM API library with example Models this will delete any previous installation in the current folder -n = do NOT download and build base KIM API library. @@ -109,7 +109,7 @@ nargs = len(args) if nargs == 0: error() thisdir = os.environ['PWD'] -version = "kim-api-v2.0.0-beta.0" +version = "kim-api-v2.0.0-beta.1" buildflag = False everythingflag = False From e37e9cfa2f0b1dff19e5114cb2a2f2b992be83a0 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 16 Jul 2018 19:46:00 -0500 Subject: [PATCH 0028/1242] Add virtual set_contributing() to pair_kim --- src/KIM/pair_kim.cpp | 15 +++++++++++++-- src/KIM/pair_kim.h | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 88f576bad2..6d30cff01d 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -142,6 +142,16 @@ PairKIM::~PairKIM() return; } +/* ---------------------------------------------------------------------- */ +void PairKIM::set_contributing() +{ + int const nall = atom->nlocal + atom->nghost; + for (int i = 0; i < nall; ++i) + { + kim_particleContributing[i] = ( (i < atom->nlocal) ? 1 : 0 ); + } +} + /* ---------------------------------------------------------------------- */ void PairKIM::compute(int eflag , int vflag) @@ -185,10 +195,11 @@ void PairKIM::compute(int eflag , int vflag) for (int i = 0; i < nall; i++) { ielement = lmps_map_species_to_unique[species[i]]; kim_particleSpecies[i] = kim_particle_codes[ielement]; - - kim_particleContributing[i] = ( (inlocal) ? 1 : 0 ); } + // Set kim contributing flags + set_contributing(); + // pass current atom pointers to KIM set_argument_pointers(); diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index bdebfbcad0..59f477b1e4 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -117,6 +117,7 @@ namespace LAMMPS_NS { int** lmps_stripped_neigh_ptr; // pointer into lists // KIM specific helper functions + virtual void set_contributing(); void kim_init(); void kim_free(); void set_argument_pointers(); From 62c8ba78249790e629cd78b0ad3553432ed4887b Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 16 Jul 2018 21:21:28 -0500 Subject: [PATCH 0029/1242] pair_kim : private to protected and add virtual to all routines --- src/KIM/pair_kim.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 59f477b1e4..79b8c5d792 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -53,7 +53,7 @@ namespace LAMMPS_NS { virtual void unpack_reverse_comm(int, int*, double*); virtual double memory_usage(); - private: + protected: // (nearly) all bool flags are not initialized in constructor, but set // explicitly in the indicated function. All other data members are // initialized in constructor @@ -66,7 +66,7 @@ namespace LAMMPS_NS { // values set in coeff() // values set in allocate(), called by coeff() - void allocate(); + virtual void allocate(); int* lmps_map_species_to_unique; // values set in coeff(), after calling allocate() @@ -118,13 +118,13 @@ namespace LAMMPS_NS { // KIM specific helper functions virtual void set_contributing(); - void kim_init(); - void kim_free(); - void set_argument_pointers(); - void set_lmps_flags(); - void set_kim_model_has_flags(); + virtual void kim_init(); + virtual void kim_free(); + virtual void set_argument_pointers(); + virtual void set_lmps_flags(); + virtual void set_kim_model_has_flags(); // static methods used as callbacks from KIM - static int get_neigh( + static int get_neigh( void const * const dataObject, int const numberOfCutoffs, double const * const cutoffs, int const neighborListIndex, int const particleNumber, From c0a7cabcba95f9a16b95ac6e8bf659b9db34eab1 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 18 Jul 2018 22:15:23 -0500 Subject: [PATCH 0030/1242] Added GPLv2 exception to link to kim-api in pair_kim.* --- src/KIM/pair_kim.cpp | 34 ++++++++++++++++++++++++++++++++++ src/KIM/pair_kim.h | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 6d30cff01d..39f3c4a240 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -15,6 +15,40 @@ Contributing authors: Ryan S. Elliott (UMinn) ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + 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 ------------------------------------------------------------------------- */ diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 79b8c5d792..b6d3489c71 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -15,6 +15,40 @@ Contributing authors: Ryan S. Elliott (UMinn) ------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + 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 ------------------------------------------------------------------------- */ From dde0974a1aac9c48ce164c5f57813c381f4119a2 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 13 Aug 2018 22:34:42 -0500 Subject: [PATCH 0031/1242] Update for corrected neighbor list hint --- src/KIM/pair_kim.cpp | 28 ++++++++++------------------ src/KIM/pair_kim.h | 5 ++--- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 39f3c4a240..a298187c12 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -97,8 +97,7 @@ PairKIM::PairKIM(LAMMPS *lmp) : kim_global_influence_distance(0.0), kim_number_of_neighbor_lists(0), kim_cutoff_values(NULL), - padding_neighbor_hints(NULL), - half_list_hints(NULL), + modelWillNotRequestNeighborsOfNoncontributingParticles(NULL), neighborLists(NULL), kim_particle_codes(NULL), lmps_maxalloc(0), @@ -480,22 +479,15 @@ void PairKIM::init_style() // make sure comm_reverse expects (at most) 9 values when newton is off if (!lmps_using_newton) comm_reverse_off = 9; - // request full neighbor lists (unless hints allow for better alternatives) + // request full neighbor for (int i = 0; i < kim_number_of_neighbor_lists; ++i) { int irequest = neighbor->request(this,instance_me); neighbor->requests[irequest]->id = i; - if (half_list_hints[i]) - { - neighbor->requests[irequest]->half = 1; - neighbor->requests[irequest]->full = 0; - } - else - { - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - } - if (padding_neighbor_hints[i]) + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + if (modelWillNotRequestNeighborsOfNoncontributingParticles[i]) { neighbor->requests[irequest]->ghost = 0; } @@ -787,10 +779,10 @@ void PairKIM::kim_init() set_kim_model_has_flags(); pkim->GetInfluenceDistance(&kim_global_influence_distance); - pkim->GetNeighborListPointers(&kim_number_of_neighbor_lists, - &kim_cutoff_values, - &padding_neighbor_hints, - &half_list_hints); + pkim->GetNeighborListPointers( + &kim_number_of_neighbor_lists, + &kim_cutoff_values, + &modelWillNotRequestNeighborsOfNoncontributingParticles); if (neighborLists) { delete [] neighborLists; diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index b6d3489c71..e2be0855db 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -134,9 +134,8 @@ namespace LAMMPS_NS { double kim_global_influence_distance; // KIM Model cutoff value int kim_number_of_neighbor_lists; double const * kim_cutoff_values; - int const * padding_neighbor_hints; - int const * half_list_hints; - class NeighList ** neighborLists; + int const * modelWillNotRequestNeighborsOfNoncontributingParticles; + class NeighList ** neighborLists; // values set in init_style() bool kim_particle_codes_ok; From 062c1a04fcc129f2ba61edaac2f7b35e07e11e81 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 14 Aug 2018 14:42:01 -0600 Subject: [PATCH 0032/1242] Commit JT 081418 - initial commit pppm_spin branch - copied short_range spin files (src/SPIN) - copied/renamed Stan's file (from pppm_dipole branch) --- src/DIPOLE/pair_lj_cut_dipole_long.cpp | 2 +- src/KSPACE/pppm.h | 8 +- src/KSPACE/pppm_spin.cpp | 2559 ++++++++++++++++++++++++ src/KSPACE/pppm_spin.h | 213 ++ src/SPIN/pair_spin_long.cpp | 550 +++++ src/SPIN/pair_spin_long.h | 97 + src/kspace.cpp | 4 +- src/kspace.h | 2 +- 8 files changed, 3427 insertions(+), 8 deletions(-) create mode 100644 src/KSPACE/pppm_spin.cpp create mode 100644 src/KSPACE/pppm_spin.h create mode 100644 src/SPIN/pair_spin_long.cpp create mode 100644 src/SPIN/pair_spin_long.h diff --git a/src/DIPOLE/pair_lj_cut_dipole_long.cpp b/src/DIPOLE/pair_lj_cut_dipole_long.cpp index 817a120e3d..a0e7c1c4ec 100644 --- a/src/DIPOLE/pair_lj_cut_dipole_long.cpp +++ b/src/DIPOLE/pair_lj_cut_dipole_long.cpp @@ -44,7 +44,7 @@ using namespace MathConst; PairLJCutDipoleLong::PairLJCutDipoleLong(LAMMPS *lmp) : Pair(lmp) { single_enable = 0; - ewaldflag = dipoleflag = 1; + ewaldflag = pppmflag = dipoleflag = 1; respa_enable = 0; } diff --git a/src/KSPACE/pppm.h b/src/KSPACE/pppm.h index 9cb6bebb25..c6d463b69c 100644 --- a/src/KSPACE/pppm.h +++ b/src/KSPACE/pppm.h @@ -41,7 +41,7 @@ class PPPM : public KSpace { virtual ~PPPM(); virtual void init(); virtual void setup(); - void setup_grid(); + virtual void setup_grid(); virtual void compute(int, int); virtual int timing_1d(int, double &); virtual int timing_3d(int, double &); @@ -105,10 +105,10 @@ class PPPM : public KSpace { double qdist; // distance from O site to negative charge double alpha; // geometric factor - void set_grid_global(); + virtual void set_grid_global(); void set_grid_local(); void adjust_gewald(); - double newton_raphson_f(); + virtual double newton_raphson_f(); double derivf(); double final_accuracy(); @@ -145,7 +145,7 @@ class PPPM : public KSpace { void compute_drho1d(const FFT_SCALAR &, const FFT_SCALAR &, const FFT_SCALAR &); void compute_rho_coeff(); - void slabcorr(); + virtual void slabcorr(); // grid communication diff --git a/src/KSPACE/pppm_spin.cpp b/src/KSPACE/pppm_spin.cpp new file mode 100644 index 0000000000..32e91cc9b2 --- /dev/null +++ b/src/KSPACE/pppm_spin.cpp @@ -0,0 +1,2559 @@ +/* ---------------------------------------------------------------------- + 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: Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "pppm_dipole.h" +#include "atom.h" +#include "comm.h" +#include "gridcomm.h" +#include "neighbor.h" +#include "force.h" +#include "pair.h" +#include "bond.h" +#include "angle.h" +#include "domain.h" +#include "fft3d_wrap.h" +#include "remap_wrap.h" +#include "memory.h" +#include "error.h" +#include "update.h" + +#include "math_const.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define MAXORDER 7 +#define OFFSET 16384 +#define LARGE 10000.0 +#define SMALL 0.00001 +#define EPS_HOC 1.0e-7 + +enum{REVERSE_MU}; +enum{FORWARD_MU,FORWARD_MU_PERATOM}; + +#ifdef FFT_SINGLE +#define ZEROF 0.0f +#define ONEF 1.0f +#else +#define ZEROF 0.0 +#define ONEF 1.0 +#endif + +/* ---------------------------------------------------------------------- */ + +PPPMDipole::PPPMDipole(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), + densityx_brick_dipole(NULL), densityy_brick_dipole(NULL), + densityz_brick_dipole(NULL), ux_brick_dipole(NULL), + uy_brick_dipole(NULL), uz_brick_dipole(NULL), vdxx_brick_dipole(NULL), + vdxy_brick_dipole(NULL), vdyy_brick_dipole(NULL), + vdxz_brick_dipole(NULL), vdyz_brick_dipole(NULL), + vdzz_brick_dipole(NULL), v0x_brick_dipole(NULL), v1x_brick_dipole(NULL), + v2x_brick_dipole(NULL), v3x_brick_dipole(NULL), v4x_brick_dipole(NULL), + v5x_brick_dipole(NULL), v0y_brick_dipole(NULL), v1y_brick_dipole(NULL), + v2y_brick_dipole(NULL), v3y_brick_dipole(NULL), v4y_brick_dipole(NULL), + v5y_brick_dipole(NULL), v0z_brick_dipole(NULL), v1z_brick_dipole(NULL), + v2z_brick_dipole(NULL), v3z_brick_dipole(NULL), v4z_brick_dipole(NULL), + v5z_brick_dipole(NULL), work3(NULL), work4(NULL), + densityx_fft_dipole(NULL), densityy_fft_dipole(NULL), + densityz_fft_dipole(NULL) +{ + dipoleflag = 1; + group_group_enable = 0; + + cg_dipole = NULL; + cg_peratom_dipole = NULL; +} + +/* ---------------------------------------------------------------------- + free all memory +------------------------------------------------------------------------- */ + +PPPMDipole::~PPPMDipole() +{ + if (copymode) return; + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + fft1 = NULL; + fft2 = NULL; + remap = NULL; + cg_dipole = NULL; +} + +/* ---------------------------------------------------------------------- + called once before run +------------------------------------------------------------------------- */ + +void PPPMDipole::init() +{ + if (me == 0) { + if (screen) fprintf(screen,"PPPMDipole initialization ...\n"); + if (logfile) fprintf(logfile,"PPPMDipole initialization ...\n"); + } + + // error check + + dipoleflag = atom->mu?1:0; + qsum_qsq(0); + if (dipoleflag && q2) + error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMDipole"); + + triclinic_check(); + + if (triclinic != domain->triclinic) + error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); + + if (domain->dimension == 2) error->all(FLERR, + "Cannot use PPPMDipole with 2d simulation"); + if (comm->style != 0) + error->universe_all(FLERR,"PPPMDipole can only currently be used with " + "comm_style brick"); + + if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); + + if (atom->mu && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" + " ad with dipoles"); + + if (dipoleflag && strcmp(update->unit_style,"electron") == 0) + error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); + } + + if (order < 2 || order > MAXORDER) { + char str[128]; + sprintf(str,"PPPMDipole order cannot be < 2 or > than %d",MAXORDER); + error->all(FLERR,str); + } + + // extract short-range Coulombic cutoff from pair style + + triclinic = domain->triclinic; + if (triclinic) + error->all(FLERR,"Cannot yet use triclinic cells with PPPMDipole"); + + pair_check(); + + int itmp = 0; + double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + if (p_cutoff == NULL) + error->all(FLERR,"KSpace style is incompatible with Pair style"); + cutoff = *p_cutoff; + + // kspace TIP4P not yet supported + + if (tip4pflag) + error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); + + // compute qsum & qsqsum and warn if not charge-neutral + + scale = 1.0; + qqrd2e = force->qqrd2e; + musum_musq(); + natoms_original = atom->natoms; + + // set accuracy (force units) from accuracy_relative or accuracy_absolute + + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; + else accuracy = accuracy_relative * two_charge_force; + + // free all arrays previously allocated + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + + // setup FFT grid resolution and g_ewald + // normally one iteration thru while loop is all that is required + // if grid stencil does not extend beyond neighbor proc + // or overlap is allowed, then done + // else reduce order and try again + + int (*procneigh)[2] = comm->procneigh; + + GridComm *cgtmp = NULL; + int iteration = 0; + + while (order >= minorder) { + if (iteration && me == 0) + error->warning(FLERR,"Reducing PPPMDipole order b/c stencil extends " + "beyond nearest neighbor processor"); + + compute_gf_denom(); + set_grid_global(); + set_grid_local(); + if (overlap_allowed) break; + + cgtmp = new GridComm(lmp,world,1,1, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, + procneigh[0][0],procneigh[0][1],procneigh[1][0], + procneigh[1][1],procneigh[2][0],procneigh[2][1]); + cgtmp->ghost_notify(); + if (!cgtmp->ghost_overlap()) break; + delete cgtmp; + + order--; + iteration++; + } + + if (order < minorder) error->all(FLERR,"PPPMDipole order < minimum allowed order"); + if (!overlap_allowed && cgtmp->ghost_overlap()) + error->all(FLERR,"PPPMDipole grid stencil extends " + "beyond nearest neighbor processor"); + if (cgtmp) delete cgtmp; + + // adjust g_ewald + + if (!gewaldflag) adjust_gewald(); + + // calculate the final accuracy + + double estimated_accuracy = final_accuracy_dipole(); + + // print stats + + int ngrid_max,nfft_both_max; + MPI_Allreduce(&ngrid,&ngrid_max,1,MPI_INT,MPI_MAX,world); + MPI_Allreduce(&nfft_both,&nfft_both_max,1,MPI_INT,MPI_MAX,world); + + if (me == 0) { + +#ifdef FFT_SINGLE + const char fft_prec[] = "single"; +#else + const char fft_prec[] = "double"; +#endif + + if (screen) { + fprintf(screen," G vector (1/distance) = %g\n",g_ewald); + fprintf(screen," grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm); + fprintf(screen," stencil order = %d\n",order); + fprintf(screen," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(screen," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(screen," using %s precision FFTs\n",fft_prec); + fprintf(screen," 3d grid and FFT values/proc = %d %d\n", + ngrid_max,nfft_both_max); + } + if (logfile) { + fprintf(logfile," G vector (1/distance) = %g\n",g_ewald); + fprintf(logfile," grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm); + fprintf(logfile," stencil order = %d\n",order); + fprintf(logfile," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(logfile," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(logfile," using %s precision FFTs\n",fft_prec); + fprintf(logfile," 3d grid and FFT values/proc = %d %d\n", + ngrid_max,nfft_both_max); + } + } + + // allocate K-space dependent memory + // don't invoke allocate peratom(), will be allocated when needed + + allocate(); + cg_dipole->ghost_notify(); + cg_dipole->setup(); + + // pre-compute Green's function denomiator expansion + // pre-compute 1d charge distribution coefficients + + compute_gf_denom(); + compute_rho_coeff(); +} + +/* ---------------------------------------------------------------------- + adjust PPPMDipole coeffs, called initially and whenever volume has changed +------------------------------------------------------------------------- */ + +void PPPMDipole::setup() +{ + // perform some checks to avoid illegal boundaries with read_data + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); + } + + int i,j,k,n; + double *prd; + + // volume-dependent factors + // adjust z dimension for 2d slab PPPMDipole + // z dimension for 3d PPPMDipole is zprd since slab_volfactor = 1.0 + + prd = domain->prd; + double xprd = prd[0]; + double yprd = prd[1]; + double zprd = prd[2]; + double zprd_slab = zprd*slab_volfactor; + volume = xprd * yprd * zprd_slab; + + delxinv = nx_pppm/xprd; + delyinv = ny_pppm/yprd; + delzinv = nz_pppm/zprd_slab; + + delvolinv = delxinv*delyinv*delzinv; + + double unitkx = (MY_2PI/xprd); + double unitky = (MY_2PI/yprd); + double unitkz = (MY_2PI/zprd_slab); + + // fkx,fky,fkz for my FFT grid pts + + double per; + + for (i = nxlo_fft; i <= nxhi_fft; i++) { + per = i - nx_pppm*(2*i/nx_pppm); + fkx[i] = unitkx*per; + } + + for (i = nylo_fft; i <= nyhi_fft; i++) { + per = i - ny_pppm*(2*i/ny_pppm); + fky[i] = unitky*per; + } + + for (i = nzlo_fft; i <= nzhi_fft; i++) { + per = i - nz_pppm*(2*i/nz_pppm); + fkz[i] = unitkz*per; + } + + // virial coefficients + + double sqk,vterm; + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) { + for (j = nylo_fft; j <= nyhi_fft; j++) { + for (i = nxlo_fft; i <= nxhi_fft; i++) { + sqk = fkx[i]*fkx[i] + fky[j]*fky[j] + fkz[k]*fkz[k]; + if (sqk == 0.0) { + vg[n][0] = 0.0; + vg[n][1] = 0.0; + vg[n][2] = 0.0; + vg[n][3] = 0.0; + vg[n][4] = 0.0; + vg[n][5] = 0.0; + } else { + vterm = -2.0 * (1.0/sqk + 0.25/(g_ewald*g_ewald)); + vg[n][0] = 1.0 + vterm*fkx[i]*fkx[i]; + vg[n][1] = 1.0 + vterm*fky[j]*fky[j]; + vg[n][2] = 1.0 + vterm*fkz[k]*fkz[k]; + vg[n][3] = vterm*fkx[i]*fky[j]; + vg[n][4] = vterm*fkx[i]*fkz[k]; + vg[n][5] = vterm*fky[j]*fkz[k]; + } + n++; + } + } + } + + compute_gf_dipole(); +} + +/* ---------------------------------------------------------------------- + reset local grid arrays and communication stencils + called by fix balance b/c it changed sizes of processor sub-domains +------------------------------------------------------------------------- */ + +void PPPMDipole::setup_grid() +{ + // free all arrays previously allocated + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + + // reset portion of global grid that each proc owns + + set_grid_local(); + + // reallocate K-space dependent memory + // check if grid communication is now overlapping if not allowed + // don't invoke allocate peratom(), will be allocated when needed + + allocate(); + + cg_dipole->ghost_notify(); + if (overlap_allowed == 0 && cg_dipole->ghost_overlap()) + error->all(FLERR,"PPPMDipole grid stencil extends " + "beyond nearest neighbor processor"); + cg_dipole->setup(); + + // pre-compute Green's function denomiator expansion + // pre-compute 1d charge distribution coefficients + + compute_gf_denom(); + compute_rho_coeff(); + + // pre-compute volume-dependent coeffs + + setup(); +} + +/* ---------------------------------------------------------------------- + compute the PPPMDipole long-range force, energy, virial +------------------------------------------------------------------------- */ + +void PPPMDipole::compute(int eflag, int vflag) +{ + int i,j; + + // 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; + + if (evflag_atom && !peratom_allocate_flag) { + allocate_peratom(); + cg_peratom_dipole->ghost_notify(); + cg_peratom_dipole->setup(); + } + + // if atom count has changed, update qsum and qsqsum + + if (atom->natoms != natoms_original) { + musum_musq(); + natoms_original = atom->natoms; + } + + // return if there are no dipoles + + if (musqsum == 0.0) return; + + // convert atoms from box to lamda coords + + boxlo = domain->boxlo; + + // extend size of per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(part2grid); + nmax = atom->nmax; + memory->create(part2grid,nmax,3,"pppm_dipole:part2grid"); + } + + // find grid points for all my particles + // map my particle charge onto my local 3d density grid + + particle_map(); + make_rho_dipole(); + + // all procs communicate density values from their ghost cells + // to fully sum contribution in their 3d bricks + // remap from 3d decomposition to FFT decomposition + + cg_dipole->reverse_comm(this,REVERSE_MU); + brick2fft_dipole(); + + // compute potential gradient on my FFT grid and + // portion of e_long on this proc's FFT grid + // return gradients (electric fields) in 3d brick decomposition + // also performs per-atom calculations via poisson_peratom() + + poisson_ik_dipole(); + + // all procs communicate E-field values + // to fill ghost cells surrounding their 3d bricks + + cg_dipole->forward_comm(this,FORWARD_MU); + + // extra per-atom energy/virial communication + + if (evflag_atom) { + cg_peratom_dipole->forward_comm(this,FORWARD_MU_PERATOM); + } + + // calculate the force on my particles + + fieldforce_ik_dipole(); + + // extra per-atom energy/virial communication + + if (evflag_atom) fieldforce_peratom_dipole(); + + // sum global energy across procs and add in volume-dependent term + + const double qscale = qqrd2e * scale; + const double g3 = g_ewald*g_ewald*g_ewald; + + if (eflag_global) { + double energy_all; + MPI_Allreduce(&energy,&energy_all,1,MPI_DOUBLE,MPI_SUM,world); + energy = energy_all; + + energy *= 0.5*volume; + energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy *= qscale; + } + + // sum global virial across procs + + if (vflag_global) { + double virial_all[6]; + MPI_Allreduce(virial,virial_all,6,MPI_DOUBLE,MPI_SUM,world); + for (i = 0; i < 6; i++) virial[i] = 0.5*qscale*volume*virial_all[i]; + } + + // per-atom energy/virial + // energy includes self-energy correction + + if (evflag_atom) { + double *q = atom->q; + double **mu = atom->mu; + int nlocal = atom->nlocal; + int ntotal = nlocal; + + if (eflag_atom) { + for (i = 0; i < nlocal; i++) { + eatom[i] *= 0.5; + eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; + eatom[i] *= qscale; + } + } + + if (vflag_atom) { + for (i = 0; i < ntotal; i++) + for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*qscale; + } + } + + // 2d slab correction + + if (slabflag == 1) slabcorr(); +} + +/* ---------------------------------------------------------------------- + allocate memory that depends on # of K-vectors and order +------------------------------------------------------------------------- */ + +void PPPMDipole::allocate() +{ + memory->create3d_offset(densityx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityx_brick_dipole"); + memory->create3d_offset(densityy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityy_brick_dipole"); + memory->create3d_offset(densityz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityz_brick_dipole"); + + memory->create(densityx_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); + memory->create(densityy_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); + memory->create(densityz_fft_dipole,nfft_both,"pppm_dipole:densityz_fft_dipole"); + + memory->create(greensfn,nfft_both,"pppm_dipole:greensfn"); + memory->create(work1,2*nfft_both,"pppm_dipole:work1"); + memory->create(work2,2*nfft_both,"pppm_dipole:work2"); + memory->create(work3,2*nfft_both,"pppm_dipole:work3"); + memory->create(work4,2*nfft_both,"pppm_dipole:work4"); + memory->create(vg,nfft_both,6,"pppm_dipole:vg"); + + memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_dipole:fkx"); + memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_dipole:fky"); + memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_dipole:fkz"); + + memory->create3d_offset(ux_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:ux_brick_dipole"); + memory->create3d_offset(uy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:uy_brick_dipole"); + memory->create3d_offset(uz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:uz_brick_dipole"); + + memory->create3d_offset(vdxx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxx_brick_dipole"); + memory->create3d_offset(vdxy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxy_brick_dipole"); + memory->create3d_offset(vdyy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdyy_brick_dipole"); + memory->create3d_offset(vdxz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxz_brick_dipole"); + memory->create3d_offset(vdyz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdyz_brick_dipole"); + memory->create3d_offset(vdzz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdzz_brick_dipole"); + + // summation coeffs + + order_allocated = order; + memory->create(gf_b,order,"pppm_dipole:gf_b"); + memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_dipole:rho1d"); + memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_dipole:drho1d"); + memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_dipole:rho_coeff"); + memory->create2d_offset(drho_coeff,order,(1-order)/2,order/2, + "pppm_dipole:drho_coeff"); + + // create 2 FFTs and a Remap + // 1st FFT keeps data in FFT decompostion + // 2nd FFT returns data in 3d brick decomposition + // remap takes data from 3d brick to FFT decomposition + + int tmp; + + fft1 = new FFT3d(lmp,world,nx_pppm,ny_pppm,nz_pppm, + nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft, + nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft, + 0,0,&tmp,collective_flag); + + fft2 = new FFT3d(lmp,world,nx_pppm,ny_pppm,nz_pppm, + nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + 0,0,&tmp,collective_flag); + + remap = new Remap(lmp,world, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_fft,nxhi_fft,nylo_fft,nyhi_fft,nzlo_fft,nzhi_fft, + 1,0,0,FFT_PRECISION,collective_flag); + + // create ghost grid object for rho and electric field communication + + int (*procneigh)[2] = comm->procneigh; + + cg_dipole = new GridComm(lmp,world,9,3, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, + procneigh[0][0],procneigh[0][1],procneigh[1][0], + procneigh[1][1],procneigh[2][0],procneigh[2][1]); +} + +/* ---------------------------------------------------------------------- + deallocate memory that depends on # of K-vectors and order +------------------------------------------------------------------------- */ + +void PPPMDipole::deallocate() +{ + memory->destroy3d_offset(densityx_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy3d_offset(ux_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy3d_offset(vdxx_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdzz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy(densityx_fft_dipole); + memory->destroy(densityy_fft_dipole); + memory->destroy(densityz_fft_dipole); + + memory->destroy(greensfn); + memory->destroy(work1); + memory->destroy(work2); + memory->destroy(work3); + memory->destroy(work4); + memory->destroy(vg); + + memory->destroy1d_offset(fkx,nxlo_fft); + memory->destroy1d_offset(fky,nylo_fft); + memory->destroy1d_offset(fkz,nzlo_fft); + + memory->destroy(gf_b); + memory->destroy2d_offset(rho1d,-order_allocated/2); + memory->destroy2d_offset(drho1d,-order_allocated/2); + memory->destroy2d_offset(rho_coeff,(1-order_allocated)/2); + memory->destroy2d_offset(drho_coeff,(1-order_allocated)/2); + + delete fft1; + delete fft2; + delete remap; + delete cg_dipole; +} + +/* ---------------------------------------------------------------------- + allocate per-atom memory that depends on # of K-vectors and order +------------------------------------------------------------------------- */ + +void PPPMDipole::allocate_peratom() +{ + peratom_allocate_flag = 1; + + memory->create3d_offset(v0x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0x_brick_dipole"); + memory->create3d_offset(v1x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1x_brick_dipole"); + memory->create3d_offset(v2x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2x_brick_dipole"); + memory->create3d_offset(v3x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3x_brick_dipole"); + memory->create3d_offset(v4x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4x_brick_dipole"); + memory->create3d_offset(v5x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5x_brick_dipole"); + + memory->create3d_offset(v0y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0y_brick_dipole"); + memory->create3d_offset(v1y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1y_brick_dipole"); + memory->create3d_offset(v2y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2y_brick_dipole"); + memory->create3d_offset(v3y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3y_brick_dipole"); + memory->create3d_offset(v4y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4y_brick_dipole"); + memory->create3d_offset(v5y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5y_brick_dipole"); + + memory->create3d_offset(v0z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0z_brick_dipole"); + memory->create3d_offset(v1z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1z_brick_dipole"); + memory->create3d_offset(v2z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2z_brick_dipole"); + memory->create3d_offset(v3z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3z_brick_dipole"); + memory->create3d_offset(v4z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4z_brick_dipole"); + memory->create3d_offset(v5z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5z_brick_dipole"); + + // create ghost grid object for rho and electric field communication + + int (*procneigh)[2] = comm->procneigh; + + cg_peratom_dipole = + new GridComm(lmp,world,18,1, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, + procneigh[0][0],procneigh[0][1],procneigh[1][0], + procneigh[1][1],procneigh[2][0],procneigh[2][1]); +} + +/* ---------------------------------------------------------------------- + deallocate per-atom memory that depends on # of K-vectors and order +------------------------------------------------------------------------- */ + +void PPPMDipole::deallocate_peratom() +{ + peratom_allocate_flag = 0; + + memory->destroy3d_offset(v0x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy3d_offset(v0y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + memory->destroy3d_offset(v0z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + + delete cg_peratom_dipole; +} + +/* ---------------------------------------------------------------------- + set global size of PPPMDipole grid = nx,ny,nz_pppm + used for charge accumulation, FFTs, and electric field interpolation +------------------------------------------------------------------------- */ + +void PPPMDipole::set_grid_global() +{ + // use xprd,yprd,zprd + // adjust z dimension for 2d slab PPPMDipole + // 3d PPPMDipole just uses zprd since slab_volfactor = 1.0 + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double zprd_slab = zprd*slab_volfactor; + + // make initial g_ewald estimate + // based on desired accuracy and real space cutoff + // fluid-occupied volume used to estimate real-space error + // zprd used rather than zprd_slab + + double h; + bigint natoms = atom->natoms; + + if (!gewaldflag) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); + if (mu2 == 0.0) + error->all(FLERR,"Must use kspace_modify gewald for systems with no dipoles"); + g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; + //Try Newton Solver + double g_ewald_new = + find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + if (g_ewald_new > 0.0) g_ewald = g_ewald_new; + else error->warning(FLERR,"PPPMDipole dipole Newton solver failed, " + "using old method to estimate g_ewald"); + } + + // set optimal nx_pppm,ny_pppm,nz_pppm based on order and accuracy + // nz_pppm uses extended zprd_slab instead of zprd + // reduce it until accuracy target is met + + if (!gridflag) { + + h = h_x = h_y = h_z = 4.0/g_ewald; + int count = 0; + while (1) { + + // set grid dimension + nx_pppm = static_cast (xprd/h_x); + ny_pppm = static_cast (yprd/h_y); + nz_pppm = static_cast (zprd_slab/h_z); + + if (nx_pppm <= 1) nx_pppm = 2; + if (ny_pppm <= 1) ny_pppm = 2; + if (nz_pppm <= 1) nz_pppm = 2; + + //set local grid dimension + int npey_fft,npez_fft; + if (nz_pppm >= nprocs) { + npey_fft = 1; + npez_fft = nprocs; + } else procs2grid2d(nprocs,ny_pppm,nz_pppm,&npey_fft,&npez_fft); + + int me_y = me % npey_fft; + int me_z = me / npey_fft; + + nxlo_fft = 0; + nxhi_fft = nx_pppm - 1; + nylo_fft = me_y*ny_pppm/npey_fft; + nyhi_fft = (me_y+1)*ny_pppm/npey_fft - 1; + nzlo_fft = me_z*nz_pppm/npez_fft; + nzhi_fft = (me_z+1)*nz_pppm/npez_fft - 1; + + double df_kspace = compute_df_kspace_dipole(); + + count++; + + // break loop if the accuracy has been reached or + // too many loops have been performed + + if (df_kspace <= accuracy) break; + if (count > 500) error->all(FLERR, "Could not compute grid size"); + h *= 0.95; + h_x = h_y = h_z = h; + } + } + + // boost grid size until it is factorable + + while (!factorable(nx_pppm)) nx_pppm++; + while (!factorable(ny_pppm)) ny_pppm++; + while (!factorable(nz_pppm)) nz_pppm++; + + h_x = xprd/nx_pppm; + h_y = yprd/ny_pppm; + h_z = zprd_slab/nz_pppm; + + if (nx_pppm >= OFFSET || ny_pppm >= OFFSET || nz_pppm >= OFFSET) + error->all(FLERR,"PPPMDipole grid is too large"); +} + + +/* ---------------------------------------------------------------------- + compute estimated kspace force error for dipoles +------------------------------------------------------------------------- */ + +double PPPMDipole::compute_df_kspace_dipole() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double zprd_slab = zprd*slab_volfactor; + bigint natoms = atom->natoms; + double qopt = compute_qopt_dipole(); + double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); + return df_kspace; +} + +/* ---------------------------------------------------------------------- + compute qopt for dipoles with ik differentiation +------------------------------------------------------------------------- */ + +double PPPMDipole::compute_qopt_dipole() +{ + double qopt = 0.0; + const double * const prd = domain->prd; + + const double xprd = prd[0]; + const double yprd = prd[1]; + const double zprd = prd[2]; + const double zprd_slab = zprd*slab_volfactor; + const double unitkx = (MY_2PI/xprd); + const double unitky = (MY_2PI/yprd); + const double unitkz = (MY_2PI/zprd_slab); + + double snx,sny,snz; + double cnx,cny,cnz; + double argx,argy,argz,wx,wy,wz,sx,sy,sz,qx,qy,qz; + double sum1,sum2,dot1,dot2; + double numerator,denominator; + double u1,u2,u3,sqk; + + int k,l,m,nx,ny,nz,kper,lper,mper; + + const int nbx = 2; + const int nby = 2; + const int nbz = 2; + + const int twoorder = 2*order; + + for (m = nzlo_fft; m <= nzhi_fft; m++) { + mper = m - nz_pppm*(2*m/nz_pppm); + snz = square(sin(0.5*unitkz*mper*zprd_slab/nz_pppm)); + cnz = cos(0.5*unitkz*mper*zprd_slab/nz_pppm); + + for (l = nylo_fft; l <= nyhi_fft; l++) { + lper = l - ny_pppm*(2*l/ny_pppm); + sny = square(sin(0.5*unitky*lper*yprd/ny_pppm)); + cny = cos(0.5*unitky*lper*yprd/ny_pppm); + + for (k = nxlo_fft; k <= nxhi_fft; k++) { + kper = k - nx_pppm*(2*k/nx_pppm); + snx = square(sin(0.5*unitkx*kper*xprd/nx_pppm)); + cnx = cos(0.5*unitkx*kper*xprd/nx_pppm); + + sqk = square(unitkx*kper) + square(unitky*lper) + square(unitkz*mper); + + if (sqk != 0.0) { + numerator = MY_4PI/sqk; + denominator = gf_denom(snx,sny,snz); + sum1 = 0.0; + sum2 = 0.0; + + for (nx = -nbx; nx <= nbx; nx++) { + qx = unitkx*(kper+nx_pppm*nx); + sx = exp(-0.25*square(qx/g_ewald)); + argx = 0.5*qx*xprd/nx_pppm; + wx = powsinxx(argx,twoorder); + + for (ny = -nby; ny <= nby; ny++) { + qy = unitky*(lper+ny_pppm*ny); + sy = exp(-0.25*square(qy/g_ewald)); + argy = 0.5*qy*yprd/ny_pppm; + wy = powsinxx(argy,twoorder); + + for (nz = -nbz; nz <= nbz; nz++) { + qz = unitkz*(mper+nz_pppm*nz); + sz = exp(-0.25*square(qz/g_ewald)); + argz = 0.5*qz*zprd_slab/nz_pppm; + wz = powsinxx(argz,twoorder); + + dot1 = unitkx*kper*qx + unitky*lper*qy + unitkz*mper*qz; + dot2 = qx*qx + qy*qy + qz*qz; + //dot1 = dot1*dot1*dot1; // power of 3 for dipole forces + //dot2 = dot2*dot2*dot2; + u1 = sx*sy*sz; + const double w2 = wx*wy*wz; + const double phi = u1*MY_4PI/dot2; + const double top = dot1*dot1*dot1*w2*phi; + sum1 += phi*phi*dot2*dot2*dot2; + sum2 += top*top/sqk/sqk/sqk; + } + } + } + qopt += sum1 - sum2/denominator; + } + } + } + } + double qopt_all; + MPI_Allreduce(&qopt,&qopt_all,1,MPI_DOUBLE,MPI_SUM,world); + return qopt_all; +} + +/* ---------------------------------------------------------------------- + pre-compute modified (Hockney-Eastwood) Coulomb Green's function +------------------------------------------------------------------------- */ + +void PPPMDipole::compute_gf_dipole() +{ + const double * const prd = domain->prd; + + const double xprd = prd[0]; + const double yprd = prd[1]; + const double zprd = prd[2]; + const double zprd_slab = zprd*slab_volfactor; + const double unitkx = (MY_2PI/xprd); + const double unitky = (MY_2PI/yprd); + const double unitkz = (MY_2PI/zprd_slab); + + double snx,sny,snz; + double cnx,cny,cnz; + double argx,argy,argz,wx,wy,wz,sx,sy,sz,qx,qy,qz; + double sum1,dot1,dot2; + double numerator,denominator; + double sqk; + + int k,l,m,n,nx,ny,nz,kper,lper,mper; + + int nbx = static_cast ((g_ewald*xprd/(MY_PI*nx_pppm)) * + pow(-log(EPS_HOC),0.25)); + int nby = static_cast ((g_ewald*yprd/(MY_PI*ny_pppm)) * + pow(-log(EPS_HOC),0.25)); + int nbz = static_cast ((g_ewald*zprd_slab/(MY_PI*nz_pppm)) * + pow(-log(EPS_HOC),0.25)); + nbx = MAX(nbx,2); + nby = MAX(nby,2); + nbz = MAX(nbz,2); + const int twoorder = 2*order; + + n = 0; + for (m = nzlo_fft; m <= nzhi_fft; m++) { + mper = m - nz_pppm*(2*m/nz_pppm); + snz = square(sin(0.5*unitkz*mper*zprd_slab/nz_pppm)); + cnz = cos(0.5*unitkz*mper*zprd_slab/nz_pppm); + + for (l = nylo_fft; l <= nyhi_fft; l++) { + lper = l - ny_pppm*(2*l/ny_pppm); + sny = square(sin(0.5*unitky*lper*yprd/ny_pppm)); + cny = cos(0.5*unitky*lper*yprd/ny_pppm); + + for (k = nxlo_fft; k <= nxhi_fft; k++) { + kper = k - nx_pppm*(2*k/nx_pppm); + snx = square(sin(0.5*unitkx*kper*xprd/nx_pppm)); + cnx = cos(0.5*unitkx*kper*xprd/nx_pppm); + + sqk = square(unitkx*kper) + square(unitky*lper) + square(unitkz*mper); + + if (sqk != 0.0) { + numerator = MY_4PI/sqk; + denominator = gf_denom(snx,sny,snz); + sum1 = 0.0; + + for (nx = -nbx; nx <= nbx; nx++) { + qx = unitkx*(kper+nx_pppm*nx); + sx = exp(-0.25*square(qx/g_ewald)); + argx = 0.5*qx*xprd/nx_pppm; + wx = powsinxx(argx,twoorder); + + for (ny = -nby; ny <= nby; ny++) { + qy = unitky*(lper+ny_pppm*ny); + sy = exp(-0.25*square(qy/g_ewald)); + argy = 0.5*qy*yprd/ny_pppm; + wy = powsinxx(argy,twoorder); + + for (nz = -nbz; nz <= nbz; nz++) { + qz = unitkz*(mper+nz_pppm*nz); + sz = exp(-0.25*square(qz/g_ewald)); + argz = 0.5*qz*zprd_slab/nz_pppm; + wz = powsinxx(argz,twoorder); + + dot1 = unitkx*kper*qx + unitky*lper*qy + unitkz*mper*qz; + dot2 = qx*qx + qy*qy + qz*qz; + const double u1 = sx*sy*sz; + const double w2 = wx*wy*wz; + const double phi = u1*MY_4PI/dot2; + sum1 += dot1*dot1*dot1*w2*phi/sqk/sqk/sqk; + } + } + } + greensfn[n++] = sum1/denominator; + } else greensfn[n++] = 0.0; + } + } + } +} + +/* ---------------------------------------------------------------------- + calculate f(x) for use in Newton-Raphson solver +------------------------------------------------------------------------- */ + +double PPPMDipole::newton_raphson_f() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + bigint natoms = atom->natoms; + + double df_rspace,df_kspace; + double vol = xprd*yprd*zprd; + double a = cutoff*g_ewald; + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); + df_kspace = compute_df_kspace_dipole(); + + return df_rspace - df_kspace; +} + +/* ---------------------------------------------------------------------- + find g_ewald parameter for dipoles based on desired accuracy + using a Newton-Raphson solver +------------------------------------------------------------------------- */ + +double PPPMDipole::find_gewald_dipole(double x, double Rc, + bigint natoms, double vol, double b2) +{ + double dx,tol; + int maxit; + + maxit = 10000; //Maximum number of iterations + tol = 0.00001; //Convergence tolerance + + //Begin algorithm + + for (int i = 0; i < maxit; i++) { + dx = newton_raphson_f_dipole(x,Rc,natoms,vol,b2) / derivf_dipole(x,Rc,natoms,vol,b2); + x = x - dx; //Update x + if (fabs(dx) < tol) return x; + if (x < 0 || x != x) // solver failed + return -1; + } + return -1; +} + +/* ---------------------------------------------------------------------- + calculate f(x) objective function for dipoles + ------------------------------------------------------------------------- */ + +double PPPMDipole::newton_raphson_f_dipole(double x, double Rc, bigint +natoms, double vol, double b2) +{ + double a = Rc*x; + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + double f = (b2/(sqrt(vol*powint(x,4)*powint(Rc,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + exp(-rg2)) - accuracy; + + return f; +} + +/* ---------------------------------------------------------------------- + calculate numerical derivative f'(x) of objective function for dipoles + ------------------------------------------------------------------------- */ + +double PPPMDipole::derivf_dipole(double x, double Rc, + bigint natoms, double vol, double b2) +{ + double h = 0.000001; //Derivative step-size + return (newton_raphson_f_dipole(x + h,Rc,natoms,vol,b2) - newton_raphson_f_dipole(x,Rc,natoms,vol,b2)) / h; +} + +/* ---------------------------------------------------------------------- + calculate the final estimate of the accuracy +------------------------------------------------------------------------- */ + +double PPPMDipole::final_accuracy_dipole() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double vol = xprd*yprd*zprd; + bigint natoms = atom->natoms; + if (natoms == 0) natoms = 1; // avoid division by zero + + double df_kspace = compute_df_kspace_dipole(); + + double a = cutoff*g_ewald; + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + exp(-rg2)); + + double estimated_accuracy = sqrt(df_kspace*df_kspace + df_rspace*df_rspace); + + return estimated_accuracy; +} + +/* ---------------------------------------------------------------------- + pre-compute Green's function denominator expansion coeffs, Gamma(2n) +------------------------------------------------------------------------- */ + +void PPPMDipole::compute_gf_denom() +{ + if (gf_b) memory->destroy(gf_b); + memory->create(gf_b,order,"pppm_dipole:gf_b"); + + int k,l,m; + + for (l = 1; l < order; l++) gf_b[l] = 0.0; + gf_b[0] = 1.0; + + for (m = 1; m < order; m++) { + for (l = m; l > 0; l--) + gf_b[l] = 4.0 * (gf_b[l]*(l-m)*(l-m-0.5)-gf_b[l-1]*(l-m-1)*(l-m-1)); + gf_b[0] = 4.0 * (gf_b[0]*(l-m)*(l-m-0.5)); + } + + bigint ifact = 1; + for (k = 1; k < 2*order; k++) ifact *= k; + double gaminv = 1.0/ifact; + for (l = 0; l < order; l++) gf_b[l] *= gaminv; +} + +/* ---------------------------------------------------------------------- + create discretized "density" on section of global grid due to my particles + density(x,y,z) = charge "density" at grid points of my 3d brick + (nxlo:nxhi,nylo:nyhi,nzlo:nzhi) is extent of my brick (including ghosts) + in global grid +------------------------------------------------------------------------- */ + +void PPPMDipole::make_rho_dipole() +{ + int l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz; + FFT_SCALAR x0,y0,z0; + FFT_SCALAR x1,y1,z1; + FFT_SCALAR x2,y2,z2; + + // clear 3d density array + + memset(&(densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + memset(&(densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + + // loop over my charges, add their contribution to nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **mu = atom->mu; + double **x = atom->x; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + z0 = delvolinv * mu[i][0]; + z1 = delvolinv * mu[i][1]; + z2 = delvolinv * mu[i][2]; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + y0 = z0*rho1d[2][n]; + y1 = z1*rho1d[2][n]; + y2 = z2*rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + x0 = y0*rho1d[1][m]; + x1 = y1*rho1d[1][m]; + x2 = y2*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + densityx_brick_dipole[mz][my][mx] += x0*rho1d[0][l]; + densityy_brick_dipole[mz][my][mx] += x1*rho1d[0][l]; + densityz_brick_dipole[mz][my][mx] += x2*rho1d[0][l]; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + remap density from 3d brick decomposition to FFT decomposition +------------------------------------------------------------------------- */ + +void PPPMDipole::brick2fft_dipole() +{ + int n,ix,iy,iz; + + // copy grabs inner portion of density from 3d brick + // remap could be done as pre-stage of FFT, + // but this works optimally on only double values, not complex values + + n = 0; + for (iz = nzlo_in; iz <= nzhi_in; iz++) + for (iy = nylo_in; iy <= nyhi_in; iy++) + for (ix = nxlo_in; ix <= nxhi_in; ix++) { + densityx_fft_dipole[n] = densityx_brick_dipole[iz][iy][ix]; + densityy_fft_dipole[n] = densityy_brick_dipole[iz][iy][ix]; + densityz_fft_dipole[n] = densityz_brick_dipole[iz][iy][ix]; + n++; + } + + remap->perform(densityx_fft_dipole,densityx_fft_dipole,work1); + remap->perform(densityy_fft_dipole,densityy_fft_dipole,work1); + remap->perform(densityz_fft_dipole,densityz_fft_dipole,work1); +} + +/* ---------------------------------------------------------------------- + FFT-based Poisson solver for ik +------------------------------------------------------------------------- */ + +void PPPMDipole::poisson_ik_dipole() +{ + int i,j,k,n,ii; + double eng; + double wreal,wimg; + + // transform dipole density (r -> k) + + n = 0; + for (i = 0; i < nfft; i++) { + work1[n] = densityx_fft_dipole[i]; + work1[n+1] = ZEROF; + work2[n] = densityy_fft_dipole[i]; + work2[n+1] = ZEROF; + work3[n] = densityz_fft_dipole[i]; + work3[n+1] = ZEROF; + n += 2; + } + + fft1->compute(work1,work1,1); + fft1->compute(work2,work2,1); + fft1->compute(work3,work3,1); + + // global energy and virial contribution + + double scaleinv = 1.0/(nx_pppm*ny_pppm*nz_pppm); + double s2 = scaleinv*scaleinv; + + if (eflag_global || vflag_global) { + if (vflag_global) { + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + wreal = (work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + wimg = (work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + eng = s2 * greensfn[ii] * (wreal*wreal + wimg*wimg); + for (int jj = 0; jj < 6; jj++) virial[jj] += eng*vg[ii][jj]; + virial[0] += 2.0*s2*greensfn[ii]*fkx[i]*(work1[n]*wreal + work1[n+1]*wimg); + virial[1] += 2.0*s2*greensfn[ii]*fky[j]*(work2[n]*wreal + work2[n+1]*wimg); + virial[2] += 2.0*s2*greensfn[ii]*fkz[k]*(work3[n]*wreal + work3[n+1]*wimg); + virial[3] += 2.0*s2*greensfn[ii]*fky[j]*(work1[n]*wreal + work1[n+1]*wimg); + virial[4] += 2.0*s2*greensfn[ii]*fkz[k]*(work1[n]*wreal + work1[n+1]*wimg); + virial[5] += 2.0*s2*greensfn[ii]*fkz[k]*(work2[n]*wreal + work2[n+1]*wimg); + if (eflag_global) energy += eng; + ii++; + n += 2; + } + } else { + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + wreal = (work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + wimg = (work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + energy += + s2 * greensfn[ii] * (wreal*wreal + wimg*wimg); + ii++; + n += 2; + } + } + } + + // scale by 1/total-grid-pts to get rho(k) + // multiply by Green's function to get V(k) + + n = 0; + for (i = 0; i < nfft; i++) { + work1[n] *= scaleinv * greensfn[i]; + work1[n+1] *= scaleinv * greensfn[i]; + work2[n] *= scaleinv * greensfn[i]; + work2[n+1] *= scaleinv * greensfn[i]; + work3[n] *= scaleinv * greensfn[i]; + work3[n+1] *= scaleinv * greensfn[i]; + n += 2; + } + + // extra FFTs for per-atom energy/virial + + if (vflag_atom) poisson_peratom_dipole(); + + // compute electric potential + // FFT leaves data in 3d brick decomposition + + // Ex + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + work4[n+1] = fkx[i]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + ux_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Ey + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + work4[n+1] = fky[j]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + uy_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Ez + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + work4[n+1] = fkz[k]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + uz_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vxx + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*fkx[i]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fkx[i]*fkx[i]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdxx_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vyy + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*fky[j]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fky[j]*fky[j]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdyy_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vzz + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*fkz[k]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fkz[k]*fkz[k]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdzz_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vxy + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*fky[j]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fkx[i]*fky[j]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdxy_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vxz + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*fkz[k]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fkx[i]*fkz[k]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdxz_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // Vyz + + n = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*fkz[k]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]); + work4[n+1] = -fky[j]*fkz[k]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]); + n += 2; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + vdyz_brick_dipole[k][j][i] = work4[n]; + n += 2; + } +} + +/* ---------------------------------------------------------------------- + FFT-based Poisson solver for per-atom energy/virial +------------------------------------------------------------------------- */ + +void PPPMDipole::poisson_peratom_dipole() +{ + int i,ii,j,k,n; + + // 18 components of virial in v0 thru v5 + + if (!vflag_atom) return; + + // V0x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][0]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkx[i]*work1[n]); + work4[n+1] = fkx[i]*(vg[ii][0]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkx[i]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v0x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V0y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][0]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkx[i]*work1[n]); + work4[n+1] = fky[j]*(vg[ii][0]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkx[i]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v0y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V0z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][0]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkx[i]*work1[n]); + work4[n+1] = fkz[k]*(vg[ii][0]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkx[i]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v0z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V1x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][1]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work2[n]); + work4[n+1] = fkx[i]*(vg[ii][1]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v1x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V1y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][1]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work2[n]); + work4[n+1] = fky[j]*(vg[ii][1]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v1y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V1z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][1]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work2[n]); + work4[n+1] = fkz[k]*(vg[ii][1]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v1z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V2x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][2]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work3[n]); + work4[n+1] = fkx[i]*(vg[ii][2]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work3[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v2x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V2y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][2]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work3[n]); + work4[n+1] = fky[j]*(vg[ii][2]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work3[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v2y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V2z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][2]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work3[n]); + work4[n+1] = fkz[k]*(vg[ii][2]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work3[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v2z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V3x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][3]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work1[n]); + work4[n+1] = fkx[i]*(vg[ii][3]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v3x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V3y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][3]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work1[n]); + work4[n+1] = fky[j]*(vg[ii][3]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v3y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V3z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][3]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fky[j]*work1[n]); + work4[n+1] = fkz[k]*(vg[ii][3]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fky[j]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v3z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V4x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][4]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work1[n]); + work4[n+1] = fkx[i]*(vg[ii][4]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v4x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V4y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][4]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work1[n]); + work4[n+1] = fky[j]*(vg[ii][4]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v4y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V4z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][4]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work1[n]); + work4[n+1] = fkz[k]*(vg[ii][4]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work1[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v4z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V5x + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkx[i]*(vg[ii][5]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work2[n]); + work4[n+1] = fkx[i]*(vg[ii][5]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v5x_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V5y + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fky[j]*(vg[ii][5]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work2[n]); + work4[n+1] = fky[j]*(vg[ii][5]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v5y_brick_dipole[k][j][i] = work4[n]; + n += 2; + } + + // V5z + + n = 0; + ii = 0; + for (k = nzlo_fft; k <= nzhi_fft; k++) + for (j = nylo_fft; j <= nyhi_fft; j++) + for (i = nxlo_fft; i <= nxhi_fft; i++) { + work4[n] = fkz[k]*(vg[ii][5]*(work1[n]*fkx[i] + work2[n]*fky[j] + work3[n]*fkz[k]) + 2.0*fkz[k]*work2[n]); + work4[n+1] = fkz[k]*(vg[ii][5]*(work1[n+1]*fkx[i] + work2[n+1]*fky[j] + work3[n+1]*fkz[k]) + 2.0*fkz[k]*work2[n+1]); + n += 2; + ii++; + } + + fft2->compute(work4,work4,-1); + + n = 0; + for (k = nzlo_in; k <= nzhi_in; k++) + for (j = nylo_in; j <= nyhi_in; j++) + for (i = nxlo_in; i <= nxhi_in; i++) { + v5z_brick_dipole[k][j][i] = work4[n]; + n += 2; + } +} + +/* ---------------------------------------------------------------------- + interpolate from grid to get electric field & force on my particles for ik +------------------------------------------------------------------------- */ + +void PPPMDipole::fieldforce_ik_dipole() +{ + int i,l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz; + FFT_SCALAR x0,y0,z0; + FFT_SCALAR ex,ey,ez; + FFT_SCALAR vxx,vyy,vzz,vxy,vxz,vyz; + + // loop over my charges, interpolate electric field from nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + + double **mu = atom->mu; + double **x = atom->x; + double **f = atom->f; + double **t = atom->torque; + + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) { + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + ex = ey = ez = ZEROF; + vxx = vyy = vzz = vxy = vxz = vyz = ZEROF; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + z0 = rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + y0 = z0*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + x0 = y0*rho1d[0][l]; + ex -= x0*ux_brick_dipole[mz][my][mx]; + ey -= x0*uy_brick_dipole[mz][my][mx]; + ez -= x0*uz_brick_dipole[mz][my][mx]; + vxx -= x0*vdxx_brick_dipole[mz][my][mx]; + vyy -= x0*vdyy_brick_dipole[mz][my][mx]; + vzz -= x0*vdzz_brick_dipole[mz][my][mx]; + vxy -= x0*vdxy_brick_dipole[mz][my][mx]; + vxz -= x0*vdxz_brick_dipole[mz][my][mx]; + vyz -= x0*vdyz_brick_dipole[mz][my][mx]; + } + } + } + + // convert E-field to torque + + const double mufactor = qqrd2e * scale; + f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); + f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); + f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); + + t[i][0] += mufactor*(mu[i][1]*ez - mu[i][2]*ey); + t[i][1] += mufactor*(mu[i][2]*ex - mu[i][0]*ez); + t[i][2] += mufactor*(mu[i][0]*ey - mu[i][1]*ex); + } +} + +/* ---------------------------------------------------------------------- + interpolate from grid to get per-atom energy/virial +------------------------------------------------------------------------- */ + +void PPPMDipole::fieldforce_peratom_dipole() +{ + int i,l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz,x0,y0,z0; + FFT_SCALAR ux,uy,uz; + FFT_SCALAR v0x,v1x,v2x,v3x,v4x,v5x; + FFT_SCALAR v0y,v1y,v2y,v3y,v4y,v5y; + FFT_SCALAR v0z,v1z,v2z,v3z,v4z,v5z; + + // loop over my charges, interpolate from nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **mu = atom->mu; + double **x = atom->x; + + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) { + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + ux = uy = uz = ZEROF; + v0x = v1x = v2x = v3x = v4x = v5x = ZEROF; + v0y = v1y = v2y = v3y = v4y = v5y = ZEROF; + v0z = v1z = v2z = v3z = v4z = v5z = ZEROF; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + z0 = rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + y0 = z0*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + x0 = y0*rho1d[0][l]; + if (eflag_atom) { + ux += x0*ux_brick_dipole[mz][my][mx]; + uy += x0*uy_brick_dipole[mz][my][mx]; + uz += x0*uz_brick_dipole[mz][my][mx]; + } + if (vflag_atom) { + v0x += x0*v0x_brick_dipole[mz][my][mx]; + v1x += x0*v1x_brick_dipole[mz][my][mx]; + v2x += x0*v2x_brick_dipole[mz][my][mx]; + v3x += x0*v3x_brick_dipole[mz][my][mx]; + v4x += x0*v4x_brick_dipole[mz][my][mx]; + v5x += x0*v5x_brick_dipole[mz][my][mx]; + v0y += x0*v0y_brick_dipole[mz][my][mx]; + v1y += x0*v1y_brick_dipole[mz][my][mx]; + v2y += x0*v2y_brick_dipole[mz][my][mx]; + v3y += x0*v3y_brick_dipole[mz][my][mx]; + v4y += x0*v4y_brick_dipole[mz][my][mx]; + v5y += x0*v5y_brick_dipole[mz][my][mx]; + v0z += x0*v0z_brick_dipole[mz][my][mx]; + v1z += x0*v1z_brick_dipole[mz][my][mx]; + v2z += x0*v2z_brick_dipole[mz][my][mx]; + v3z += x0*v3z_brick_dipole[mz][my][mx]; + v4z += x0*v4z_brick_dipole[mz][my][mx]; + v5z += x0*v5z_brick_dipole[mz][my][mx]; + } + } + } + } + + if (eflag_atom) eatom[i] += mu[i][0]*ux + mu[i][1]*uy + mu[i][2]*uz; + if (vflag_atom) { + vatom[i][0] += mu[i][0]*v0x + mu[i][1]*v0y + mu[i][2]*v0z; + vatom[i][1] += mu[i][0]*v1x + mu[i][1]*v1y + mu[i][2]*v1z; + vatom[i][2] += mu[i][0]*v2x + mu[i][1]*v2y + mu[i][2]*v2z; + vatom[i][3] += mu[i][0]*v3x + mu[i][1]*v3y + mu[i][2]*v3z; + vatom[i][4] += mu[i][0]*v4x + mu[i][1]*v4y + mu[i][2]*v4z; + vatom[i][5] += mu[i][0]*v5x + mu[i][1]*v5y + mu[i][2]*v5z; + } + } +} + +/* ---------------------------------------------------------------------- + pack own values to buf to send to another proc +------------------------------------------------------------------------- */ + +void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +{ + int n = 0; + + if (flag == FORWARD_MU) { + FFT_SCALAR *src_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + buf[n++] = src_ux[list[i]]; + buf[n++] = src_uy[list[i]]; + buf[n++] = src_uz[list[i]]; + buf[n++] = src_vxx[list[i]]; + buf[n++] = src_vyy[list[i]]; + buf[n++] = src_vzz[list[i]]; + buf[n++] = src_vxy[list[i]]; + buf[n++] = src_vxz[list[i]]; + buf[n++] = src_vyz[list[i]]; + } + } else if (flag == FORWARD_MU_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + buf[n++] = v0xsrc[list[i]]; + buf[n++] = v1xsrc[list[i]]; + buf[n++] = v2xsrc[list[i]]; + buf[n++] = v3xsrc[list[i]]; + buf[n++] = v4xsrc[list[i]]; + buf[n++] = v5xsrc[list[i]]; + buf[n++] = v0ysrc[list[i]]; + buf[n++] = v1ysrc[list[i]]; + buf[n++] = v2ysrc[list[i]]; + buf[n++] = v3ysrc[list[i]]; + buf[n++] = v4ysrc[list[i]]; + buf[n++] = v5ysrc[list[i]]; + buf[n++] = v0zsrc[list[i]]; + buf[n++] = v1zsrc[list[i]]; + buf[n++] = v2zsrc[list[i]]; + buf[n++] = v3zsrc[list[i]]; + buf[n++] = v4zsrc[list[i]]; + buf[n++] = v5zsrc[list[i]]; + } + } +} + +/* ---------------------------------------------------------------------- + unpack another proc's own values from buf and set own ghost values +------------------------------------------------------------------------- */ + +void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +{ + int n = 0; + + if (flag == FORWARD_MU) { + FFT_SCALAR *dest_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + dest_ux[list[i]] = buf[n++]; + dest_uy[list[i]] = buf[n++]; + dest_uz[list[i]] = buf[n++]; + dest_vxx[list[i]] = buf[n++]; + dest_vyy[list[i]] = buf[n++]; + dest_vzz[list[i]] = buf[n++]; + dest_vxy[list[i]] = buf[n++]; + dest_vxz[list[i]] = buf[n++]; + dest_vyz[list[i]] = buf[n++]; + } + } else if (flag == FORWARD_MU_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + v0xsrc[list[i]] = buf[n++]; + v1xsrc[list[i]] = buf[n++]; + v2xsrc[list[i]] = buf[n++]; + v3xsrc[list[i]] = buf[n++]; + v4xsrc[list[i]] = buf[n++]; + v5xsrc[list[i]] = buf[n++]; + v0ysrc[list[i]] = buf[n++]; + v1ysrc[list[i]] = buf[n++]; + v2ysrc[list[i]] = buf[n++]; + v3ysrc[list[i]] = buf[n++]; + v4ysrc[list[i]] = buf[n++]; + v5ysrc[list[i]] = buf[n++]; + v0zsrc[list[i]] = buf[n++]; + v1zsrc[list[i]] = buf[n++]; + v2zsrc[list[i]] = buf[n++]; + v3zsrc[list[i]] = buf[n++]; + v4zsrc[list[i]] = buf[n++]; + v5zsrc[list[i]] = buf[n++]; + } + } +} + +/* ---------------------------------------------------------------------- + pack ghost values into buf to send to another proc +------------------------------------------------------------------------- */ + +void PPPMDipole::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +{ + int n = 0; + if (flag == REVERSE_MU) { + FFT_SCALAR *src_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + buf[n++] = src_dipole0[list[i]]; + buf[n++] = src_dipole1[list[i]]; + buf[n++] = src_dipole2[list[i]]; + } + } +} + +/* ---------------------------------------------------------------------- + unpack another proc's ghost values from buf and add to own values +------------------------------------------------------------------------- */ + +void PPPMDipole::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +{ + int n = 0; + if (flag == REVERSE_MU) { + FFT_SCALAR *dest_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + for (int i = 0; i < nlist; i++) { + dest_dipole0[list[i]] += buf[n++]; + dest_dipole1[list[i]] += buf[n++]; + dest_dipole2[list[i]] += buf[n++]; + } + } +} + +/* ---------------------------------------------------------------------- + Slab-geometry correction term to dampen inter-slab interactions between + periodically repeating slabs. Yields good approximation to 2D Ewald if + adequate empty space is left between repeating slabs (J. Chem. Phys. + 111, 3155). Slabs defined here to be parallel to the xy plane. Also + extended to non-neutral systems (J. Chem. Phys. 131, 094107). +------------------------------------------------------------------------- */ + +void PPPMDipole::slabcorr() +{ + // compute local contribution to global dipole moment + + double **x = atom->x; + double zprd = domain->zprd; + int nlocal = atom->nlocal; + + double dipole = 0.0; + double **mu = atom->mu; + for (int i = 0; i < nlocal; i++) dipole += mu[i][2]; + + // sum local contributions to get global dipole moment + + double dipole_all; + MPI_Allreduce(&dipole,&dipole_all,1,MPI_DOUBLE,MPI_SUM,world); + + // need to make non-neutral systems and/or + // per-atom energy translationally invariant + + if (eflag_atom || fabs(qsum) > SMALL) { + + error->all(FLERR,"Cannot (yet) use kspace slab correction with " + "long-range dipoles and non-neutral systems or per-atom energy"); + } + + // compute corrections + + const double e_slabcorr = MY_2PI*(dipole_all*dipole_all/12.0)/volume; + const double qscale = qqrd2e * scale; + + if (eflag_global) energy += qscale * e_slabcorr; + + // per-atom energy + + if (eflag_atom) { + double efact = qscale * MY_2PI/volume/12.0; + for (int i = 0; i < nlocal; i++) + eatom[i] += efact * mu[i][2]*dipole_all; + } + + // add on torque corrections + + if (atom->torque) { + double ffact = qscale * (-4.0*MY_PI/volume); + double **mu = atom->mu; + double **torque = atom->torque; + for (int i = 0; i < nlocal; i++) { + torque[i][0] += ffact * dipole_all * mu[i][1]; + torque[i][1] += -ffact * dipole_all * mu[i][0]; + } + } +} + +/* ---------------------------------------------------------------------- + perform and time the 1d FFTs required for N timesteps +------------------------------------------------------------------------- */ + +int PPPMDipole::timing_1d(int n, double &time1d) +{ + double time1,time2; + + for (int i = 0; i < 2*nfft_both; i++) work1[i] = ZEROF; + + MPI_Barrier(world); + time1 = MPI_Wtime(); + + for (int i = 0; i < n; i++) { + fft1->timing1d(work1,nfft_both,1); + fft1->timing1d(work1,nfft_both,1); + fft1->timing1d(work1,nfft_both,1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + fft2->timing1d(work1,nfft_both,-1); + } + + MPI_Barrier(world); + time2 = MPI_Wtime(); + time1d = time2 - time1; + + return 12; +} + +/* ---------------------------------------------------------------------- + perform and time the 3d FFTs required for N timesteps +------------------------------------------------------------------------- */ + +int PPPMDipole::timing_3d(int n, double &time3d) +{ + double time1,time2; + + for (int i = 0; i < 2*nfft_both; i++) work1[i] = ZEROF; + + MPI_Barrier(world); + time1 = MPI_Wtime(); + + for (int i = 0; i < n; i++) { + fft1->compute(work1,work1,1); + fft1->compute(work1,work1,1); + fft1->compute(work1,work1,1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + fft2->compute(work1,work1,-1); + } + + MPI_Barrier(world); + time2 = MPI_Wtime(); + time3d = time2 - time1; + + return 12; +} + +/* ---------------------------------------------------------------------- + memory usage of local arrays +------------------------------------------------------------------------- */ + +double PPPMDipole::memory_usage() +{ + double bytes = nmax*3 * sizeof(double); + int nbrick = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * + (nzhi_out-nzlo_out+1); + bytes += 6 * nfft_both * sizeof(double); // vg + bytes += nfft_both * sizeof(double); // greensfn + bytes += nfft_both*5 * sizeof(FFT_SCALAR); // work*2*2 + bytes += 9 * nbrick * sizeof(FFT_SCALAR); // ubrick*3 + vdbrick*6 + bytes += nfft_both*7 * sizeof(FFT_SCALAR); //density_ffx*3 + work*2*2 + + if (peratom_allocate_flag) + bytes += 21 * nbrick * sizeof(FFT_SCALAR); + + if (cg_dipole) bytes += cg_dipole->memory_usage(); + if (cg_peratom_dipole) bytes += cg_peratom_dipole->memory_usage(); + + return bytes; +} + +/* ---------------------------------------------------------------------- + compute musum,musqsum,mu2 + called initially, when particle count changes, when dipoles are changed +------------------------------------------------------------------------- */ + +void PPPMDipole::musum_musq() +{ + const int nlocal = atom->nlocal; + + musum = musqsum = mu2 = 0.0; + if (atom->mu_flag) { + double** mu = atom->mu; + double musum_local(0.0), musqsum_local(0.0); + + for (int i = 0; i < nlocal; i++) { + musum_local += mu[i][0] + mu[i][1] + mu[i][2]; + musqsum_local += mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]; + } + + MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + + mu2 = musqsum * force->qqrd2e; + } + + if (mu2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); +} \ No newline at end of file diff --git a/src/KSPACE/pppm_spin.h b/src/KSPACE/pppm_spin.h new file mode 100644 index 0000000000..4d6906f974 --- /dev/null +++ b/src/KSPACE/pppm_spin.h @@ -0,0 +1,213 @@ +/* -*- 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 KSPACE_CLASS + +KSpaceStyle(pppm/dipole,PPPMDipole) + +#else + +#ifndef LMP_PPPM_DIPOLE_H +#define LMP_PPPM_DIPOLE_H + +#include "pppm.h" + +namespace LAMMPS_NS { + +class PPPMDipole : public PPPM { + public: + PPPMDipole(class LAMMPS *, int, char **); + virtual ~PPPMDipole(); + void init(); + void setup(); + void setup_grid(); + void compute(int, int); + int timing_1d(int, double &); + int timing_3d(int, double &); + double memory_usage(); + + protected: + void set_grid_global(); + double newton_raphson_f(); + + void allocate(); + void allocate_peratom(); + void deallocate(); + void deallocate_peratom(); + void compute_gf_denom(); + + void slabcorr(); + + // grid communication + + void pack_forward(int, FFT_SCALAR *, int, int *); + void unpack_forward(int, FFT_SCALAR *, int, int *); + void pack_reverse(int, FFT_SCALAR *, int, int *); + void unpack_reverse(int, FFT_SCALAR *, int, int *); + + // dipole + + FFT_SCALAR ***densityx_brick_dipole,***densityy_brick_dipole,***densityz_brick_dipole; + FFT_SCALAR ***vdxx_brick_dipole,***vdyy_brick_dipole,***vdzz_brick_dipole; + FFT_SCALAR ***vdxy_brick_dipole,***vdxz_brick_dipole,***vdyz_brick_dipole; + FFT_SCALAR ***ux_brick_dipole,***uy_brick_dipole,***uz_brick_dipole; + FFT_SCALAR ***v0x_brick_dipole,***v1x_brick_dipole,***v2x_brick_dipole; + FFT_SCALAR ***v3x_brick_dipole,***v4x_brick_dipole,***v5x_brick_dipole; + FFT_SCALAR ***v0y_brick_dipole,***v1y_brick_dipole,***v2y_brick_dipole; + FFT_SCALAR ***v3y_brick_dipole,***v4y_brick_dipole,***v5y_brick_dipole; + FFT_SCALAR ***v0z_brick_dipole,***v1z_brick_dipole,***v2z_brick_dipole; + FFT_SCALAR ***v3z_brick_dipole,***v4z_brick_dipole,***v5z_brick_dipole; + FFT_SCALAR *work3,*work4; + FFT_SCALAR *densityx_fft_dipole,*densityy_fft_dipole,*densityz_fft_dipole; + class GridComm *cg_dipole; + class GridComm *cg_peratom_dipole; + int only_dipole_flag; + double musum,musqsum,mu2; + double find_gewald_dipole(double, double, bigint, double, double); + double newton_raphson_f_dipole(double, double, bigint, double, double); + double derivf_dipole(double, double, bigint, double, double); + double compute_df_kspace_dipole(); + double compute_qopt_dipole(); + void compute_gf_dipole(); + void make_rho_dipole(); + void brick2fft_dipole(); + void poisson_ik_dipole(); + void poisson_peratom_dipole(); + void fieldforce_ik_dipole(); + void fieldforce_peratom_dipole(); + double final_accuracy_dipole(); + void musum_musq(); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Cannot (yet) use charges with Kspace style PPPMDipole + +Charge-dipole interactions are not yet implemented in PPPMDipole so this +feature is not yet supported. + +E: Must redefine kspace_style after changing to triclinic box + +Self-explanatory. + +E: Kspace style requires atom attribute mu + +The atom style defined does not have this attribute. + +E: Cannot (yet) use kspace_modify diff ad with dipoles + +This feature is not yet supported. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Cannot yet use triclinic cells with PPPMDipole + +This feature is not yet supported. + +E: Cannot yet use TIP4P with PPPMDipole + +This feature is not yet supported. + +E: Cannot use nonperiodic boundaries with PPPM + +For kspace style pppm, all 3 dimensions must have periodic boundaries +unless you use the kspace_modify command to define a 2d slab with a +non-periodic z dimension. + +E: Incorrect boundaries with slab PPPM + +Must have periodic x,y dimensions and non-periodic z dimension to use +2d slab option with PPPM. + +E: PPPM order cannot be < 2 or > than %d + +This is a limitation of the PPPM implementation in LAMMPS. + +E: KSpace style is incompatible with Pair style + +Setting a kspace style requires that a pair style with matching +long-range dipole components be used. + +W: Reducing PPPM order b/c stencil extends beyond nearest neighbor processor + +This may lead to a larger grid than desired. See the kspace_modify overlap +command to prevent changing of the PPPM order. + +E: PPPM order < minimum allowed order + +The default minimum order is 2. This can be reset by the +kspace_modify minorder command. + +E: PPPM grid stencil extends beyond nearest neighbor processor + +This is not allowed if the kspace_modify overlap setting is no. + +E: KSpace accuracy must be > 0 + +The kspace accuracy designated in the input must be greater than zero. + +E: Could not compute grid size + +The code is unable to compute a grid size consistent with the desired +accuracy. This error should not occur for typical problems. Please +send an email to the developers. + +E: PPPM grid is too large + +The global PPPM grid is larger than OFFSET in one or more dimensions. +OFFSET is currently set to 4096. You likely need to decrease the +requested accuracy. + +E: Could not compute g_ewald + +The Newton-Raphson solver failed to converge to a good value for +g_ewald. This error should not occur for typical problems. Please +send an email to the developers. + +E: Non-numeric box dimensions - simulation unstable + +The box size has apparently blown up. + +E: Out of range atoms - cannot compute PPPM + +One or more atoms are attempting to map their charge to a PPPM grid +point that is not owned by a processor. This is likely for one of two +reasons, both of them bad. First, it may mean that an atom near the +boundary of a processor's sub-domain has moved more than 1/2 the +"neighbor skin distance"_neighbor.html without neighbor lists being +rebuilt and atoms being migrated to new processors. This also means +you may be missing pairwise interactions that need to be computed. +The solution is to change the re-neighboring criteria via the +"neigh_modify"_neigh_modify command. The safest settings are "delay 0 +every 1 check yes". Second, it may mean that an atom has moved far +outside a processor's sub-domain or even the entire simulation box. +This indicates bad physics, e.g. due to highly overlapping atoms, too +large a timestep, etc. + +E: Using kspace solver PPPMDipole on system with no dipoles + +Must have non-zero dipoles with PPPMDipole. + +E: Must use kspace_modify gewald for system with no dipoles + +Self-explanatory. + +*/ diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp new file mode 100644 index 0000000000..66b684ae1d --- /dev/null +++ b/src/SPIN/pair_spin_long.cpp @@ -0,0 +1,550 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + 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) + Stan Moore (SNL) + + Please cite the related publication: + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. arXiv preprint arXiv:1801.10233. +------------------------------------------------------------------------- */ + + +#include +#include +#include +#include +#include "pair_spin_long.h" +#include "atom.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "fix_nve_spin.h" +#include "force.h" +#include "kspace.h" +#include "math_const.h" +#include "memory.h" +#include "modify.h" +#include "error.h" +#include "update.h" + + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define EWALD_F 1.12837917 +#define EWALD_P 0.3275911 +#define A1 0.254829592 +#define A2 -0.284496736 +#define A3 1.421413741 +#define A4 -1.453152027 +#define A5 1.061405429 + +/* ---------------------------------------------------------------------- */ + +PairSpinLong::PairSpinLong(LAMMPS *lmp) : PairSpin(lmp), +lockfixnvespin(NULL) +{ + single_enable = 0; + ewaldflag = pppmflag = 1; + respa_enable = 0; + no_virial_fdotr_compute = 1; + lattice_flag = 0; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + +} + +/* ---------------------------------------------------------------------- + free all arrays +------------------------------------------------------------------------- */ + +PairSpinLong::~PairSpinLong() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cutsq); + } +} + +/* ---------------------------------------------------------------------- */ + +void PairSpinLong::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double r,rinv,r2inv,rsq; + double grij,expm2,t,erfc; + double bij[4]; + double evdwl,ecoul; + double xi[3],rij[3]; + double spi[4],spj[4],fi[3],fmi[3]; + double pre1,pre2,pre3; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double **fm = atom->fm; + double **sp = atom->sp; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over atoms and their neighbors + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + itype = type[i]; + + for (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]; + spj[3] = sp[j][3]; + + evdwl = 0.0; + + fi[0] = fi[1] = fi[2] = 0.0; + fmi[0] = fmi[1] = fmi[2] = 0.0; + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + + 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]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + + if (rsq < cut_spinsq) { + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + compute_long(i,j,rij,bij,fmi,spi,spj); + compute_long_mech(i,j,rij,bij,fmi,spi,spj); + + } + } + + // force accumulation + + f[i][0] += fi[0] * mub2mu0; + f[i][1] += fi[1] * mub2mu0; + f[i][2] += fi[2] * mub2mu0; + fm[i][0] += fmi[0] * mub2mu0hbinv; + fm[i][1] += fmi[1] * mub2mu0hbinv; + fm[i][2] += fmi[2] * mub2mu0hbinv; + + if (newton_pair || j < nlocal) { + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; + f[j][2] -= fi[2]; + } + + if (eflag) { + if (rsq <= cut_spinsq) { + 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],rij[0],rij[1],rij[2]); + + } + } +} + +/* ---------------------------------------------------------------------- + update the pair interaction fmi acting on the spin ii +------------------------------------------------------------------------- */ + +void PairSpinLong::compute_single_pair(int ii, double fmi[3]) +{ + int i,j,jj,jnum,itype,jtype; + double r,rinv,r2inv,rsq; + double grij,expm2,t,erfc; + double bij[4],xi[3],rij[3],spi[4],spj[4]; + double pre1,pre2,pre3; + int *ilist,*jlist,*numneigh,**firstneigh; + + double **x = atom->x; + double **sp = atom->sp; + int *type = atom->type; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over neighbors of atom i + + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + itype = type[i]; + + for (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]; + spj[3] = sp[j][3]; + + fmi[0] = fmi[1] = fmi[2] = 0.0; + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + + 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]; + + if (rsq < cutsq[itype][jtype]) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + + if (rsq < cut_spinsq) { + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + compute_long(i,j,rij,bij,fmi,spi,spj); + + } + } + } + + // force accumulation + + fmi[0] *= mub2mu0hbinv; + fmi[1] *= mub2mu0hbinv; + fmi[2] *= mub2mu0hbinv; +} + +/* ---------------------------------------------------------------------- + compute exchange interaction between spins i and j +------------------------------------------------------------------------- */ + +void PairSpinLong::compute_long(int i, int j, double rij[3], + double bij[4], double fmi[3], double spi[4], double spj[4]) +{ + double sjdotr; + double b1,b2,gigj; + + gigj = spi[3] * spj[3]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + b1 = bij[1]; + b2 = bij[2]; + + fmi[0] += gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); + fmi[1] += gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); + fmi[2] += gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); +} + +/* ---------------------------------------------------------------------- + compute the mechanical force due to the exchange interaction between atom i and atom j +------------------------------------------------------------------------- */ + +void PairSpinLong::compute_long_mech(int i, int j, double rij[3], + double bij[4], double fi[3], double spi[3], double spj[3]) +{ + double sdots,sidotr,sjdotr,b2,b3; + double g1,g2,g1b2_g2b3,gigj; + + gigj = spi[3] * spj[3]; + sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + b2 = bij[2]; + b3 = bij[3]; + g1 = sdots; + g2 = -sidotr*sjdotr; + g1b2_g2b3 = g1*b2 + g2*b3; + + fi[0] += gigj * (rij[0] * g1b2_g2b3 + + b2 * (sjdotr*spi[0] + sidotr*spj[0])); + fi[1] += gigj * (rij[1] * g1b2_g2b3 + + b2 * (sjdotr*spi[1] + sidotr*spj[1])); + fi[2] += gigj * (rij[2] * g1b2_g2b3 + + b2 * (sjdotr*spi[2] + sidotr*spj[2])); +} + + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairSpinLong::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"); +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSpinLong::settings(int narg, char **arg) +{ + if (narg < 1 || narg > 2) + error->all(FLERR,"Incorrect args in pair_style command"); + + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Spin simulations require metal unit style"); + + cut_spin = force->numeric(FLERR,arg[0]); + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSpinLong::coeff(int narg, char **arg) +{ + if (narg < 4 || narg > 5) + error->all(FLERR,"Incorrect args for pair coefficients"); + if (!allocated) allocate(); + + // check if args correct + + if (strcmp(arg[2],"long") != 0) + error->all(FLERR,"Incorrect args in pair_style command"); + if (narg != 3) + error->all(FLERR,"Incorrect args in pair_style command"); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSpinLong::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + double cut = cut_spin; + return cut; +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSpinLong::init_style() +{ + if (!atom->sp_flag) + error->all(FLERR,"Pair spin requires atom/spin style"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // checking if nve/spin is a listed fix + + int ifix = 0; + while (ifix < modify->nfix) { + if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + ifix++; + } + if (ifix == modify->nfix) + error->all(FLERR,"pair/spin style requires nve/spin"); + + // get the lattice_flag from nve/spin + + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { + lockfixnvespin = (FixNVESpin *) modify->fix[i]; + lattice_flag = lockfixnvespin->lattice_flag; + } + } + + // insure use of KSpace long-range solver, set g_ewald + + if (force->kspace == NULL) + error->all(FLERR,"Pair style requires a KSpace style"); + + g_ewald = force->kspace->g_ewald; + + cut_spinsq = cut_spin * cut_spin; +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinLong::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); + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinLong::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); + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinLong::write_restart_settings(FILE *fp) +{ + fwrite(&cut_spin,sizeof(double),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinLong::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_spin,sizeof(double),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin,1,MPI_DOUBLE,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); +} + +/* ---------------------------------------------------------------------- */ + +void *PairSpinLong::extract(const char *str, int &dim) +{ + if (strcmp(str,"cut") == 0) { + dim = 0; + return (void *) &cut_spin; + } else if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_spin; + } else if (strcmp(str,"ewald_order") == 0) { + ewald_order = 0; + ewald_order |= 1<<1; + ewald_order |= 1<<3; + dim = 0; + return (void *) &ewald_order; + } else if (strcmp(str,"ewald_mix") == 0) { + dim = 0; + return (void *) &mix_flag; + } + return NULL; +} diff --git a/src/SPIN/pair_spin_long.h b/src/SPIN/pair_spin_long.h new file mode 100644 index 0000000000..867b771f74 --- /dev/null +++ b/src/SPIN/pair_spin_long.h @@ -0,0 +1,97 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + 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(spin/long,PairSpinLong) + +#else + +#ifndef LMP_PAIR_SPIN_LONG_H +#define LMP_PAIR_SPIN_LONG_H + +#include "pair_spin.h" + +namespace LAMMPS_NS { + +class PairSpinLong : public PairSpin { + public: + double cut_coul; + double **sigma; + + PairSpinLong(class LAMMPS *); + ~PairSpinLong(); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + void init_style(); + void *extract(const char *, int &); + + void compute(int, int); + void compute_single_pair(int, double *); + + void compute_long(int, int, double *, double *, double *, + double *, double *); + void compute_long_mech(int, int, double *, double *, double *, + double *, double *); + + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + + protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force + double cut_spin, cut_spinsq; + + double g_ewald; + int ewald_order; + + int lattice_flag; // flag for mech force computation + class FixNVESpin *lockfixnvespin; // ptr for setups + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args in pair_style command + +Self-explanatory. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair dipole/long requires atom attributes q, mu, torque + +The atom style defined does not have these attributes. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Pair style requires a KSpace style + +No kspace style is defined. + +*/ diff --git a/src/kspace.cpp b/src/kspace.cpp index fc8b12288b..da606bbf3d 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -268,7 +268,7 @@ void KSpace::ev_setup(int eflag, int vflag, int alloc) called initially, when particle count changes, when charges are changed ------------------------------------------------------------------------- */ -void KSpace::qsum_qsq() +void KSpace::qsum_qsq(int warning_flag) { const double * const q = atom->q; const int nlocal = atom->nlocal; @@ -285,7 +285,7 @@ void KSpace::qsum_qsq() MPI_Allreduce(&qsum_local,&qsum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&qsqsum_local,&qsqsum,1,MPI_DOUBLE,MPI_SUM,world); - if ((qsqsum == 0.0) && (comm->me == 0) && warn_nocharge) { + if ((qsqsum == 0.0) && (comm->me == 0) && warn_nocharge && warning_flag) { error->warning(FLERR,"Using kspace solver on system with no charge"); warn_nocharge = 0; } diff --git a/src/kspace.h b/src/kspace.h index 28c7bcef2a..55ace5aa71 100644 --- a/src/kspace.h +++ b/src/kspace.h @@ -108,7 +108,7 @@ class KSpace : protected Pointers { // public so can be called by commands that change charge - void qsum_qsq(); + void qsum_qsq(int warning_flag = 1); // general child-class methods From e1ab38439b9eae0ced06b796613f0e2b17f1fe1c Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 14 Aug 2018 17:09:44 -0600 Subject: [PATCH 0033/1242] Commit2 JT 081418 - converted pppm_dipole toward spin quantities - need to check if can handle ferrimagnets --- src/KSPACE/pppm_spin.cpp | 963 ++++++++++++++++++++------------------- src/KSPACE/pppm_spin.h | 84 ++-- 2 files changed, 547 insertions(+), 500 deletions(-) diff --git a/src/KSPACE/pppm_spin.cpp b/src/KSPACE/pppm_spin.cpp index 32e91cc9b2..c51de8d023 100644 --- a/src/KSPACE/pppm_spin.cpp +++ b/src/KSPACE/pppm_spin.cpp @@ -13,6 +13,7 @@ /* ---------------------------------------------------------------------- Contributing author: Stan Moore (SNL) + Julien Tranchida (SNL) ------------------------------------------------------------------------- */ #include @@ -20,7 +21,7 @@ #include #include #include -#include "pppm_dipole.h" +#include "pppm_spin.h" #include "atom.h" #include "comm.h" #include "gridcomm.h" @@ -49,8 +50,8 @@ using namespace MathSpecial; #define SMALL 0.00001 #define EPS_HOC 1.0e-7 -enum{REVERSE_MU}; -enum{FORWARD_MU,FORWARD_MU_PERATOM}; +enum{REVERSE_SP}; +enum{FORWARD_SP,FORWARD_SP_PERATOM}; #ifdef FFT_SINGLE #define ZEROF 0.0f @@ -62,34 +63,34 @@ enum{FORWARD_MU,FORWARD_MU_PERATOM}; /* ---------------------------------------------------------------------- */ -PPPMDipole::PPPMDipole(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), - densityx_brick_dipole(NULL), densityy_brick_dipole(NULL), - densityz_brick_dipole(NULL), ux_brick_dipole(NULL), - uy_brick_dipole(NULL), uz_brick_dipole(NULL), vdxx_brick_dipole(NULL), - vdxy_brick_dipole(NULL), vdyy_brick_dipole(NULL), - vdxz_brick_dipole(NULL), vdyz_brick_dipole(NULL), - vdzz_brick_dipole(NULL), v0x_brick_dipole(NULL), v1x_brick_dipole(NULL), - v2x_brick_dipole(NULL), v3x_brick_dipole(NULL), v4x_brick_dipole(NULL), - v5x_brick_dipole(NULL), v0y_brick_dipole(NULL), v1y_brick_dipole(NULL), - v2y_brick_dipole(NULL), v3y_brick_dipole(NULL), v4y_brick_dipole(NULL), - v5y_brick_dipole(NULL), v0z_brick_dipole(NULL), v1z_brick_dipole(NULL), - v2z_brick_dipole(NULL), v3z_brick_dipole(NULL), v4z_brick_dipole(NULL), - v5z_brick_dipole(NULL), work3(NULL), work4(NULL), - densityx_fft_dipole(NULL), densityy_fft_dipole(NULL), - densityz_fft_dipole(NULL) +PPPMSpin::PPPMSpin(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), + densityx_brick_spin(NULL), densityy_brick_spin(NULL), + densityz_brick_spin(NULL), ux_brick_spin(NULL), + uy_brick_spin(NULL), uz_brick_spin(NULL), vdxx_brick_spin(NULL), + vdxy_brick_spin(NULL), vdyy_brick_spin(NULL), + vdxz_brick_spin(NULL), vdyz_brick_spin(NULL), + vdzz_brick_spin(NULL), v0x_brick_spin(NULL), v1x_brick_spin(NULL), + v2x_brick_spin(NULL), v3x_brick_spin(NULL), v4x_brick_spin(NULL), + v5x_brick_spin(NULL), v0y_brick_spin(NULL), v1y_brick_spin(NULL), + v2y_brick_spin(NULL), v3y_brick_spin(NULL), v4y_brick_spin(NULL), + v5y_brick_spin(NULL), v0z_brick_spin(NULL), v1z_brick_spin(NULL), + v2z_brick_spin(NULL), v3z_brick_spin(NULL), v4z_brick_spin(NULL), + v5z_brick_spin(NULL), work3(NULL), work4(NULL), + densityx_fft_spin(NULL), densityy_fft_spin(NULL), + densityz_fft_spin(NULL) { - dipoleflag = 1; + spinflag = 1; group_group_enable = 0; - cg_dipole = NULL; - cg_peratom_dipole = NULL; + cg_spin = NULL; + cg_peratom_spin = NULL; } /* ---------------------------------------------------------------------- free all memory ------------------------------------------------------------------------- */ -PPPMDipole::~PPPMDipole() +PPPMSpin::~PPPMSpin() { if (copymode) return; @@ -98,26 +99,29 @@ PPPMDipole::~PPPMDipole() fft1 = NULL; fft2 = NULL; remap = NULL; - cg_dipole = NULL; + cg_spin = NULL; } /* ---------------------------------------------------------------------- called once before run ------------------------------------------------------------------------- */ -void PPPMDipole::init() +void PPPMSpin::init() { if (me == 0) { - if (screen) fprintf(screen,"PPPMDipole initialization ...\n"); - if (logfile) fprintf(logfile,"PPPMDipole initialization ...\n"); + if (screen) fprintf(screen,"PPPMSpin initialization ...\n"); + if (logfile) fprintf(logfile,"PPPMSpin initialization ...\n"); } // error check - dipoleflag = atom->mu?1:0; - qsum_qsq(0); - if (dipoleflag && q2) - error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMDipole"); + //spinflag = atom->mu?1:0; + spinflag = atom->sp?1:0; + // no charges here, charge neutrality + //qsum_qsq(0); + // maybe change this test + if (spinflag && q2) + error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMSpin"); triclinic_check(); @@ -125,30 +129,30 @@ void PPPMDipole::init() error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); if (domain->dimension == 2) error->all(FLERR, - "Cannot use PPPMDipole with 2d simulation"); + "Cannot use PPPMSpin with 2d simulation"); if (comm->style != 0) - error->universe_all(FLERR,"PPPMDipole can only currently be used with " + error->universe_all(FLERR,"PPPMSpin can only currently be used with " "comm_style brick"); - if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); + if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); - if (atom->mu && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" - " ad with dipoles"); + if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" + " ad with spins"); - if (dipoleflag && strcmp(update->unit_style,"electron") == 0) - error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); + if (spinflag && strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"'metal' units have to be used with spins"); if (slabflag == 0 && domain->nonperiodic > 0) - error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMSpin"); if (slabflag) { if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) - error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); + error->all(FLERR,"Incorrect boundaries with slab PPPMSpin"); } if (order < 2 || order > MAXORDER) { char str[128]; - sprintf(str,"PPPMDipole order cannot be < 2 or > than %d",MAXORDER); + sprintf(str,"PPPMSpin order cannot be < 2 or > than %d",MAXORDER); error->all(FLERR,str); } @@ -156,7 +160,7 @@ void PPPMDipole::init() triclinic = domain->triclinic; if (triclinic) - error->all(FLERR,"Cannot yet use triclinic cells with PPPMDipole"); + error->all(FLERR,"Cannot yet use triclinic cells with PPPMSpin"); pair_check(); @@ -169,17 +173,26 @@ void PPPMDipole::init() // kspace TIP4P not yet supported if (tip4pflag) - error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); + error->all(FLERR,"Cannot yet use TIP4P with PPPMSpin"); // compute qsum & qsqsum and warn if not charge-neutral scale = 1.0; - qqrd2e = force->qqrd2e; - musum_musq(); + //qqrd2e = force->qqrd2e; + // need to define mag constants instead + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + //musum_musq(); + spsum_spsq(); natoms_original = atom->natoms; // set accuracy (force units) from accuracy_relative or accuracy_absolute + // is two_charge_force still relevant for spin systems? + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; else accuracy = accuracy_relative * two_charge_force; @@ -201,7 +214,7 @@ void PPPMDipole::init() while (order >= minorder) { if (iteration && me == 0) - error->warning(FLERR,"Reducing PPPMDipole order b/c stencil extends " + error->warning(FLERR,"Reducing PPPMSpin order b/c stencil extends " "beyond nearest neighbor processor"); compute_gf_denom(); @@ -222,9 +235,9 @@ void PPPMDipole::init() iteration++; } - if (order < minorder) error->all(FLERR,"PPPMDipole order < minimum allowed order"); + if (order < minorder) error->all(FLERR,"PPPMSpin order < minimum allowed order"); if (!overlap_allowed && cgtmp->ghost_overlap()) - error->all(FLERR,"PPPMDipole grid stencil extends " + error->all(FLERR,"PPPMSpin grid stencil extends " "beyond nearest neighbor processor"); if (cgtmp) delete cgtmp; @@ -234,7 +247,7 @@ void PPPMDipole::init() // calculate the final accuracy - double estimated_accuracy = final_accuracy_dipole(); + double estimated_accuracy = final_accuracy_spin(); // print stats @@ -280,10 +293,10 @@ void PPPMDipole::init() // don't invoke allocate peratom(), will be allocated when needed allocate(); - cg_dipole->ghost_notify(); - cg_dipole->setup(); + cg_spin->ghost_notify(); + cg_spin->setup(); - // pre-compute Green's function denomiator expansion + // pre-compute Green's function denominator expansion // pre-compute 1d charge distribution coefficients compute_gf_denom(); @@ -291,27 +304,27 @@ void PPPMDipole::init() } /* ---------------------------------------------------------------------- - adjust PPPMDipole coeffs, called initially and whenever volume has changed + adjust PPPMSpin coeffs, called initially and whenever volume has changed ------------------------------------------------------------------------- */ -void PPPMDipole::setup() +void PPPMSpin::setup() { // perform some checks to avoid illegal boundaries with read_data if (slabflag == 0 && domain->nonperiodic > 0) - error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMSpin"); if (slabflag) { if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) - error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); + error->all(FLERR,"Incorrect boundaries with slab PPPMSpin"); } int i,j,k,n; double *prd; // volume-dependent factors - // adjust z dimension for 2d slab PPPMDipole - // z dimension for 3d PPPMDipole is zprd since slab_volfactor = 1.0 + // adjust z dimension for 2d slab PPPMSpin + // z dimension for 3d PPPMSpin is zprd since slab_volfactor = 1.0 prd = domain->prd; double xprd = prd[0]; @@ -379,7 +392,7 @@ void PPPMDipole::setup() } } - compute_gf_dipole(); + compute_gf_spin(); } /* ---------------------------------------------------------------------- @@ -387,7 +400,7 @@ void PPPMDipole::setup() called by fix balance b/c it changed sizes of processor sub-domains ------------------------------------------------------------------------- */ -void PPPMDipole::setup_grid() +void PPPMSpin::setup_grid() { // free all arrays previously allocated @@ -404,11 +417,11 @@ void PPPMDipole::setup_grid() allocate(); - cg_dipole->ghost_notify(); - if (overlap_allowed == 0 && cg_dipole->ghost_overlap()) - error->all(FLERR,"PPPMDipole grid stencil extends " + cg_spin->ghost_notify(); + if (overlap_allowed == 0 && cg_spin->ghost_overlap()) + error->all(FLERR,"PPPMSpin grid stencil extends " "beyond nearest neighbor processor"); - cg_dipole->setup(); + cg_spin->setup(); // pre-compute Green's function denomiator expansion // pre-compute 1d charge distribution coefficients @@ -422,10 +435,10 @@ void PPPMDipole::setup_grid() } /* ---------------------------------------------------------------------- - compute the PPPMDipole long-range force, energy, virial + compute the PPPMSpin long-range force, energy, virial ------------------------------------------------------------------------- */ -void PPPMDipole::compute(int eflag, int vflag) +void PPPMSpin::compute(int eflag, int vflag) { int i,j; @@ -438,20 +451,21 @@ void PPPMDipole::compute(int eflag, int vflag) if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); - cg_peratom_dipole->ghost_notify(); - cg_peratom_dipole->setup(); + cg_peratom_spin->ghost_notify(); + cg_peratom_spin->setup(); } // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - musum_musq(); + //musum_musq(); + spsum_spsq(); natoms_original = atom->natoms; } - // return if there are no dipoles + // return if there are no spins - if (musqsum == 0.0) return; + if (spsqsum == 0.0) return; // convert atoms from box to lamda coords @@ -462,51 +476,52 @@ void PPPMDipole::compute(int eflag, int vflag) if (atom->nmax > nmax) { memory->destroy(part2grid); nmax = atom->nmax; - memory->create(part2grid,nmax,3,"pppm_dipole:part2grid"); + memory->create(part2grid,nmax,3,"pppm_spin:part2grid"); } // find grid points for all my particles - // map my particle charge onto my local 3d density grid + // map my particle charge onto my local 3d on-grid density particle_map(); - make_rho_dipole(); + make_rho_spin(); // all procs communicate density values from their ghost cells // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - cg_dipole->reverse_comm(this,REVERSE_MU); - brick2fft_dipole(); + cg_spin->reverse_comm(this,REVERSE_SP); + brick2fft_spin(); // compute potential gradient on my FFT grid and // portion of e_long on this proc's FFT grid // return gradients (electric fields) in 3d brick decomposition // also performs per-atom calculations via poisson_peratom() - poisson_ik_dipole(); + poisson_ik_spin(); // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - cg_dipole->forward_comm(this,FORWARD_MU); + cg_spin->forward_comm(this,FORWARD_SP); // extra per-atom energy/virial communication if (evflag_atom) { - cg_peratom_dipole->forward_comm(this,FORWARD_MU_PERATOM); + cg_peratom_spin->forward_comm(this,FORWARD_SP_PERATOM); } // calculate the force on my particles - fieldforce_ik_dipole(); + fieldforce_ik_spin(); // extra per-atom energy/virial communication - if (evflag_atom) fieldforce_peratom_dipole(); + if (evflag_atom) fieldforce_peratom_spin(); // sum global energy across procs and add in volume-dependent term - const double qscale = qqrd2e * scale; + //const double qscale = qqrd2e * scale; + const double spscale = mub2mu0 * scale; const double g3 = g_ewald*g_ewald*g_ewald; if (eflag_global) { @@ -515,7 +530,7 @@ void PPPMDipole::compute(int eflag, int vflag) energy = energy_all; energy *= 0.5*volume; - energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy -= spsqsum*2.0*g3/3.0/MY_PIS; energy *= qscale; } @@ -531,16 +546,19 @@ void PPPMDipole::compute(int eflag, int vflag) // energy includes self-energy correction if (evflag_atom) { - double *q = atom->q; - double **mu = atom->mu; + //double *q = atom->q; + //double **mu = atom->mu; + double **sp = atom->sp; int nlocal = atom->nlocal; int ntotal = nlocal; if (eflag_atom) { for (i = 0; i < nlocal; i++) { eatom[i] *= 0.5; - eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; - eatom[i] *= qscale; + //eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; + eatom[i] -= (sp[i][0]*sp[i][0] + sp[i][1]*sp[i][1] + sp[i][2]*sp[i][2])*2.0*g3/3.0/MY_PIS; + //eatom[i] *= qscale; + eatom[i] *= spscale; } } @@ -559,59 +577,59 @@ void PPPMDipole::compute(int eflag, int vflag) allocate memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMDipole::allocate() +void PPPMSpin::allocate() { - memory->create3d_offset(densityx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:densityx_brick_dipole"); - memory->create3d_offset(densityy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:densityy_brick_dipole"); - memory->create3d_offset(densityz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:densityz_brick_dipole"); + memory->create3d_offset(densityx_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:densityx_brick_spin"); + memory->create3d_offset(densityy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:densityy_brick_spin"); + memory->create3d_offset(densityz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:densityz_brick_spin"); - memory->create(densityx_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); - memory->create(densityy_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); - memory->create(densityz_fft_dipole,nfft_both,"pppm_dipole:densityz_fft_dipole"); + memory->create(densityx_fft_spin,nfft_both,"pppm_spin:densityy_fft_spin"); + memory->create(densityy_fft_spin,nfft_both,"pppm_spin:densityy_fft_spin"); + memory->create(densityz_fft_spin,nfft_both,"pppm_spin:densityz_fft_spin"); - memory->create(greensfn,nfft_both,"pppm_dipole:greensfn"); - memory->create(work1,2*nfft_both,"pppm_dipole:work1"); - memory->create(work2,2*nfft_both,"pppm_dipole:work2"); - memory->create(work3,2*nfft_both,"pppm_dipole:work3"); - memory->create(work4,2*nfft_both,"pppm_dipole:work4"); - memory->create(vg,nfft_both,6,"pppm_dipole:vg"); + memory->create(greensfn,nfft_both,"pppm_spin:greensfn"); + memory->create(work1,2*nfft_both,"pppm_spin:work1"); + memory->create(work2,2*nfft_both,"pppm_spin:work2"); + memory->create(work3,2*nfft_both,"pppm_spin:work3"); + memory->create(work4,2*nfft_both,"pppm_spin:work4"); + memory->create(vg,nfft_both,6,"pppm_spin:vg"); - memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_dipole:fkx"); - memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_dipole:fky"); - memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_dipole:fkz"); + memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_spin:fkx"); + memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_spin:fky"); + memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_spin:fkz"); - memory->create3d_offset(ux_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:ux_brick_dipole"); - memory->create3d_offset(uy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:uy_brick_dipole"); - memory->create3d_offset(uz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:uz_brick_dipole"); + memory->create3d_offset(ux_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:ux_brick_spin"); + memory->create3d_offset(uy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:uy_brick_spin"); + memory->create3d_offset(uz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:uz_brick_spin"); - memory->create3d_offset(vdxx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdxx_brick_dipole"); - memory->create3d_offset(vdxy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdxy_brick_dipole"); - memory->create3d_offset(vdyy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdyy_brick_dipole"); - memory->create3d_offset(vdxz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdxz_brick_dipole"); - memory->create3d_offset(vdyz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdyz_brick_dipole"); - memory->create3d_offset(vdzz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:vdzz_brick_dipole"); + memory->create3d_offset(vdxx_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdxx_brick_spin"); + memory->create3d_offset(vdxy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdxy_brick_spin"); + memory->create3d_offset(vdyy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdyy_brick_spin"); + memory->create3d_offset(vdxz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdxz_brick_spin"); + memory->create3d_offset(vdyz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdyz_brick_spin"); + memory->create3d_offset(vdzz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:vdzz_brick_spin"); // summation coeffs order_allocated = order; - memory->create(gf_b,order,"pppm_dipole:gf_b"); - memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_dipole:rho1d"); - memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_dipole:drho1d"); - memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_dipole:rho_coeff"); + memory->create(gf_b,order,"pppm_spin:gf_b"); + memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_spin:rho1d"); + memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_spin:drho1d"); + memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_spin:rho_coeff"); memory->create2d_offset(drho_coeff,order,(1-order)/2,order/2, - "pppm_dipole:drho_coeff"); + "pppm_spin:drho_coeff"); // create 2 FFTs and a Remap // 1st FFT keeps data in FFT decompostion @@ -639,7 +657,7 @@ void PPPMDipole::allocate() int (*procneigh)[2] = comm->procneigh; - cg_dipole = new GridComm(lmp,world,9,3, + cg_spin = new GridComm(lmp,world,9,3, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, procneigh[0][0],procneigh[0][1],procneigh[1][0], @@ -650,26 +668,26 @@ void PPPMDipole::allocate() deallocate memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMDipole::deallocate() +void PPPMSpin::deallocate() { - memory->destroy3d_offset(densityx_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(densityy_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(densityz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityx_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityy_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(ux_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(uy_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(uz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(ux_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uy_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxx_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxy_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdyy_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdyz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdzz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxx_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxy_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyy_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdzz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy(densityx_fft_dipole); - memory->destroy(densityy_fft_dipole); - memory->destroy(densityz_fft_dipole); + memory->destroy(densityx_fft_spin); + memory->destroy(densityy_fft_spin); + memory->destroy(densityz_fft_spin); memory->destroy(greensfn); memory->destroy(work1); @@ -691,61 +709,61 @@ void PPPMDipole::deallocate() delete fft1; delete fft2; delete remap; - delete cg_dipole; + delete cg_spin; } /* ---------------------------------------------------------------------- allocate per-atom memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMDipole::allocate_peratom() +void PPPMSpin::allocate_peratom() { peratom_allocate_flag = 1; - memory->create3d_offset(v0x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v0x_brick_dipole"); - memory->create3d_offset(v1x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v1x_brick_dipole"); - memory->create3d_offset(v2x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v2x_brick_dipole"); - memory->create3d_offset(v3x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v3x_brick_dipole"); - memory->create3d_offset(v4x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v4x_brick_dipole"); - memory->create3d_offset(v5x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v5x_brick_dipole"); + memory->create3d_offset(v0x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v0x_brick_spin"); + memory->create3d_offset(v1x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v1x_brick_spin"); + memory->create3d_offset(v2x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v2x_brick_spin"); + memory->create3d_offset(v3x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v3x_brick_spin"); + memory->create3d_offset(v4x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v4x_brick_spin"); + memory->create3d_offset(v5x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v5x_brick_spin"); - memory->create3d_offset(v0y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v0y_brick_dipole"); - memory->create3d_offset(v1y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v1y_brick_dipole"); - memory->create3d_offset(v2y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v2y_brick_dipole"); - memory->create3d_offset(v3y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v3y_brick_dipole"); - memory->create3d_offset(v4y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v4y_brick_dipole"); - memory->create3d_offset(v5y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v5y_brick_dipole"); + memory->create3d_offset(v0y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v0y_brick_spin"); + memory->create3d_offset(v1y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v1y_brick_spin"); + memory->create3d_offset(v2y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v2y_brick_spin"); + memory->create3d_offset(v3y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v3y_brick_spin"); + memory->create3d_offset(v4y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v4y_brick_spin"); + memory->create3d_offset(v5y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v5y_brick_spin"); - memory->create3d_offset(v0z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v0z_brick_dipole"); - memory->create3d_offset(v1z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v1z_brick_dipole"); - memory->create3d_offset(v2z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v2z_brick_dipole"); - memory->create3d_offset(v3z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v3z_brick_dipole"); - memory->create3d_offset(v4z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v4z_brick_dipole"); - memory->create3d_offset(v5z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_dipole:v5z_brick_dipole"); + memory->create3d_offset(v0z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v0z_brick_spin"); + memory->create3d_offset(v1z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v1z_brick_spin"); + memory->create3d_offset(v2z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v2z_brick_spin"); + memory->create3d_offset(v3z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v3z_brick_spin"); + memory->create3d_offset(v4z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v4z_brick_spin"); + memory->create3d_offset(v5z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_spin:v5z_brick_spin"); // create ghost grid object for rho and electric field communication int (*procneigh)[2] = comm->procneigh; - cg_peratom_dipole = + cg_peratom_spin = new GridComm(lmp,world,18,1, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, @@ -757,44 +775,44 @@ void PPPMDipole::allocate_peratom() deallocate per-atom memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMDipole::deallocate_peratom() +void PPPMSpin::deallocate_peratom() { peratom_allocate_flag = 0; - memory->destroy3d_offset(v0x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v0y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v0z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5z_brick_spin,nzlo_out,nylo_out,nxlo_out); - delete cg_peratom_dipole; + delete cg_peratom_spin; } /* ---------------------------------------------------------------------- - set global size of PPPMDipole grid = nx,ny,nz_pppm + set global size of PPPMSpin grid = nx,ny,nz_pppm used for charge accumulation, FFTs, and electric field interpolation ------------------------------------------------------------------------- */ -void PPPMDipole::set_grid_global() +void PPPMSpin::set_grid_global() { // use xprd,yprd,zprd - // adjust z dimension for 2d slab PPPMDipole - // 3d PPPMDipole just uses zprd since slab_volfactor = 1.0 + // adjust z dimension for 2d slab PPPMSpin + // 3d PPPMSpin just uses zprd since slab_volfactor = 1.0 double xprd = domain->xprd; double yprd = domain->yprd; @@ -812,14 +830,14 @@ void PPPMDipole::set_grid_global() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); - if (mu2 == 0.0) - error->all(FLERR,"Must use kspace_modify gewald for systems with no dipoles"); + if (sp2 == 0.0) + error->all(FLERR,"Must use kspace_modify gewald for systems with no spins"); g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; //Try Newton Solver double g_ewald_new = - find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + find_gewald_spin(g_ewald,cutoff,natoms,xprd*yprd*zprd,sp2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; - else error->warning(FLERR,"PPPMDipole dipole Newton solver failed, " + else error->warning(FLERR,"PPPMSpin spin Newton solver failed, " "using old method to estimate g_ewald"); } @@ -859,7 +877,7 @@ void PPPMDipole::set_grid_global() nzlo_fft = me_z*nz_pppm/npez_fft; nzhi_fft = (me_z+1)*nz_pppm/npez_fft - 1; - double df_kspace = compute_df_kspace_dipole(); + double df_kspace = compute_df_kspace_spin(); count++; @@ -884,31 +902,32 @@ void PPPMDipole::set_grid_global() h_z = zprd_slab/nz_pppm; if (nx_pppm >= OFFSET || ny_pppm >= OFFSET || nz_pppm >= OFFSET) - error->all(FLERR,"PPPMDipole grid is too large"); + error->all(FLERR,"PPPMSpin grid is too large"); } /* ---------------------------------------------------------------------- - compute estimated kspace force error for dipoles + compute estimated kspace force error for spins ------------------------------------------------------------------------- */ -double PPPMDipole::compute_df_kspace_dipole() +double PPPMSpin::compute_df_kspace_spin() { double xprd = domain->xprd; double yprd = domain->yprd; double zprd = domain->zprd; double zprd_slab = zprd*slab_volfactor; bigint natoms = atom->natoms; - double qopt = compute_qopt_dipole(); - double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); + double qopt = compute_qopt_spin(); + //double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); + double df_kspace = sqrt(qopt/natoms)*sp2/(3.0*xprd*yprd*zprd_slab); return df_kspace; } /* ---------------------------------------------------------------------- - compute qopt for dipoles with ik differentiation + compute qopt for spins with ik differentiation ------------------------------------------------------------------------- */ -double PPPMDipole::compute_qopt_dipole() +double PPPMSpin::compute_qopt_spin() { double qopt = 0.0; const double * const prd = domain->prd; @@ -979,7 +998,7 @@ double PPPMDipole::compute_qopt_dipole() dot1 = unitkx*kper*qx + unitky*lper*qy + unitkz*mper*qz; dot2 = qx*qx + qy*qy + qz*qz; - //dot1 = dot1*dot1*dot1; // power of 3 for dipole forces + //dot1 = dot1*dot1*dot1; // power of 3 for spin forces //dot2 = dot2*dot2*dot2; u1 = sx*sy*sz; const double w2 = wx*wy*wz; @@ -1004,7 +1023,7 @@ double PPPMDipole::compute_qopt_dipole() pre-compute modified (Hockney-Eastwood) Coulomb Green's function ------------------------------------------------------------------------- */ -void PPPMDipole::compute_gf_dipole() +void PPPMSpin::compute_gf_spin() { const double * const prd = domain->prd; @@ -1097,7 +1116,7 @@ void PPPMDipole::compute_gf_dipole() calculate f(x) for use in Newton-Raphson solver ------------------------------------------------------------------------- */ -double PPPMDipole::newton_raphson_f() +double PPPMSpin::newton_raphson_f() { double xprd = domain->xprd; double yprd = domain->yprd; @@ -1112,19 +1131,21 @@ double PPPMDipole::newton_raphson_f() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + //df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); + df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); - df_kspace = compute_df_kspace_dipole(); + df_kspace = compute_df_kspace_spin(); return df_rspace - df_kspace; } /* ---------------------------------------------------------------------- - find g_ewald parameter for dipoles based on desired accuracy + find g_ewald parameter for spins based on desired accuracy using a Newton-Raphson solver ------------------------------------------------------------------------- */ -double PPPMDipole::find_gewald_dipole(double x, double Rc, +double PPPMSpin::find_gewald_spin(double x, double Rc, bigint natoms, double vol, double b2) { double dx,tol; @@ -1136,7 +1157,7 @@ double PPPMDipole::find_gewald_dipole(double x, double Rc, //Begin algorithm for (int i = 0; i < maxit; i++) { - dx = newton_raphson_f_dipole(x,Rc,natoms,vol,b2) / derivf_dipole(x,Rc,natoms,vol,b2); + dx = newton_raphson_f_spin(x,Rc,natoms,vol,b2) / derivf_spin(x,Rc,natoms,vol,b2); x = x - dx; //Update x if (fabs(dx) < tol) return x; if (x < 0 || x != x) // solver failed @@ -1146,10 +1167,10 @@ double PPPMDipole::find_gewald_dipole(double x, double Rc, } /* ---------------------------------------------------------------------- - calculate f(x) objective function for dipoles + calculate f(x) objective function for spins ------------------------------------------------------------------------- */ -double PPPMDipole::newton_raphson_f_dipole(double x, double Rc, bigint +double PPPMSpin::newton_raphson_f_spin(double x, double Rc, bigint natoms, double vol, double b2) { double a = Rc*x; @@ -1166,21 +1187,21 @@ natoms, double vol, double b2) } /* ---------------------------------------------------------------------- - calculate numerical derivative f'(x) of objective function for dipoles + calculate numerical derivative f'(x) of objective function for spins ------------------------------------------------------------------------- */ -double PPPMDipole::derivf_dipole(double x, double Rc, +double PPPMSpin::derivf_spin(double x, double Rc, bigint natoms, double vol, double b2) { double h = 0.000001; //Derivative step-size - return (newton_raphson_f_dipole(x + h,Rc,natoms,vol,b2) - newton_raphson_f_dipole(x,Rc,natoms,vol,b2)) / h; + return (newton_raphson_f_spin(x + h,Rc,natoms,vol,b2) - newton_raphson_f_spin(x,Rc,natoms,vol,b2)) / h; } /* ---------------------------------------------------------------------- calculate the final estimate of the accuracy ------------------------------------------------------------------------- */ -double PPPMDipole::final_accuracy_dipole() +double PPPMSpin::final_accuracy_spin() { double xprd = domain->xprd; double yprd = domain->yprd; @@ -1189,7 +1210,7 @@ double PPPMDipole::final_accuracy_dipole() bigint natoms = atom->natoms; if (natoms == 0) natoms = 1; // avoid division by zero - double df_kspace = compute_df_kspace_dipole(); + double df_kspace = compute_df_kspace_spin(); double a = cutoff*g_ewald; double rg2 = a*a; @@ -1197,7 +1218,10 @@ double PPPMDipole::final_accuracy_dipole() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + //double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + // exp(-rg2)); + double df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); @@ -1210,10 +1234,10 @@ double PPPMDipole::final_accuracy_dipole() pre-compute Green's function denominator expansion coeffs, Gamma(2n) ------------------------------------------------------------------------- */ -void PPPMDipole::compute_gf_denom() +void PPPMSpin::compute_gf_denom() { if (gf_b) memory->destroy(gf_b); - memory->create(gf_b,order,"pppm_dipole:gf_b"); + memory->create(gf_b,order,"pppm_spin:gf_b"); int k,l,m; @@ -1239,7 +1263,7 @@ void PPPMDipole::compute_gf_denom() in global grid ------------------------------------------------------------------------- */ -void PPPMDipole::make_rho_dipole() +void PPPMSpin::make_rho_spin() { int l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; @@ -1249,11 +1273,11 @@ void PPPMDipole::make_rho_dipole() // clear 3d density array - memset(&(densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); - memset(&(densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); - memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); // loop over my charges, add their contribution to nearby grid points @@ -1261,7 +1285,8 @@ void PPPMDipole::make_rho_dipole() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **mu = atom->mu; + //double **mu = atom->mu; + double **sp = atom->sp; double **x = atom->x; int nlocal = atom->nlocal; @@ -1276,9 +1301,9 @@ void PPPMDipole::make_rho_dipole() compute_rho1d(dx,dy,dz); - z0 = delvolinv * mu[i][0]; - z1 = delvolinv * mu[i][1]; - z2 = delvolinv * mu[i][2]; + z0 = delvolinv * sp[i][0]; + z1 = delvolinv * sp[i][1]; + z2 = delvolinv * sp[i][2]; for (n = nlower; n <= nupper; n++) { mz = n+nz; y0 = z0*rho1d[2][n]; @@ -1291,9 +1316,9 @@ void PPPMDipole::make_rho_dipole() x2 = y2*rho1d[1][m]; for (l = nlower; l <= nupper; l++) { mx = l+nx; - densityx_brick_dipole[mz][my][mx] += x0*rho1d[0][l]; - densityy_brick_dipole[mz][my][mx] += x1*rho1d[0][l]; - densityz_brick_dipole[mz][my][mx] += x2*rho1d[0][l]; + densityx_brick_spin[mz][my][mx] += x0*rho1d[0][l]; + densityy_brick_spin[mz][my][mx] += x1*rho1d[0][l]; + densityz_brick_spin[mz][my][mx] += x2*rho1d[0][l]; } } } @@ -1304,7 +1329,7 @@ void PPPMDipole::make_rho_dipole() remap density from 3d brick decomposition to FFT decomposition ------------------------------------------------------------------------- */ -void PPPMDipole::brick2fft_dipole() +void PPPMSpin::brick2fft_spin() { int n,ix,iy,iz; @@ -1316,36 +1341,36 @@ void PPPMDipole::brick2fft_dipole() for (iz = nzlo_in; iz <= nzhi_in; iz++) for (iy = nylo_in; iy <= nyhi_in; iy++) for (ix = nxlo_in; ix <= nxhi_in; ix++) { - densityx_fft_dipole[n] = densityx_brick_dipole[iz][iy][ix]; - densityy_fft_dipole[n] = densityy_brick_dipole[iz][iy][ix]; - densityz_fft_dipole[n] = densityz_brick_dipole[iz][iy][ix]; + densityx_fft_spin[n] = densityx_brick_spin[iz][iy][ix]; + densityy_fft_spin[n] = densityy_brick_spin[iz][iy][ix]; + densityz_fft_spin[n] = densityz_brick_spin[iz][iy][ix]; n++; } - remap->perform(densityx_fft_dipole,densityx_fft_dipole,work1); - remap->perform(densityy_fft_dipole,densityy_fft_dipole,work1); - remap->perform(densityz_fft_dipole,densityz_fft_dipole,work1); + remap->perform(densityx_fft_spin,densityx_fft_spin,work1); + remap->perform(densityy_fft_spin,densityy_fft_spin,work1); + remap->perform(densityz_fft_spin,densityz_fft_spin,work1); } /* ---------------------------------------------------------------------- FFT-based Poisson solver for ik ------------------------------------------------------------------------- */ -void PPPMDipole::poisson_ik_dipole() +void PPPMSpin::poisson_ik_spin() { int i,j,k,n,ii; double eng; double wreal,wimg; - // transform dipole density (r -> k) + // transform spin density (r -> k) n = 0; for (i = 0; i < nfft; i++) { - work1[n] = densityx_fft_dipole[i]; + work1[n] = densityx_fft_spin[i]; work1[n+1] = ZEROF; - work2[n] = densityy_fft_dipole[i]; + work2[n] = densityy_fft_spin[i]; work2[n+1] = ZEROF; - work3[n] = densityz_fft_dipole[i]; + work3[n] = densityz_fft_spin[i]; work3[n+1] = ZEROF; n += 2; } @@ -1412,7 +1437,7 @@ void PPPMDipole::poisson_ik_dipole() // extra FFTs for per-atom energy/virial - if (vflag_atom) poisson_peratom_dipole(); + if (vflag_atom) poisson_peratom_spin(); // compute electric potential // FFT leaves data in 3d brick decomposition @@ -1434,7 +1459,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - ux_brick_dipole[k][j][i] = work4[n]; + ux_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1455,7 +1480,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - uy_brick_dipole[k][j][i] = work4[n]; + uy_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1476,7 +1501,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - uz_brick_dipole[k][j][i] = work4[n]; + uz_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1497,7 +1522,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxx_brick_dipole[k][j][i] = work4[n]; + vdxx_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1518,7 +1543,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdyy_brick_dipole[k][j][i] = work4[n]; + vdyy_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1539,7 +1564,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdzz_brick_dipole[k][j][i] = work4[n]; + vdzz_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1560,7 +1585,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxy_brick_dipole[k][j][i] = work4[n]; + vdxy_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1581,7 +1606,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxz_brick_dipole[k][j][i] = work4[n]; + vdxz_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1602,7 +1627,7 @@ void PPPMDipole::poisson_ik_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdyz_brick_dipole[k][j][i] = work4[n]; + vdyz_brick_spin[k][j][i] = work4[n]; n += 2; } } @@ -1611,7 +1636,7 @@ void PPPMDipole::poisson_ik_dipole() FFT-based Poisson solver for per-atom energy/virial ------------------------------------------------------------------------- */ -void PPPMDipole::poisson_peratom_dipole() +void PPPMSpin::poisson_peratom_spin() { int i,ii,j,k,n; @@ -1638,7 +1663,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0x_brick_dipole[k][j][i] = work4[n]; + v0x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1661,7 +1686,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0y_brick_dipole[k][j][i] = work4[n]; + v0y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1684,7 +1709,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0z_brick_dipole[k][j][i] = work4[n]; + v0z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1707,7 +1732,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1x_brick_dipole[k][j][i] = work4[n]; + v1x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1730,7 +1755,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1y_brick_dipole[k][j][i] = work4[n]; + v1y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1753,7 +1778,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1z_brick_dipole[k][j][i] = work4[n]; + v1z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1776,7 +1801,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2x_brick_dipole[k][j][i] = work4[n]; + v2x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1799,7 +1824,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2y_brick_dipole[k][j][i] = work4[n]; + v2y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1822,7 +1847,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2z_brick_dipole[k][j][i] = work4[n]; + v2z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1845,7 +1870,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3x_brick_dipole[k][j][i] = work4[n]; + v3x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1868,7 +1893,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3y_brick_dipole[k][j][i] = work4[n]; + v3y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1891,7 +1916,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3z_brick_dipole[k][j][i] = work4[n]; + v3z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1914,7 +1939,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4x_brick_dipole[k][j][i] = work4[n]; + v4x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1937,7 +1962,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4y_brick_dipole[k][j][i] = work4[n]; + v4y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1960,7 +1985,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4z_brick_dipole[k][j][i] = work4[n]; + v4z_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -1983,7 +2008,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5x_brick_dipole[k][j][i] = work4[n]; + v5x_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -2006,7 +2031,7 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5y_brick_dipole[k][j][i] = work4[n]; + v5y_brick_spin[k][j][i] = work4[n]; n += 2; } @@ -2029,16 +2054,16 @@ void PPPMDipole::poisson_peratom_dipole() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5z_brick_dipole[k][j][i] = work4[n]; + v5z_brick_spin[k][j][i] = work4[n]; n += 2; } } /* ---------------------------------------------------------------------- - interpolate from grid to get electric field & force on my particles for ik + interpolate from grid to get magnetic field & force on my particles for ik ------------------------------------------------------------------------- */ -void PPPMDipole::fieldforce_ik_dipole() +void PPPMSpin::fieldforce_ik_spin() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; @@ -2052,9 +2077,11 @@ void PPPMDipole::fieldforce_ik_dipole() // (mx,my,mz) = global coords of moving stencil pt - double **mu = atom->mu; + //double **mu = atom->mu; + double **sp = atom->sp; double **x = atom->x; double **f = atom->f; + double **fm = atom->fm; double **t = atom->torque; int nlocal = atom->nlocal; @@ -2080,29 +2107,37 @@ void PPPMDipole::fieldforce_ik_dipole() for (l = nlower; l <= nupper; l++) { mx = l+nx; x0 = y0*rho1d[0][l]; - ex -= x0*ux_brick_dipole[mz][my][mx]; - ey -= x0*uy_brick_dipole[mz][my][mx]; - ez -= x0*uz_brick_dipole[mz][my][mx]; - vxx -= x0*vdxx_brick_dipole[mz][my][mx]; - vyy -= x0*vdyy_brick_dipole[mz][my][mx]; - vzz -= x0*vdzz_brick_dipole[mz][my][mx]; - vxy -= x0*vdxy_brick_dipole[mz][my][mx]; - vxz -= x0*vdxz_brick_dipole[mz][my][mx]; - vyz -= x0*vdyz_brick_dipole[mz][my][mx]; + ex -= x0*ux_brick_spin[mz][my][mx]; + ey -= x0*uy_brick_spin[mz][my][mx]; + ez -= x0*uz_brick_spin[mz][my][mx]; + vxx -= x0*vdxx_brick_spin[mz][my][mx]; + vyy -= x0*vdyy_brick_spin[mz][my][mx]; + vzz -= x0*vdzz_brick_spin[mz][my][mx]; + vxy -= x0*vdxy_brick_spin[mz][my][mx]; + vxz -= x0*vdxz_brick_spin[mz][my][mx]; + vyz -= x0*vdyz_brick_spin[mz][my][mx]; } } } // convert E-field to torque - const double mufactor = qqrd2e * scale; - f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); - f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); - f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); + //const double mufactor = qqrd2e * scale; + const double spfactor = mub2mu0 * scale; + //f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); + //f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); + //f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); + f[i][0] += spfactor*(vxx*sp[i][0] + vxy*sp[i][1] + vxz*sp[i][2]); + f[i][1] += spfactor*(vxy*sp[i][0] + vyy*sp[i][1] + vyz*sp[i][2]); + f[i][2] += spfactor*(vxz*sp[i][0] + vyz*sp[i][1] + vzz*sp[i][2]); + + const double spfactorh = mub2mu0hbinv * scale; + fm[i][0] += spfactorh*ex; + fm[i][1] += spfactorh*ey; + fm[i][2] += spfactorh*ez; + + // create a new vector (in atom_spin style ?) to store long-range fm tables - t[i][0] += mufactor*(mu[i][1]*ez - mu[i][2]*ey); - t[i][1] += mufactor*(mu[i][2]*ex - mu[i][0]*ez); - t[i][2] += mufactor*(mu[i][0]*ey - mu[i][1]*ex); } } @@ -2110,7 +2145,7 @@ void PPPMDipole::fieldforce_ik_dipole() interpolate from grid to get per-atom energy/virial ------------------------------------------------------------------------- */ -void PPPMDipole::fieldforce_peratom_dipole() +void PPPMSpin::fieldforce_peratom_spin() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz,x0,y0,z0; @@ -2124,7 +2159,8 @@ void PPPMDipole::fieldforce_peratom_dipole() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **mu = atom->mu; + //double **mu = atom->mu; + double **sp = atom->sp; double **x = atom->x; int nlocal = atom->nlocal; @@ -2153,42 +2189,42 @@ void PPPMDipole::fieldforce_peratom_dipole() mx = l+nx; x0 = y0*rho1d[0][l]; if (eflag_atom) { - ux += x0*ux_brick_dipole[mz][my][mx]; - uy += x0*uy_brick_dipole[mz][my][mx]; - uz += x0*uz_brick_dipole[mz][my][mx]; + ux += x0*ux_brick_spin[mz][my][mx]; + uy += x0*uy_brick_spin[mz][my][mx]; + uz += x0*uz_brick_spin[mz][my][mx]; } if (vflag_atom) { - v0x += x0*v0x_brick_dipole[mz][my][mx]; - v1x += x0*v1x_brick_dipole[mz][my][mx]; - v2x += x0*v2x_brick_dipole[mz][my][mx]; - v3x += x0*v3x_brick_dipole[mz][my][mx]; - v4x += x0*v4x_brick_dipole[mz][my][mx]; - v5x += x0*v5x_brick_dipole[mz][my][mx]; - v0y += x0*v0y_brick_dipole[mz][my][mx]; - v1y += x0*v1y_brick_dipole[mz][my][mx]; - v2y += x0*v2y_brick_dipole[mz][my][mx]; - v3y += x0*v3y_brick_dipole[mz][my][mx]; - v4y += x0*v4y_brick_dipole[mz][my][mx]; - v5y += x0*v5y_brick_dipole[mz][my][mx]; - v0z += x0*v0z_brick_dipole[mz][my][mx]; - v1z += x0*v1z_brick_dipole[mz][my][mx]; - v2z += x0*v2z_brick_dipole[mz][my][mx]; - v3z += x0*v3z_brick_dipole[mz][my][mx]; - v4z += x0*v4z_brick_dipole[mz][my][mx]; - v5z += x0*v5z_brick_dipole[mz][my][mx]; + v0x += x0*v0x_brick_spin[mz][my][mx]; + v1x += x0*v1x_brick_spin[mz][my][mx]; + v2x += x0*v2x_brick_spin[mz][my][mx]; + v3x += x0*v3x_brick_spin[mz][my][mx]; + v4x += x0*v4x_brick_spin[mz][my][mx]; + v5x += x0*v5x_brick_spin[mz][my][mx]; + v0y += x0*v0y_brick_spin[mz][my][mx]; + v1y += x0*v1y_brick_spin[mz][my][mx]; + v2y += x0*v2y_brick_spin[mz][my][mx]; + v3y += x0*v3y_brick_spin[mz][my][mx]; + v4y += x0*v4y_brick_spin[mz][my][mx]; + v5y += x0*v5y_brick_spin[mz][my][mx]; + v0z += x0*v0z_brick_spin[mz][my][mx]; + v1z += x0*v1z_brick_spin[mz][my][mx]; + v2z += x0*v2z_brick_spin[mz][my][mx]; + v3z += x0*v3z_brick_spin[mz][my][mx]; + v4z += x0*v4z_brick_spin[mz][my][mx]; + v5z += x0*v5z_brick_spin[mz][my][mx]; } } } } - if (eflag_atom) eatom[i] += mu[i][0]*ux + mu[i][1]*uy + mu[i][2]*uz; + if (eflag_atom) eatom[i] += sp[i][0]*ux + sp[i][1]*uy + sp[i][2]*uz; if (vflag_atom) { - vatom[i][0] += mu[i][0]*v0x + mu[i][1]*v0y + mu[i][2]*v0z; - vatom[i][1] += mu[i][0]*v1x + mu[i][1]*v1y + mu[i][2]*v1z; - vatom[i][2] += mu[i][0]*v2x + mu[i][1]*v2y + mu[i][2]*v2z; - vatom[i][3] += mu[i][0]*v3x + mu[i][1]*v3y + mu[i][2]*v3z; - vatom[i][4] += mu[i][0]*v4x + mu[i][1]*v4y + mu[i][2]*v4z; - vatom[i][5] += mu[i][0]*v5x + mu[i][1]*v5y + mu[i][2]*v5z; + vatom[i][0] += sp[i][0]*v0x + sp[i][1]*v0y + sp[i][2]*v0z; + vatom[i][1] += sp[i][0]*v1x + sp[i][1]*v1y + sp[i][2]*v1z; + vatom[i][2] += sp[i][0]*v2x + sp[i][1]*v2y + sp[i][2]*v2z; + vatom[i][3] += sp[i][0]*v3x + sp[i][1]*v3y + sp[i][2]*v3z; + vatom[i][4] += sp[i][0]*v4x + sp[i][1]*v4y + sp[i][2]*v4z; + vatom[i][5] += sp[i][0]*v5x + sp[i][1]*v5y + sp[i][2]*v5z; } } } @@ -2197,20 +2233,20 @@ void PPPMDipole::fieldforce_peratom_dipole() pack own values to buf to send to another proc ------------------------------------------------------------------------- */ -void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMSpin::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == FORWARD_MU) { - FFT_SCALAR *src_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + if (flag == FORWARD_SP) { + FFT_SCALAR *src_ux = &ux_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uy = &uy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uz = &uz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxx = &vdxx_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyy = &vdyy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vzz = &vdzz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxy = &vdxy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxz = &vdxz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyz = &vdyz_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { buf[n++] = src_ux[list[i]]; buf[n++] = src_uy[list[i]]; @@ -2222,25 +2258,25 @@ void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) buf[n++] = src_vxz[list[i]]; buf[n++] = src_vyz[list[i]]; } - } else if (flag == FORWARD_MU_PERATOM) { - FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + } else if (flag == FORWARD_SP_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { buf[n++] = v0xsrc[list[i]]; buf[n++] = v1xsrc[list[i]]; @@ -2268,20 +2304,20 @@ void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) unpack another proc's own values from buf and set own ghost values ------------------------------------------------------------------------- */ -void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMSpin::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == FORWARD_MU) { - FFT_SCALAR *dest_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + if (flag == FORWARD_SP) { + FFT_SCALAR *dest_ux = &ux_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uy = &uy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uz = &uz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxx = &vdxx_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyy = &vdyy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vzz = &vdzz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxy = &vdxy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxz = &vdxz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyz = &vdyz_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { dest_ux[list[i]] = buf[n++]; dest_uy[list[i]] = buf[n++]; @@ -2293,25 +2329,25 @@ void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) dest_vxz[list[i]] = buf[n++]; dest_vyz[list[i]] = buf[n++]; } - } else if (flag == FORWARD_MU_PERATOM) { - FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + } else if (flag == FORWARD_SP_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { v0xsrc[list[i]] = buf[n++]; v1xsrc[list[i]] = buf[n++]; @@ -2339,17 +2375,17 @@ void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) pack ghost values into buf to send to another proc ------------------------------------------------------------------------- */ -void PPPMDipole::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMSpin::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == REVERSE_MU) { - FFT_SCALAR *src_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + if (flag == REVERSE_SP) { + FFT_SCALAR *src_spin0 = &densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_spin1 = &densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_spin2 = &densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { - buf[n++] = src_dipole0[list[i]]; - buf[n++] = src_dipole1[list[i]]; - buf[n++] = src_dipole2[list[i]]; + buf[n++] = src_spin0[list[i]]; + buf[n++] = src_spin1[list[i]]; + buf[n++] = src_spin2[list[i]]; } } } @@ -2358,17 +2394,17 @@ void PPPMDipole::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) unpack another proc's ghost values from buf and add to own values ------------------------------------------------------------------------- */ -void PPPMDipole::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMSpin::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == REVERSE_MU) { - FFT_SCALAR *dest_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + if (flag == REVERSE_SP) { + FFT_SCALAR *dest_spin0 = &densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_spin1 = &densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_spin2 = &densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { - dest_dipole0[list[i]] += buf[n++]; - dest_dipole1[list[i]] += buf[n++]; - dest_dipole2[list[i]] += buf[n++]; + dest_spin0[list[i]] += buf[n++]; + dest_spin1[list[i]] += buf[n++]; + dest_spin2[list[i]] += buf[n++]; } } } @@ -2381,22 +2417,23 @@ void PPPMDipole::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) extended to non-neutral systems (J. Chem. Phys. 131, 094107). ------------------------------------------------------------------------- */ -void PPPMDipole::slabcorr() +void PPPMSpin::slabcorr() { - // compute local contribution to global dipole moment + // compute local contribution to global spin moment double **x = atom->x; double zprd = domain->zprd; int nlocal = atom->nlocal; - double dipole = 0.0; - double **mu = atom->mu; - for (int i = 0; i < nlocal; i++) dipole += mu[i][2]; + double spin = 0.0; + //double **mu = atom->mu; + double **sp = atom->sp; + for (int i = 0; i < nlocal; i++) spin += sp[i][2]; - // sum local contributions to get global dipole moment + // sum local contributions to get global spin moment - double dipole_all; - MPI_Allreduce(&dipole,&dipole_all,1,MPI_DOUBLE,MPI_SUM,world); + double spin_all; + MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); // need to make non-neutral systems and/or // per-atom energy translationally invariant @@ -2404,42 +2441,48 @@ void PPPMDipole::slabcorr() if (eflag_atom || fabs(qsum) > SMALL) { error->all(FLERR,"Cannot (yet) use kspace slab correction with " - "long-range dipoles and non-neutral systems or per-atom energy"); + "long-range spins and non-neutral systems or per-atom energy"); } // compute corrections - const double e_slabcorr = MY_2PI*(dipole_all*dipole_all/12.0)/volume; - const double qscale = qqrd2e * scale; + const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; + //const double qscale = qqrd2e * scale; + const double spscale = mub2mu0 * scale; - if (eflag_global) energy += qscale * e_slabcorr; + if (eflag_global) energy += spscale * e_slabcorr; // per-atom energy if (eflag_atom) { - double efact = qscale * MY_2PI/volume/12.0; + //double efact = qscale * MY_2PI/volume/12.0; + double efact = spscale * MY_2PI/volume/12.0; for (int i = 0; i < nlocal; i++) - eatom[i] += efact * mu[i][2]*dipole_all; + //eatom[i] += efact * mu[i][2]*spin_all; + eatom[i] += efact * sp[i][2]*spin_all; } // add on torque corrections - if (atom->torque) { - double ffact = qscale * (-4.0*MY_PI/volume); - double **mu = atom->mu; - double **torque = atom->torque; - for (int i = 0; i < nlocal; i++) { - torque[i][0] += ffact * dipole_all * mu[i][1]; - torque[i][1] += -ffact * dipole_all * mu[i][0]; - } - } + // no torque for the spins + // should it be calculated for the magnetic force fm? + + //if (atom->torque) { + // double ffact = qscale * (-4.0*MY_PI/volume); + // double **mu = atom->mu; + // double **torque = atom->torque; + // for (int i = 0; i < nlocal; i++) { + // torque[i][0] += ffact * spin_all * mu[i][1]; + // torque[i][1] += -ffact * spin_all * mu[i][0]; + // } + //} } /* ---------------------------------------------------------------------- perform and time the 1d FFTs required for N timesteps ------------------------------------------------------------------------- */ -int PPPMDipole::timing_1d(int n, double &time1d) +int PPPMSpin::timing_1d(int n, double &time1d) { double time1,time2; @@ -2474,7 +2517,7 @@ int PPPMDipole::timing_1d(int n, double &time1d) perform and time the 3d FFTs required for N timesteps ------------------------------------------------------------------------- */ -int PPPMDipole::timing_3d(int n, double &time3d) +int PPPMSpin::timing_3d(int n, double &time3d) { double time1,time2; @@ -2509,7 +2552,7 @@ int PPPMDipole::timing_3d(int n, double &time3d) memory usage of local arrays ------------------------------------------------------------------------- */ -double PPPMDipole::memory_usage() +double PPPMSpin::memory_usage() { double bytes = nmax*3 * sizeof(double); int nbrick = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * @@ -2523,37 +2566,41 @@ double PPPMDipole::memory_usage() if (peratom_allocate_flag) bytes += 21 * nbrick * sizeof(FFT_SCALAR); - if (cg_dipole) bytes += cg_dipole->memory_usage(); - if (cg_peratom_dipole) bytes += cg_peratom_dipole->memory_usage(); + if (cg_spin) bytes += cg_spin->memory_usage(); + if (cg_peratom_spin) bytes += cg_peratom_spin->memory_usage(); return bytes; } /* ---------------------------------------------------------------------- - compute musum,musqsum,mu2 - called initially, when particle count changes, when dipoles are changed + compute spsum,spsqsum,sp2 + called initially, when particle count changes, when spins are changed ------------------------------------------------------------------------- */ -void PPPMDipole::musum_musq() +void PPPMSpin::spsum_spsq() { const int nlocal = atom->nlocal; - musum = musqsum = mu2 = 0.0; - if (atom->mu_flag) { - double** mu = atom->mu; - double musum_local(0.0), musqsum_local(0.0); + spsum = spsqsum = sp2 = 0.0; + if (atom->sp_flag) { + double **sp = atom->sp; + double spsum_local(0.0), spsqsum_local(0.0); + + // not exactly the good loop: need to add norm of spins for (int i = 0; i < nlocal; i++) { - musum_local += mu[i][0] + mu[i][1] + mu[i][2]; - musqsum_local += mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]; + spsum_local += sp[i][0] + sp[i][1] + sp[i][2]; + spsqsum_local += sp[i][0]*sp[i][0] + sp[i][1]*sp[i][1] + sp[i][2]*sp[i][2]; } - MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); - mu2 = musqsum * force->qqrd2e; + //mu2 = musqsum * force->qqrd2e; + // find correct units + sp2 = spsqsum * mub2mu0; } - if (mu2 == 0 && comm->me == 0) - error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); -} \ No newline at end of file + if (sp2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMSpin on system with no spins"); +} diff --git a/src/KSPACE/pppm_spin.h b/src/KSPACE/pppm_spin.h index 4d6906f974..aacda1f0af 100644 --- a/src/KSPACE/pppm_spin.h +++ b/src/KSPACE/pppm_spin.h @@ -13,7 +13,7 @@ #ifdef KSPACE_CLASS -KSpaceStyle(pppm/dipole,PPPMDipole) +KSpaceStyle(pppm/spin,PPPMSpin) #else @@ -24,10 +24,10 @@ KSpaceStyle(pppm/dipole,PPPMDipole) namespace LAMMPS_NS { -class PPPMDipole : public PPPM { +class PPPMSpin : public PPPM { public: - PPPMDipole(class LAMMPS *, int, char **); - virtual ~PPPMDipole(); + PPPMSpin(class LAMMPS *, int, char **); + virtual ~PPPMSpin(); void init(); void setup(); void setup_grid(); @@ -55,37 +55,37 @@ class PPPMDipole : public PPPM { void pack_reverse(int, FFT_SCALAR *, int, int *); void unpack_reverse(int, FFT_SCALAR *, int, int *); - // dipole + // spin - FFT_SCALAR ***densityx_brick_dipole,***densityy_brick_dipole,***densityz_brick_dipole; - FFT_SCALAR ***vdxx_brick_dipole,***vdyy_brick_dipole,***vdzz_brick_dipole; - FFT_SCALAR ***vdxy_brick_dipole,***vdxz_brick_dipole,***vdyz_brick_dipole; - FFT_SCALAR ***ux_brick_dipole,***uy_brick_dipole,***uz_brick_dipole; - FFT_SCALAR ***v0x_brick_dipole,***v1x_brick_dipole,***v2x_brick_dipole; - FFT_SCALAR ***v3x_brick_dipole,***v4x_brick_dipole,***v5x_brick_dipole; - FFT_SCALAR ***v0y_brick_dipole,***v1y_brick_dipole,***v2y_brick_dipole; - FFT_SCALAR ***v3y_brick_dipole,***v4y_brick_dipole,***v5y_brick_dipole; - FFT_SCALAR ***v0z_brick_dipole,***v1z_brick_dipole,***v2z_brick_dipole; - FFT_SCALAR ***v3z_brick_dipole,***v4z_brick_dipole,***v5z_brick_dipole; + FFT_SCALAR ***densityx_brick_spin,***densityy_brick_spin,***densityz_brick_spin; + FFT_SCALAR ***vdxx_brick_spin,***vdyy_brick_spin,***vdzz_brick_spin; + FFT_SCALAR ***vdxy_brick_spin,***vdxz_brick_spin,***vdyz_brick_spin; + FFT_SCALAR ***ux_brick_spin,***uy_brick_spin,***uz_brick_spin; + FFT_SCALAR ***v0x_brick_spin,***v1x_brick_spin,***v2x_brick_spin; + FFT_SCALAR ***v3x_brick_spin,***v4x_brick_spin,***v5x_brick_spin; + FFT_SCALAR ***v0y_brick_spin,***v1y_brick_spin,***v2y_brick_spin; + FFT_SCALAR ***v3y_brick_spin,***v4y_brick_spin,***v5y_brick_spin; + FFT_SCALAR ***v0z_brick_spin,***v1z_brick_spin,***v2z_brick_spin; + FFT_SCALAR ***v3z_brick_spin,***v4z_brick_spin,***v5z_brick_spin; FFT_SCALAR *work3,*work4; - FFT_SCALAR *densityx_fft_dipole,*densityy_fft_dipole,*densityz_fft_dipole; - class GridComm *cg_dipole; - class GridComm *cg_peratom_dipole; - int only_dipole_flag; + FFT_SCALAR *densityx_fft_spin,*densityy_fft_spin,*densityz_fft_spin; + class GridComm *cg_spin; + class GridComm *cg_peratom_spin; + int only_spin_flag; double musum,musqsum,mu2; - double find_gewald_dipole(double, double, bigint, double, double); - double newton_raphson_f_dipole(double, double, bigint, double, double); - double derivf_dipole(double, double, bigint, double, double); - double compute_df_kspace_dipole(); - double compute_qopt_dipole(); - void compute_gf_dipole(); - void make_rho_dipole(); - void brick2fft_dipole(); - void poisson_ik_dipole(); - void poisson_peratom_dipole(); - void fieldforce_ik_dipole(); - void fieldforce_peratom_dipole(); - double final_accuracy_dipole(); + double find_gewald_spin(double, double, bigint, double, double); + double newton_raphson_f_spin(double, double, bigint, double, double); + double derivf_spin(double, double, bigint, double, double); + double compute_df_kspace_spin(); + double compute_qopt_spin(); + void compute_gf_spin(); + void make_rho_spin(); + void brick2fft_spin(); + void poisson_ik_spin(); + void poisson_peratom_spin(); + void fieldforce_ik_spin(); + void fieldforce_peratom_spin(); + double final_accuracy_spin(); void musum_musq(); }; @@ -97,9 +97,9 @@ class PPPMDipole : public PPPM { /* ERROR/WARNING messages: -E: Cannot (yet) use charges with Kspace style PPPMDipole +E: Cannot (yet) use charges with Kspace style PPPMSpin -Charge-dipole interactions are not yet implemented in PPPMDipole so this +Charge-spin interactions are not yet implemented in PPPMSpin so this feature is not yet supported. E: Must redefine kspace_style after changing to triclinic box @@ -110,19 +110,19 @@ E: Kspace style requires atom attribute mu The atom style defined does not have this attribute. -E: Cannot (yet) use kspace_modify diff ad with dipoles +E: Cannot (yet) use kspace_modify diff ad with spins This feature is not yet supported. -E: Cannot (yet) use 'electron' units with dipoles +E: Cannot (yet) use 'electron' units with spins This feature is not yet supported. -E: Cannot yet use triclinic cells with PPPMDipole +E: Cannot yet use triclinic cells with PPPMSpin This feature is not yet supported. -E: Cannot yet use TIP4P with PPPMDipole +E: Cannot yet use TIP4P with PPPMSpin This feature is not yet supported. @@ -144,7 +144,7 @@ This is a limitation of the PPPM implementation in LAMMPS. E: KSpace style is incompatible with Pair style Setting a kspace style requires that a pair style with matching -long-range dipole components be used. +long-range spin components be used. W: Reducing PPPM order b/c stencil extends beyond nearest neighbor processor @@ -202,11 +202,11 @@ outside a processor's sub-domain or even the entire simulation box. This indicates bad physics, e.g. due to highly overlapping atoms, too large a timestep, etc. -E: Using kspace solver PPPMDipole on system with no dipoles +E: Using kspace solver PPPMSpin on system with no spins -Must have non-zero dipoles with PPPMDipole. +Must have non-zero spins with PPPMSpin. -E: Must use kspace_modify gewald for system with no dipoles +E: Must use kspace_modify gewald for system with no spins Self-explanatory. From 5e287033f79e8662a18767239b4c8d2b6eac7308 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 16 Aug 2018 10:13:18 -0600 Subject: [PATCH 0034/1242] Commit1 JT 081618 - converted pppm_spin for long range spin-spin interactions - modified kspace, pair,and pair_hybrid to add spinflag --- src/KSPACE/pppm_spin.cpp | 138 ++++++++++++++---------------------- src/KSPACE/pppm_spin.h | 9 ++- src/SPIN/pair_spin_long.cpp | 2 +- src/kspace.cpp | 4 +- src/kspace.h | 1 + src/pair.cpp | 2 +- src/pair.h | 1 + src/pair_hybrid.cpp | 1 + 8 files changed, 70 insertions(+), 88 deletions(-) diff --git a/src/KSPACE/pppm_spin.cpp b/src/KSPACE/pppm_spin.cpp index c51de8d023..9b59f9cd7b 100644 --- a/src/KSPACE/pppm_spin.cpp +++ b/src/KSPACE/pppm_spin.cpp @@ -115,13 +115,7 @@ void PPPMSpin::init() // error check - //spinflag = atom->mu?1:0; spinflag = atom->sp?1:0; - // no charges here, charge neutrality - //qsum_qsq(0); - // maybe change this test - if (spinflag && q2) - error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMSpin"); triclinic_check(); @@ -175,17 +169,12 @@ void PPPMSpin::init() if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMSpin"); - // compute qsum & qsqsum and warn if not charge-neutral - scale = 1.0; - //qqrd2e = force->qqrd2e; - // need to define mag constants instead hbar = force->hplanck/MY_2PI; // eV/(rad.THz) mub = 5.78901e-5; // in eV/T mu_0 = 1.2566370614e-6; // in T.m/A mub2mu0 = mub * mub * mu_0; // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz - //musum_musq(); spsum_spsq(); natoms_original = atom->natoms; @@ -458,7 +447,6 @@ void PPPMSpin::compute(int eflag, int vflag) // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - //musum_musq(); spsum_spsq(); natoms_original = atom->natoms; } @@ -520,7 +508,6 @@ void PPPMSpin::compute(int eflag, int vflag) // sum global energy across procs and add in volume-dependent term - //const double qscale = qqrd2e * scale; const double spscale = mub2mu0 * scale; const double g3 = g_ewald*g_ewald*g_ewald; @@ -531,7 +518,7 @@ void PPPMSpin::compute(int eflag, int vflag) energy *= 0.5*volume; energy -= spsqsum*2.0*g3/3.0/MY_PIS; - energy *= qscale; + energy *= spscale; } // sum global virial across procs @@ -539,32 +526,32 @@ void PPPMSpin::compute(int eflag, int vflag) if (vflag_global) { double virial_all[6]; MPI_Allreduce(virial,virial_all,6,MPI_DOUBLE,MPI_SUM,world); - for (i = 0; i < 6; i++) virial[i] = 0.5*qscale*volume*virial_all[i]; + for (i = 0; i < 6; i++) virial[i] = 0.5*spscale*volume*virial_all[i]; } // per-atom energy/virial // energy includes self-energy correction if (evflag_atom) { - //double *q = atom->q; - //double **mu = atom->mu; double **sp = atom->sp; + double spx,spy,spz; int nlocal = atom->nlocal; int ntotal = nlocal; if (eflag_atom) { for (i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; eatom[i] *= 0.5; - //eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; - eatom[i] -= (sp[i][0]*sp[i][0] + sp[i][1]*sp[i][1] + sp[i][2]*sp[i][2])*2.0*g3/3.0/MY_PIS; - //eatom[i] *= qscale; + eatom[i] -= (spx*spx + spy*spy + spz*spz)*2.0*g3/3.0/MY_PIS; eatom[i] *= spscale; } } if (vflag_atom) { for (i = 0; i < ntotal; i++) - for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*qscale; + for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*spscale; } } @@ -918,7 +905,6 @@ double PPPMSpin::compute_df_kspace_spin() double zprd_slab = zprd*slab_volfactor; bigint natoms = atom->natoms; double qopt = compute_qopt_spin(); - //double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); double df_kspace = sqrt(qopt/natoms)*sp2/(3.0*xprd*yprd*zprd_slab); return df_kspace; } @@ -1131,8 +1117,6 @@ double PPPMSpin::newton_raphson_f() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - //df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * - // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); df_kspace = compute_df_kspace_spin(); @@ -1218,9 +1202,6 @@ double PPPMSpin::final_accuracy_spin() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - //double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * - // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * - // exp(-rg2)); double df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); @@ -1285,8 +1266,8 @@ void PPPMSpin::make_rho_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - //double **mu = atom->mu; double **sp = atom->sp; + double spx,spy,spz; double **x = atom->x; int nlocal = atom->nlocal; @@ -1301,9 +1282,12 @@ void PPPMSpin::make_rho_spin() compute_rho1d(dx,dy,dz); - z0 = delvolinv * sp[i][0]; - z1 = delvolinv * sp[i][1]; - z2 = delvolinv * sp[i][2]; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + z0 = delvolinv * spx; + z1 = delvolinv * spy; + z2 = delvolinv * spz; for (n = nlower; n <= nupper; n++) { mz = n+nz; y0 = z0*rho1d[2][n]; @@ -2076,13 +2060,11 @@ void PPPMSpin::fieldforce_ik_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - - //double **mu = atom->mu; double **sp = atom->sp; + double spx,spy,spz; double **x = atom->x; double **f = atom->f; double **fm = atom->fm; - double **t = atom->torque; int nlocal = atom->nlocal; @@ -2120,16 +2102,15 @@ void PPPMSpin::fieldforce_ik_spin() } } - // convert E-field to torque + // convert M-field to mech. and mag. forces - //const double mufactor = qqrd2e * scale; const double spfactor = mub2mu0 * scale; - //f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); - //f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); - //f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); - f[i][0] += spfactor*(vxx*sp[i][0] + vxy*sp[i][1] + vxz*sp[i][2]); - f[i][1] += spfactor*(vxy*sp[i][0] + vyy*sp[i][1] + vyz*sp[i][2]); - f[i][2] += spfactor*(vxz*sp[i][0] + vyz*sp[i][1] + vzz*sp[i][2]); + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + f[i][0] += spfactor*(vxx*spx + vxy*spy + vxz*spz); + f[i][1] += spfactor*(vxy*spx + vyy*spy + vyz*spz); + f[i][2] += spfactor*(vxz*spx + vyz*spy + vzz*spz); const double spfactorh = mub2mu0hbinv * scale; fm[i][0] += spfactorh*ex; @@ -2159,8 +2140,8 @@ void PPPMSpin::fieldforce_peratom_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - //double **mu = atom->mu; double **sp = atom->sp; + double spx,spy,spz; double **x = atom->x; int nlocal = atom->nlocal; @@ -2217,14 +2198,17 @@ void PPPMSpin::fieldforce_peratom_spin() } } - if (eflag_atom) eatom[i] += sp[i][0]*ux + sp[i][1]*uy + sp[i][2]*uz; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + if (eflag_atom) eatom[i] += spx*ux + spy*uy + spz*uz; if (vflag_atom) { - vatom[i][0] += sp[i][0]*v0x + sp[i][1]*v0y + sp[i][2]*v0z; - vatom[i][1] += sp[i][0]*v1x + sp[i][1]*v1y + sp[i][2]*v1z; - vatom[i][2] += sp[i][0]*v2x + sp[i][1]*v2y + sp[i][2]*v2z; - vatom[i][3] += sp[i][0]*v3x + sp[i][1]*v3y + sp[i][2]*v3z; - vatom[i][4] += sp[i][0]*v4x + sp[i][1]*v4y + sp[i][2]*v4z; - vatom[i][5] += sp[i][0]*v5x + sp[i][1]*v5y + sp[i][2]*v5z; + vatom[i][0] += spx*v0x + spy*v0y + spz*v0z; + vatom[i][1] += spx*v1x + spy*v1y + spz*v1z; + vatom[i][2] += spx*v2x + spy*v2y + spz*v2z; + vatom[i][3] += spx*v3x + spy*v3y + spz*v3z; + vatom[i][4] += spx*v4x + spy*v4y + spz*v4z; + vatom[i][5] += spx*v5x + spy*v5y + spz*v5z; } } } @@ -2426,28 +2410,21 @@ void PPPMSpin::slabcorr() int nlocal = atom->nlocal; double spin = 0.0; - //double **mu = atom->mu; double **sp = atom->sp; - for (int i = 0; i < nlocal; i++) spin += sp[i][2]; + double spx,spy,spz; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + spin += spz; + } // sum local contributions to get global spin moment double spin_all; MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); - // need to make non-neutral systems and/or - // per-atom energy translationally invariant - - if (eflag_atom || fabs(qsum) > SMALL) { - - error->all(FLERR,"Cannot (yet) use kspace slab correction with " - "long-range spins and non-neutral systems or per-atom energy"); - } - // compute corrections const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; - //const double qscale = qqrd2e * scale; const double spscale = mub2mu0 * scale; if (eflag_global) energy += spscale * e_slabcorr; @@ -2455,27 +2432,20 @@ void PPPMSpin::slabcorr() // per-atom energy if (eflag_atom) { - //double efact = qscale * MY_2PI/volume/12.0; double efact = spscale * MY_2PI/volume/12.0; - for (int i = 0; i < nlocal; i++) - //eatom[i] += efact * mu[i][2]*spin_all; - eatom[i] += efact * sp[i][2]*spin_all; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + eatom[i] += efact * spz * spin_all; + } } - // add on torque corrections + // add on mag. force corrections - // no torque for the spins - // should it be calculated for the magnetic force fm? - - //if (atom->torque) { - // double ffact = qscale * (-4.0*MY_PI/volume); - // double **mu = atom->mu; - // double **torque = atom->torque; - // for (int i = 0; i < nlocal; i++) { - // torque[i][0] += ffact * spin_all * mu[i][1]; - // torque[i][1] += -ffact * spin_all * mu[i][0]; - // } - //} + double ffact = spscale * (-4.0*MY_PI/volume); + double **fm = atom->fm; + for (int i = 0; i < nlocal; i++) { + fm[i][2] += ffact * spin_all; + } } /* ---------------------------------------------------------------------- @@ -2584,20 +2554,22 @@ void PPPMSpin::spsum_spsq() spsum = spsqsum = sp2 = 0.0; if (atom->sp_flag) { double **sp = atom->sp; + double spx, spy, spz; double spsum_local(0.0), spsqsum_local(0.0); // not exactly the good loop: need to add norm of spins for (int i = 0; i < nlocal; i++) { - spsum_local += sp[i][0] + sp[i][1] + sp[i][2]; - spsqsum_local += sp[i][0]*sp[i][0] + sp[i][1]*sp[i][1] + sp[i][2]*sp[i][2]; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + spsum_local += spx + spy + spz; + spsqsum_local += spx*spx + spy*spy + spz*spz; } MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); - //mu2 = musqsum * force->qqrd2e; - // find correct units sp2 = spsqsum * mub2mu0; } diff --git a/src/KSPACE/pppm_spin.h b/src/KSPACE/pppm_spin.h index aacda1f0af..3b4d42d4ea 100644 --- a/src/KSPACE/pppm_spin.h +++ b/src/KSPACE/pppm_spin.h @@ -37,6 +37,11 @@ class PPPMSpin : public PPPM { double memory_usage(); protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force void set_grid_global(); double newton_raphson_f(); @@ -72,7 +77,7 @@ class PPPMSpin : public PPPM { class GridComm *cg_spin; class GridComm *cg_peratom_spin; int only_spin_flag; - double musum,musqsum,mu2; + double spsum,spsqsum,sp2; double find_gewald_spin(double, double, bigint, double, double); double newton_raphson_f_spin(double, double, bigint, double, double); double derivf_spin(double, double, bigint, double, double); @@ -86,7 +91,7 @@ class PPPMSpin : public PPPM { void fieldforce_ik_spin(); void fieldforce_peratom_spin(); double final_accuracy_spin(); - void musum_musq(); + void spsum_spsq(); }; diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp index 66b684ae1d..95c4e6b5a9 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_long.cpp @@ -59,7 +59,7 @@ PairSpinLong::PairSpinLong(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; - ewaldflag = pppmflag = 1; + ewaldflag = pppmflag = spinflag = 1; respa_enable = 0; no_virial_fdotr_compute = 1; lattice_flag = 0; diff --git a/src/kspace.cpp b/src/kspace.cpp index da606bbf3d..75b6abf515 100644 --- a/src/kspace.cpp +++ b/src/kspace.cpp @@ -37,7 +37,7 @@ KSpace::KSpace(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) virial[0] = virial[1] = virial[2] = virial[3] = virial[4] = virial[5] = 0.0; triclinic_support = 1; - ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = 0; + ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = spinflag = 0; compute_flag = 1; group_group_enable = 0; stagger_flag = 0; @@ -192,6 +192,8 @@ void KSpace::pair_check() error->all(FLERR,"KSpace style is incompatible with Pair style"); if (dipoleflag && !force->pair->dipoleflag) error->all(FLERR,"KSpace style is incompatible with Pair style"); + if (spinflag && !force->pair->spinflag) + error->all(FLERR,"KSpace style is incompatible with Pair style"); if (tip4pflag && !force->pair->tip4pflag) error->all(FLERR,"KSpace style is incompatible with Pair style"); diff --git a/src/kspace.h b/src/kspace.h index 55ace5aa71..c049ad11f1 100644 --- a/src/kspace.h +++ b/src/kspace.h @@ -44,6 +44,7 @@ class KSpace : protected Pointers { int dispersionflag; // 1 if a LJ/dispersion solver int tip4pflag; // 1 if a TIP4P solver int dipoleflag; // 1 if a dipole solver + int spinflag; // 1 if a spin solver int differentiation_flag; int neighrequest_flag; // used to avoid obsolete construction // of neighbor lists diff --git a/src/pair.cpp b/src/pair.cpp index 5c308cc7ce..88fed646b4 100644 --- a/src/pair.cpp +++ b/src/pair.cpp @@ -72,7 +72,7 @@ Pair::Pair(LAMMPS *lmp) : Pointers(lmp) single_extra = 0; svector = NULL; - ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = 0; + ewaldflag = pppmflag = msmflag = dispersionflag = tip4pflag = dipoleflag = spinflag = 0; reinitflag = 1; // pair_modify settings diff --git a/src/pair.h b/src/pair.h index 844bc0cdc7..f830b7c035 100644 --- a/src/pair.h +++ b/src/pair.h @@ -61,6 +61,7 @@ class Pair : protected Pointers { int dispersionflag; // 1 if compatible with LJ/dispersion solver int tip4pflag; // 1 if compatible with TIP4P solver int dipoleflag; // 1 if compatible with dipole solver + int spinflag; // 1 if compatible with spin long solver int reinitflag; // 1 if compatible with fix adapt and alike int tail_flag; // pair_modify flag for LJ tail correction diff --git a/src/pair_hybrid.cpp b/src/pair_hybrid.cpp index dc74dd040d..34359b8009 100644 --- a/src/pair_hybrid.cpp +++ b/src/pair_hybrid.cpp @@ -352,6 +352,7 @@ void PairHybrid::flags() if (styles[m]->pppmflag) pppmflag = 1; if (styles[m]->msmflag) msmflag = 1; if (styles[m]->dipoleflag) dipoleflag = 1; + if (styles[m]->spinflag) spinflag = 1; if (styles[m]->dispersionflag) dispersionflag = 1; if (styles[m]->tip4pflag) tip4pflag = 1; if (styles[m]->compute_flag) compute_flag = 1; From 9962f941e674e3dd18e76dec4ba5017e98832513 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sat, 18 Aug 2018 11:53:03 -0500 Subject: [PATCH 0035/1242] pair_kim - no need to comm vatom() values --- src/KIM/pair_kim.cpp | 86 +++----------------------------------------- 1 file changed, 5 insertions(+), 81 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index a298187c12..d6dfa9112c 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -476,8 +476,8 @@ void PairKIM::init_style() } - // make sure comm_reverse expects (at most) 9 values when newton is off - if (!lmps_using_newton) comm_reverse_off = 9; + // make sure comm_reverse expects (at most) 3 values when newton is off + if (!lmps_using_newton) comm_reverse_off = 3; // request full neighbor for (int i = 0; i < kim_number_of_neighbor_lists; ++i) @@ -543,9 +543,7 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) m = 0; last = first + n; - if ((kim_model_support_for_forces != notSupported) && - ((vflag_atom == 0) || - (kim_model_support_for_particleVirial == notSupported))) + if (kim_model_support_for_forces != notSupported) { for (i = first; i < last; i++) { @@ -555,42 +553,6 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) } return m; } - else if ((kim_model_support_for_forces != notSupported) && - (vflag_atom == 1) && - (kim_model_support_for_particleVirial != notSupported)) - { - double *va=&(vatom[0][0]); - for (i = first; i < last; i++) - { - buf[m++] = fp[3*i+0]; - buf[m++] = fp[3*i+1]; - buf[m++] = fp[3*i+2]; - - buf[m++] = va[6*i+0]; - buf[m++] = va[6*i+1]; - buf[m++] = va[6*i+2]; - buf[m++] = va[6*i+3]; - buf[m++] = va[6*i+4]; - buf[m++] = va[6*i+5]; - } - return m; - } - else if ((kim_model_support_for_forces == notSupported) && - (vflag_atom == 1) && - (kim_model_support_for_particleVirial != notSupported)) - { - double *va=&(vatom[0][0]); - for (i = first; i < last; i++) - { - buf[m++] = va[6*i+0]; - buf[m++] = va[6*i+1]; - buf[m++] = va[6*i+2]; - buf[m++] = va[6*i+3]; - buf[m++] = va[6*i+4]; - buf[m++] = va[6*i+5]; - } - return m; - } else return 0; } @@ -606,9 +568,7 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) fp = &(atom->f[0][0]); m = 0; - if ((kim_model_support_for_forces != notSupported) && - ((vflag_atom == 0) || - (kim_model_support_for_particleVirial == notSupported))) + if (kim_model_support_for_forces != notSupported) { for (i = 0; i < n; i++) { @@ -618,42 +578,6 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) fp[3*j+2]+= buf[m++]; } } - else if ((kim_model_support_for_forces != notSupported) && - (vflag_atom == 1) && - (kim_model_support_for_particleVirial != notSupported)) - { - double *va=&(vatom[0][0]); - for (i = 0; i < n; i++) - { - j = list[i]; - fp[3*j+0]+= buf[m++]; - fp[3*j+1]+= buf[m++]; - fp[3*j+2]+= buf[m++]; - - va[j*6+0]+=buf[m++]; - va[j*6+1]+=buf[m++]; - va[j*6+2]+=buf[m++]; - va[j*6+3]+=buf[m++]; - va[j*6+4]+=buf[m++]; - va[j*6+5]+=buf[m++]; - } - } - else if ((kim_model_support_for_forces == notSupported) && - (vflag_atom == 1) && - (kim_model_support_for_particleVirial != notSupported)) - { - double *va=&(vatom[0][0]); - for (i = 0; i < n; i++) - { - j = list[i]; - va[j*6+0]+=buf[m++]; - va[j*6+1]+=buf[m++]; - va[j*6+2]+=buf[m++]; - va[j*6+3]+=buf[m++]; - va[j*6+4]+=buf[m++]; - va[j*6+5]+=buf[m++]; - } - } else ;// do nothing @@ -875,7 +799,7 @@ void PairKIM::set_argument_pointers() } else if (kim_model_support_for_particleVirial != notSupported) { - kimerror = kimerror || pargs->SetArgumentPointer(partialParticleEnergy, + kimerror = kimerror || pargs->SetArgumentPointer(partialParticleVirial, &(vatom[0][0])); } From 7aa7002347f709af29016071538182c8157f8d87 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sat, 18 Aug 2018 12:02:22 -0500 Subject: [PATCH 0036/1242] Added check & error for KIM/LAMMPSvirial argument --- src/KIM/pair_kim.cpp | 12 +++++++++++- src/KIM/pair_kim.h | 4 ++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index d6dfa9112c..f82617ee0e 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -308,7 +308,17 @@ void PairKIM::settings(int narg, char **arg) ++settings_call_count; init_style_call_count = 0; - if (narg != 1) error->all(FLERR,"Illegal pair_style command"); + if (narg != 1) + { + if ((narg > 0) && ((0 == strcmp("KIMvirial", argv[0])) || + (0 == strcmp("LAMMPSvirial", argv[0])))) + { + error->all(FLERR,"'KIMvirial' or 'LAMMPSvirial' not supported with " + "kim-api-v2."); + } + else + error->all(FLERR,"Illegal pair_style command"); + } // arg[0] is the KIM Model name lmps_using_molecular = (atom->molecular > 0); diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index e2be0855db..eef6e0345b 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -179,6 +179,10 @@ E: KIM Compute returned error The KIM model was unable, for some reason, to complete the computation. +E: 'KIMvirial' or 'LAMMPSvirial' not supported with kim-api-v2. + +"KIMvirial or "LAMMPSvirial" found on the pair_style line. These keys are not supported kim-api-v2. (The virial computation is always performed by LAMMPS.) Please remove these keys, make sure the KIM model you are using supports kim-api-v2, and rerun. + E: Illegal pair_style command Self-explanatory. From dd2a1e4787a927ccf00f34bd0dc6e7e5c4c7023f Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sat, 18 Aug 2018 12:38:29 -0500 Subject: [PATCH 0037/1242] Fix typos in pair_kim.cpp --- src/KIM/pair_kim.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index f82617ee0e..e209cb1202 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -310,8 +310,8 @@ void PairKIM::settings(int narg, char **arg) if (narg != 1) { - if ((narg > 0) && ((0 == strcmp("KIMvirial", argv[0])) || - (0 == strcmp("LAMMPSvirial", argv[0])))) + if ((narg > 0) && ((0 == strcmp("KIMvirial", arg[0])) || + (0 == strcmp("LAMMPSvirial", arg[0])))) { error->all(FLERR,"'KIMvirial' or 'LAMMPSvirial' not supported with " "kim-api-v2."); From 8d79db03d38061cf18c12954472ba64a79aa12ad Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 21 Aug 2018 13:47:38 -0600 Subject: [PATCH 0038/1242] Commit1 JT 082118 - created pppm_dipole_spin.h/cpp (child-class of pppm_dipole) - improved pair_spin_long.h/cpp - created documentation for pair_spin_long - new 3xN fm_long vector in atom_vec_spin (with associated comm) --- doc/src/Eqs/pair_spin_long_range.jpg | Bin 0 -> 11980 bytes doc/src/Eqs/pair_spin_long_range.tex | 20 + doc/src/Eqs/pair_spin_long_range_force.jpg | Bin 0 -> 16016 bytes doc/src/Eqs/pair_spin_long_range_force.tex | 23 + doc/src/Eqs/pair_spin_long_range_magforce.jpg | Bin 0 -> 9440 bytes doc/src/Eqs/pair_spin_long_range_magforce.tex | 17 + doc/src/pair_spin_long.txt | 84 ++ src/KSPACE/{pppm_spin.cpp => pppm_dipole.cpp} | 1012 ++++++++--------- src/KSPACE/pppm_dipole.h | 213 ++++ src/KSPACE/pppm_dipole_spin.cpp | 750 ++++++++++++ .../{pppm_spin.h => pppm_dipole_spin.h} | 71 +- src/SPIN/atom_vec_spin.cpp | 14 +- src/SPIN/atom_vec_spin.h | 8 +- src/SPIN/pair_spin_exchange.cpp | 3 - src/SPIN/pair_spin_long.cpp | 370 +++--- src/SPIN/pair_spin_long.h | 5 +- 16 files changed, 1839 insertions(+), 751 deletions(-) create mode 100644 doc/src/Eqs/pair_spin_long_range.jpg create mode 100644 doc/src/Eqs/pair_spin_long_range.tex create mode 100644 doc/src/Eqs/pair_spin_long_range_force.jpg create mode 100644 doc/src/Eqs/pair_spin_long_range_force.tex create mode 100644 doc/src/Eqs/pair_spin_long_range_magforce.jpg create mode 100644 doc/src/Eqs/pair_spin_long_range_magforce.tex create mode 100644 doc/src/pair_spin_long.txt rename src/KSPACE/{pppm_spin.cpp => pppm_dipole.cpp} (67%) create mode 100644 src/KSPACE/pppm_dipole.h create mode 100644 src/KSPACE/pppm_dipole_spin.cpp rename src/KSPACE/{pppm_spin.h => pppm_dipole_spin.h} (66%) diff --git a/doc/src/Eqs/pair_spin_long_range.jpg b/doc/src/Eqs/pair_spin_long_range.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bc133d10cf0a0a2a07db95afaf64961911f94084 GIT binary patch literal 11980 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 literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/pair_spin_long_range_magforce.tex b/doc/src/Eqs/pair_spin_long_range_magforce.tex new file mode 100644 index 0000000000..ad40cf9d8b --- /dev/null +++ b/doc/src/Eqs/pair_spin_long_range_magforce.tex @@ -0,0 +1,17 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath,amssymb,graphics,bm,setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + \bm{\omega}_i = + \frac{\mu_0 (\mu_B)^2}{4\pi\hbar}\sum_{j} + \frac{g_i g_j}{r_{ij}^3} + \, \Big( + 3\,(\bm{e}_{ij}\cdot\bm{s}_{j})\bm{e}_{ij} + -\bm{s}_{j} \Big) \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/pair_spin_long.txt b/doc/src/pair_spin_long.txt new file mode 100644 index 0000000000..c5b4a7b33e --- /dev/null +++ b/doc/src/pair_spin_long.txt @@ -0,0 +1,84 @@ +"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 spin/long command :h3 + +[Syntax:] + +pair_style spin/long cutoff (cutoff) + +cutoff = global cutoff pair (distance in metal units) :ulb,l +:ule + +[Examples:] + +pair_style spin/long 10.0 +pair_coeff * * long 10.0 +pair_coeff 2 3 long 8.0 :pre + +[Description:] + +Style {pair/spin/long} computes interactions between pairs of particles +that each have a magnetic spin. + +:c,image(Eqs/pair_spin_long_range.jpg) + +where si and sj are two magnetic spins of two particles with Lande factors +gi and gj respectively, eij = (ri - rj)/|ri-rj| is the unit vector between +sites i and j, mu0 the vacuum permeability, muB the Bohr magneton (muB = +5.788 eV/T in metal units). + +Style {pair/spin/long} computes magnetic precession vectors: + +:c,image(Eqs/pair_spin_long_range_magforce.jpg) + +with h the Planck constant (in metal units), and a mechanical force: + +:c,image(Eqs/pair_spin_long_range_force.jpg) + + +The following coefficient must be defined for each pair of atoms +types via the "pair_coeff"_pair_coeff.html command as in the examples +above, or in the data file or restart files read by the +"read_data"_read_data.html or "read_restart"_read_restart.html +commands, or by mixing as described below: + +rc (distance units) :ul + +with rc is the radius cutoff of the short-range component of the +long-range interaction (see "(Cerda)"_#Cerda1 for more +explanation). + +:line + +[Restrictions:] + +The {pair/spin/long} style is part of the SPIN package. It is only +enabled if LAMMPS was built with that package. See the +"Making LAMMPS"_Section_start.html#start_3 section for more info. + +The {pair/spin/long} style computes the short-range component of +the dipole-dipole interaction. The functions evaluating the +long-range component are part of the KSPACE package. +They can be enabled only if LAMMPS was built with that package. + +[Related commands:] + +"atom_style spin"_atom_style.html, "pair_coeff"_pair_coeff.html, + +[Default:] none + +:line + +:link(Tranchida6) +[(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, +Journal of Computational Physics, (2018). + +:link(Cerda1) +[(Cerda)] Cerda, Ballenegger, Lenz, and Holm, J Chem Phys, 129(23), +234104 (2008). diff --git a/src/KSPACE/pppm_spin.cpp b/src/KSPACE/pppm_dipole.cpp similarity index 67% rename from src/KSPACE/pppm_spin.cpp rename to src/KSPACE/pppm_dipole.cpp index 9b59f9cd7b..a03f5b9980 100644 --- a/src/KSPACE/pppm_spin.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -21,7 +21,7 @@ #include #include #include -#include "pppm_spin.h" +#include "pppm_dipole.h" #include "atom.h" #include "comm.h" #include "gridcomm.h" @@ -50,8 +50,8 @@ using namespace MathSpecial; #define SMALL 0.00001 #define EPS_HOC 1.0e-7 -enum{REVERSE_SP}; -enum{FORWARD_SP,FORWARD_SP_PERATOM}; +enum{REVERSE_MU}; +enum{FORWARD_MU,FORWARD_MU_PERATOM}; #ifdef FFT_SINGLE #define ZEROF 0.0f @@ -63,34 +63,34 @@ enum{FORWARD_SP,FORWARD_SP_PERATOM}; /* ---------------------------------------------------------------------- */ -PPPMSpin::PPPMSpin(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), - densityx_brick_spin(NULL), densityy_brick_spin(NULL), - densityz_brick_spin(NULL), ux_brick_spin(NULL), - uy_brick_spin(NULL), uz_brick_spin(NULL), vdxx_brick_spin(NULL), - vdxy_brick_spin(NULL), vdyy_brick_spin(NULL), - vdxz_brick_spin(NULL), vdyz_brick_spin(NULL), - vdzz_brick_spin(NULL), v0x_brick_spin(NULL), v1x_brick_spin(NULL), - v2x_brick_spin(NULL), v3x_brick_spin(NULL), v4x_brick_spin(NULL), - v5x_brick_spin(NULL), v0y_brick_spin(NULL), v1y_brick_spin(NULL), - v2y_brick_spin(NULL), v3y_brick_spin(NULL), v4y_brick_spin(NULL), - v5y_brick_spin(NULL), v0z_brick_spin(NULL), v1z_brick_spin(NULL), - v2z_brick_spin(NULL), v3z_brick_spin(NULL), v4z_brick_spin(NULL), - v5z_brick_spin(NULL), work3(NULL), work4(NULL), - densityx_fft_spin(NULL), densityy_fft_spin(NULL), - densityz_fft_spin(NULL) +PPPMDipole::PPPMDipole(LAMMPS *lmp, int narg, char **arg) : PPPM(lmp, narg, arg), + densityx_brick_dipole(NULL), densityy_brick_dipole(NULL), + densityz_brick_dipole(NULL), ux_brick_dipole(NULL), + uy_brick_dipole(NULL), uz_brick_dipole(NULL), vdxx_brick_dipole(NULL), + vdxy_brick_dipole(NULL), vdyy_brick_dipole(NULL), + vdxz_brick_dipole(NULL), vdyz_brick_dipole(NULL), + vdzz_brick_dipole(NULL), v0x_brick_dipole(NULL), v1x_brick_dipole(NULL), + v2x_brick_dipole(NULL), v3x_brick_dipole(NULL), v4x_brick_dipole(NULL), + v5x_brick_dipole(NULL), v0y_brick_dipole(NULL), v1y_brick_dipole(NULL), + v2y_brick_dipole(NULL), v3y_brick_dipole(NULL), v4y_brick_dipole(NULL), + v5y_brick_dipole(NULL), v0z_brick_dipole(NULL), v1z_brick_dipole(NULL), + v2z_brick_dipole(NULL), v3z_brick_dipole(NULL), v4z_brick_dipole(NULL), + v5z_brick_dipole(NULL), work3(NULL), work4(NULL), + densityx_fft_dipole(NULL), densityy_fft_dipole(NULL), + densityz_fft_dipole(NULL) { - spinflag = 1; + dipoleflag = 1; group_group_enable = 0; - cg_spin = NULL; - cg_peratom_spin = NULL; + cg_dipole = NULL; + cg_peratom_dipole = NULL; } /* ---------------------------------------------------------------------- free all memory ------------------------------------------------------------------------- */ -PPPMSpin::~PPPMSpin() +PPPMDipole::~PPPMDipole() { if (copymode) return; @@ -99,23 +99,26 @@ PPPMSpin::~PPPMSpin() fft1 = NULL; fft2 = NULL; remap = NULL; - cg_spin = NULL; + cg_dipole = NULL; } /* ---------------------------------------------------------------------- called once before run ------------------------------------------------------------------------- */ -void PPPMSpin::init() +void PPPMDipole::init() { if (me == 0) { - if (screen) fprintf(screen,"PPPMSpin initialization ...\n"); - if (logfile) fprintf(logfile,"PPPMSpin initialization ...\n"); + if (screen) fprintf(screen,"PPPMDipole initialization ...\n"); + if (logfile) fprintf(logfile,"PPPMDipole initialization ...\n"); } // error check - spinflag = atom->sp?1:0; + dipoleflag = atom->mu?1:0; + qsum_qsq(0); + if (dipoleflag && q2) + error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMDipole"); triclinic_check(); @@ -123,30 +126,30 @@ void PPPMSpin::init() error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); if (domain->dimension == 2) error->all(FLERR, - "Cannot use PPPMSpin with 2d simulation"); + "Cannot use PPPMDipole with 2d simulation"); if (comm->style != 0) - error->universe_all(FLERR,"PPPMSpin can only currently be used with " + error->universe_all(FLERR,"PPPMDipole can only currently be used with " "comm_style brick"); - if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); + if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); - if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" - " ad with spins"); + if (atom->mu && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" + " ad with dipoles"); - if (spinflag && strcmp(update->unit_style,"metal") != 0) - error->all(FLERR,"'metal' units have to be used with spins"); + if (dipoleflag && strcmp(update->unit_style,"electron") == 0) + error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); if (slabflag == 0 && domain->nonperiodic > 0) - error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMSpin"); + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); if (slabflag) { if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) - error->all(FLERR,"Incorrect boundaries with slab PPPMSpin"); + error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); } if (order < 2 || order > MAXORDER) { char str[128]; - sprintf(str,"PPPMSpin order cannot be < 2 or > than %d",MAXORDER); + sprintf(str,"PPPMDipole order cannot be < 2 or > than %d",MAXORDER); error->all(FLERR,str); } @@ -154,7 +157,7 @@ void PPPMSpin::init() triclinic = domain->triclinic; if (triclinic) - error->all(FLERR,"Cannot yet use triclinic cells with PPPMSpin"); + error->all(FLERR,"Cannot yet use triclinic cells with PPPMDipole"); pair_check(); @@ -167,21 +170,17 @@ void PPPMSpin::init() // kspace TIP4P not yet supported if (tip4pflag) - error->all(FLERR,"Cannot yet use TIP4P with PPPMSpin"); + error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); + + // compute qsum & qsqsum and warn if not charge-neutral scale = 1.0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz - spsum_spsq(); + qqrd2e = force->qqrd2e; + musum_musq(); natoms_original = atom->natoms; // set accuracy (force units) from accuracy_relative or accuracy_absolute - // is two_charge_force still relevant for spin systems? - if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; else accuracy = accuracy_relative * two_charge_force; @@ -203,11 +202,11 @@ void PPPMSpin::init() while (order >= minorder) { if (iteration && me == 0) - error->warning(FLERR,"Reducing PPPMSpin order b/c stencil extends " + error->warning(FLERR,"Reducing PPPMDipole order b/c stencil extends " "beyond nearest neighbor processor"); compute_gf_denom(); - set_grid_global(); + set_grid_global(mu2); set_grid_local(); if (overlap_allowed) break; @@ -224,9 +223,9 @@ void PPPMSpin::init() iteration++; } - if (order < minorder) error->all(FLERR,"PPPMSpin order < minimum allowed order"); + if (order < minorder) error->all(FLERR,"PPPMDipole order < minimum allowed order"); if (!overlap_allowed && cgtmp->ghost_overlap()) - error->all(FLERR,"PPPMSpin grid stencil extends " + error->all(FLERR,"PPPMDipole grid stencil extends " "beyond nearest neighbor processor"); if (cgtmp) delete cgtmp; @@ -236,7 +235,7 @@ void PPPMSpin::init() // calculate the final accuracy - double estimated_accuracy = final_accuracy_spin(); + double estimated_accuracy = final_accuracy_dipole(mu2); // print stats @@ -282,10 +281,10 @@ void PPPMSpin::init() // don't invoke allocate peratom(), will be allocated when needed allocate(); - cg_spin->ghost_notify(); - cg_spin->setup(); + cg_dipole->ghost_notify(); + cg_dipole->setup(); - // pre-compute Green's function denominator expansion + // pre-compute Green's function denomiator expansion // pre-compute 1d charge distribution coefficients compute_gf_denom(); @@ -293,27 +292,27 @@ void PPPMSpin::init() } /* ---------------------------------------------------------------------- - adjust PPPMSpin coeffs, called initially and whenever volume has changed + adjust PPPMDipole coeffs, called initially and whenever volume has changed ------------------------------------------------------------------------- */ -void PPPMSpin::setup() +void PPPMDipole::setup() { // perform some checks to avoid illegal boundaries with read_data if (slabflag == 0 && domain->nonperiodic > 0) - error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMSpin"); + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipole"); if (slabflag) { if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) - error->all(FLERR,"Incorrect boundaries with slab PPPMSpin"); + error->all(FLERR,"Incorrect boundaries with slab PPPMDipole"); } int i,j,k,n; double *prd; // volume-dependent factors - // adjust z dimension for 2d slab PPPMSpin - // z dimension for 3d PPPMSpin is zprd since slab_volfactor = 1.0 + // adjust z dimension for 2d slab PPPMDipole + // z dimension for 3d PPPMDipole is zprd since slab_volfactor = 1.0 prd = domain->prd; double xprd = prd[0]; @@ -381,7 +380,7 @@ void PPPMSpin::setup() } } - compute_gf_spin(); + compute_gf_dipole(); } /* ---------------------------------------------------------------------- @@ -389,7 +388,7 @@ void PPPMSpin::setup() called by fix balance b/c it changed sizes of processor sub-domains ------------------------------------------------------------------------- */ -void PPPMSpin::setup_grid() +void PPPMDipole::setup_grid() { // free all arrays previously allocated @@ -406,11 +405,11 @@ void PPPMSpin::setup_grid() allocate(); - cg_spin->ghost_notify(); - if (overlap_allowed == 0 && cg_spin->ghost_overlap()) - error->all(FLERR,"PPPMSpin grid stencil extends " + cg_dipole->ghost_notify(); + if (overlap_allowed == 0 && cg_dipole->ghost_overlap()) + error->all(FLERR,"PPPMDipole grid stencil extends " "beyond nearest neighbor processor"); - cg_spin->setup(); + cg_dipole->setup(); // pre-compute Green's function denomiator expansion // pre-compute 1d charge distribution coefficients @@ -424,10 +423,10 @@ void PPPMSpin::setup_grid() } /* ---------------------------------------------------------------------- - compute the PPPMSpin long-range force, energy, virial + compute the PPPMDipole long-range force, energy, virial ------------------------------------------------------------------------- */ -void PPPMSpin::compute(int eflag, int vflag) +void PPPMDipole::compute(int eflag, int vflag) { int i,j; @@ -440,20 +439,20 @@ void PPPMSpin::compute(int eflag, int vflag) if (evflag_atom && !peratom_allocate_flag) { allocate_peratom(); - cg_peratom_spin->ghost_notify(); - cg_peratom_spin->setup(); + cg_peratom_dipole->ghost_notify(); + cg_peratom_dipole->setup(); } // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - spsum_spsq(); + musum_musq(); natoms_original = atom->natoms; } - // return if there are no spins + // return if there are no dipoles - if (spsqsum == 0.0) return; + if (musqsum == 0.0) return; // convert atoms from box to lamda coords @@ -464,51 +463,51 @@ void PPPMSpin::compute(int eflag, int vflag) if (atom->nmax > nmax) { memory->destroy(part2grid); nmax = atom->nmax; - memory->create(part2grid,nmax,3,"pppm_spin:part2grid"); + memory->create(part2grid,nmax,3,"pppm_dipole:part2grid"); } // find grid points for all my particles - // map my particle charge onto my local 3d on-grid density + // map my particle charge onto my local 3d density grid particle_map(); - make_rho_spin(); + make_rho_dipole(); // all procs communicate density values from their ghost cells // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - cg_spin->reverse_comm(this,REVERSE_SP); - brick2fft_spin(); + cg_dipole->reverse_comm(this,REVERSE_MU); + brick2fft_dipole(); // compute potential gradient on my FFT grid and // portion of e_long on this proc's FFT grid // return gradients (electric fields) in 3d brick decomposition // also performs per-atom calculations via poisson_peratom() - poisson_ik_spin(); + poisson_ik_dipole(); // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - cg_spin->forward_comm(this,FORWARD_SP); + cg_dipole->forward_comm(this,FORWARD_MU); // extra per-atom energy/virial communication if (evflag_atom) { - cg_peratom_spin->forward_comm(this,FORWARD_SP_PERATOM); + cg_peratom_dipole->forward_comm(this,FORWARD_MU_PERATOM); } // calculate the force on my particles - fieldforce_ik_spin(); + fieldforce_ik_dipole(); // extra per-atom energy/virial communication - if (evflag_atom) fieldforce_peratom_spin(); + if (evflag_atom) fieldforce_peratom_dipole(); // sum global energy across procs and add in volume-dependent term - const double spscale = mub2mu0 * scale; + const double qscale = qqrd2e * scale; const double g3 = g_ewald*g_ewald*g_ewald; if (eflag_global) { @@ -517,8 +516,8 @@ void PPPMSpin::compute(int eflag, int vflag) energy = energy_all; energy *= 0.5*volume; - energy -= spsqsum*2.0*g3/3.0/MY_PIS; - energy *= spscale; + energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy *= qscale; } // sum global virial across procs @@ -526,32 +525,29 @@ void PPPMSpin::compute(int eflag, int vflag) if (vflag_global) { double virial_all[6]; MPI_Allreduce(virial,virial_all,6,MPI_DOUBLE,MPI_SUM,world); - for (i = 0; i < 6; i++) virial[i] = 0.5*spscale*volume*virial_all[i]; + for (i = 0; i < 6; i++) virial[i] = 0.5*qscale*volume*virial_all[i]; } // per-atom energy/virial // energy includes self-energy correction if (evflag_atom) { - double **sp = atom->sp; - double spx,spy,spz; + double *q = atom->q; + double **mu = atom->mu; int nlocal = atom->nlocal; int ntotal = nlocal; if (eflag_atom) { for (i = 0; i < nlocal; i++) { - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; eatom[i] *= 0.5; - eatom[i] -= (spx*spx + spy*spy + spz*spz)*2.0*g3/3.0/MY_PIS; - eatom[i] *= spscale; + eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2])*2.0*g3/3.0/MY_PIS; + eatom[i] *= qscale; } } if (vflag_atom) { for (i = 0; i < ntotal; i++) - for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*spscale; + for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*qscale; } } @@ -564,59 +560,59 @@ void PPPMSpin::compute(int eflag, int vflag) allocate memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMSpin::allocate() +void PPPMDipole::allocate() { - memory->create3d_offset(densityx_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:densityx_brick_spin"); - memory->create3d_offset(densityy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:densityy_brick_spin"); - memory->create3d_offset(densityz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:densityz_brick_spin"); + memory->create3d_offset(densityx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityx_brick_dipole"); + memory->create3d_offset(densityy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityy_brick_dipole"); + memory->create3d_offset(densityz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:densityz_brick_dipole"); - memory->create(densityx_fft_spin,nfft_both,"pppm_spin:densityy_fft_spin"); - memory->create(densityy_fft_spin,nfft_both,"pppm_spin:densityy_fft_spin"); - memory->create(densityz_fft_spin,nfft_both,"pppm_spin:densityz_fft_spin"); + memory->create(densityx_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); + memory->create(densityy_fft_dipole,nfft_both,"pppm_dipole:densityy_fft_dipole"); + memory->create(densityz_fft_dipole,nfft_both,"pppm_dipole:densityz_fft_dipole"); - memory->create(greensfn,nfft_both,"pppm_spin:greensfn"); - memory->create(work1,2*nfft_both,"pppm_spin:work1"); - memory->create(work2,2*nfft_both,"pppm_spin:work2"); - memory->create(work3,2*nfft_both,"pppm_spin:work3"); - memory->create(work4,2*nfft_both,"pppm_spin:work4"); - memory->create(vg,nfft_both,6,"pppm_spin:vg"); + memory->create(greensfn,nfft_both,"pppm_dipole:greensfn"); + memory->create(work1,2*nfft_both,"pppm_dipole:work1"); + memory->create(work2,2*nfft_both,"pppm_dipole:work2"); + memory->create(work3,2*nfft_both,"pppm_dipole:work3"); + memory->create(work4,2*nfft_both,"pppm_dipole:work4"); + memory->create(vg,nfft_both,6,"pppm_dipole:vg"); - memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_spin:fkx"); - memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_spin:fky"); - memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_spin:fkz"); + memory->create1d_offset(fkx,nxlo_fft,nxhi_fft,"pppm_dipole:fkx"); + memory->create1d_offset(fky,nylo_fft,nyhi_fft,"pppm_dipole:fky"); + memory->create1d_offset(fkz,nzlo_fft,nzhi_fft,"pppm_dipole:fkz"); - memory->create3d_offset(ux_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:ux_brick_spin"); - memory->create3d_offset(uy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:uy_brick_spin"); - memory->create3d_offset(uz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:uz_brick_spin"); + memory->create3d_offset(ux_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:ux_brick_dipole"); + memory->create3d_offset(uy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:uy_brick_dipole"); + memory->create3d_offset(uz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:uz_brick_dipole"); - memory->create3d_offset(vdxx_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdxx_brick_spin"); - memory->create3d_offset(vdxy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdxy_brick_spin"); - memory->create3d_offset(vdyy_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdyy_brick_spin"); - memory->create3d_offset(vdxz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdxz_brick_spin"); - memory->create3d_offset(vdyz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdyz_brick_spin"); - memory->create3d_offset(vdzz_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:vdzz_brick_spin"); + memory->create3d_offset(vdxx_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxx_brick_dipole"); + memory->create3d_offset(vdxy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxy_brick_dipole"); + memory->create3d_offset(vdyy_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdyy_brick_dipole"); + memory->create3d_offset(vdxz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdxz_brick_dipole"); + memory->create3d_offset(vdyz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdyz_brick_dipole"); + memory->create3d_offset(vdzz_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:vdzz_brick_dipole"); // summation coeffs order_allocated = order; - memory->create(gf_b,order,"pppm_spin:gf_b"); - memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_spin:rho1d"); - memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_spin:drho1d"); - memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_spin:rho_coeff"); + memory->create(gf_b,order,"pppm_dipole:gf_b"); + memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_dipole:rho1d"); + memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_dipole:drho1d"); + memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_dipole:rho_coeff"); memory->create2d_offset(drho_coeff,order,(1-order)/2,order/2, - "pppm_spin:drho_coeff"); + "pppm_dipole:drho_coeff"); // create 2 FFTs and a Remap // 1st FFT keeps data in FFT decompostion @@ -644,7 +640,7 @@ void PPPMSpin::allocate() int (*procneigh)[2] = comm->procneigh; - cg_spin = new GridComm(lmp,world,9,3, + cg_dipole = new GridComm(lmp,world,9,3, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, procneigh[0][0],procneigh[0][1],procneigh[1][0], @@ -655,26 +651,26 @@ void PPPMSpin::allocate() deallocate memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMSpin::deallocate() +void PPPMDipole::deallocate() { - memory->destroy3d_offset(densityx_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(densityy_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(densityz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityx_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(densityz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(ux_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(uy_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(uz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(ux_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(uz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxx_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxy_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdyy_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdxz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdyz_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(vdzz_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxx_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyy_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdxz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdyz_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(vdzz_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy(densityx_fft_spin); - memory->destroy(densityy_fft_spin); - memory->destroy(densityz_fft_spin); + memory->destroy(densityx_fft_dipole); + memory->destroy(densityy_fft_dipole); + memory->destroy(densityz_fft_dipole); memory->destroy(greensfn); memory->destroy(work1); @@ -696,61 +692,61 @@ void PPPMSpin::deallocate() delete fft1; delete fft2; delete remap; - delete cg_spin; + delete cg_dipole; } /* ---------------------------------------------------------------------- allocate per-atom memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMSpin::allocate_peratom() +void PPPMDipole::allocate_peratom() { peratom_allocate_flag = 1; - memory->create3d_offset(v0x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v0x_brick_spin"); - memory->create3d_offset(v1x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v1x_brick_spin"); - memory->create3d_offset(v2x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v2x_brick_spin"); - memory->create3d_offset(v3x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v3x_brick_spin"); - memory->create3d_offset(v4x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v4x_brick_spin"); - memory->create3d_offset(v5x_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v5x_brick_spin"); + memory->create3d_offset(v0x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0x_brick_dipole"); + memory->create3d_offset(v1x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1x_brick_dipole"); + memory->create3d_offset(v2x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2x_brick_dipole"); + memory->create3d_offset(v3x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3x_brick_dipole"); + memory->create3d_offset(v4x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4x_brick_dipole"); + memory->create3d_offset(v5x_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5x_brick_dipole"); - memory->create3d_offset(v0y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v0y_brick_spin"); - memory->create3d_offset(v1y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v1y_brick_spin"); - memory->create3d_offset(v2y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v2y_brick_spin"); - memory->create3d_offset(v3y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v3y_brick_spin"); - memory->create3d_offset(v4y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v4y_brick_spin"); - memory->create3d_offset(v5y_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v5y_brick_spin"); + memory->create3d_offset(v0y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0y_brick_dipole"); + memory->create3d_offset(v1y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1y_brick_dipole"); + memory->create3d_offset(v2y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2y_brick_dipole"); + memory->create3d_offset(v3y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3y_brick_dipole"); + memory->create3d_offset(v4y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4y_brick_dipole"); + memory->create3d_offset(v5y_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5y_brick_dipole"); - memory->create3d_offset(v0z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v0z_brick_spin"); - memory->create3d_offset(v1z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v1z_brick_spin"); - memory->create3d_offset(v2z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v2z_brick_spin"); - memory->create3d_offset(v3z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v3z_brick_spin"); - memory->create3d_offset(v4z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v4z_brick_spin"); - memory->create3d_offset(v5z_brick_spin,nzlo_out,nzhi_out,nylo_out,nyhi_out, - nxlo_out,nxhi_out,"pppm_spin:v5z_brick_spin"); + memory->create3d_offset(v0z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v0z_brick_dipole"); + memory->create3d_offset(v1z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v1z_brick_dipole"); + memory->create3d_offset(v2z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v2z_brick_dipole"); + memory->create3d_offset(v3z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v3z_brick_dipole"); + memory->create3d_offset(v4z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v4z_brick_dipole"); + memory->create3d_offset(v5z_brick_dipole,nzlo_out,nzhi_out,nylo_out,nyhi_out, + nxlo_out,nxhi_out,"pppm_dipole:v5z_brick_dipole"); // create ghost grid object for rho and electric field communication int (*procneigh)[2] = comm->procneigh; - cg_peratom_spin = + cg_peratom_dipole = new GridComm(lmp,world,18,1, nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, @@ -762,44 +758,44 @@ void PPPMSpin::allocate_peratom() deallocate per-atom memory that depends on # of K-vectors and order ------------------------------------------------------------------------- */ -void PPPMSpin::deallocate_peratom() +void PPPMDipole::deallocate_peratom() { peratom_allocate_flag = 0; - memory->destroy3d_offset(v0x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4x_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5x_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4x_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5x_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v0y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4y_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5y_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4y_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5y_brick_dipole,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v0z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v1z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v2z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v3z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v4z_brick_spin,nzlo_out,nylo_out,nxlo_out); - memory->destroy3d_offset(v5z_brick_spin,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v0z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v1z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v2z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v3z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v4z_brick_dipole,nzlo_out,nylo_out,nxlo_out); + memory->destroy3d_offset(v5z_brick_dipole,nzlo_out,nylo_out,nxlo_out); - delete cg_peratom_spin; + delete cg_peratom_dipole; } /* ---------------------------------------------------------------------- - set global size of PPPMSpin grid = nx,ny,nz_pppm + set global size of PPPMDipole grid = nx,ny,nz_pppm used for charge accumulation, FFTs, and electric field interpolation ------------------------------------------------------------------------- */ -void PPPMSpin::set_grid_global() +void PPPMDipole::set_grid_global(double dipole2) { // use xprd,yprd,zprd - // adjust z dimension for 2d slab PPPMSpin - // 3d PPPMSpin just uses zprd since slab_volfactor = 1.0 + // adjust z dimension for 2d slab PPPMDipole + // 3d PPPMDipole just uses zprd since slab_volfactor = 1.0 double xprd = domain->xprd; double yprd = domain->yprd; @@ -817,14 +813,16 @@ void PPPMSpin::set_grid_global() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); - if (sp2 == 0.0) - error->all(FLERR,"Must use kspace_modify gewald for systems with no spins"); + //if (mu2 == 0.0) + if (dipole2 == 0.0) + error->all(FLERR,"Must use kspace_modify gewald for systems with no dipoles"); g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; //Try Newton Solver double g_ewald_new = - find_gewald_spin(g_ewald,cutoff,natoms,xprd*yprd*zprd,sp2); + find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,dipole2); + //find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; - else error->warning(FLERR,"PPPMSpin spin Newton solver failed, " + else error->warning(FLERR,"PPPMDipole dipole Newton solver failed, " "using old method to estimate g_ewald"); } @@ -864,7 +862,7 @@ void PPPMSpin::set_grid_global() nzlo_fft = me_z*nz_pppm/npez_fft; nzhi_fft = (me_z+1)*nz_pppm/npez_fft - 1; - double df_kspace = compute_df_kspace_spin(); + double df_kspace = compute_df_kspace_dipole(dipole2); count++; @@ -889,31 +887,32 @@ void PPPMSpin::set_grid_global() h_z = zprd_slab/nz_pppm; if (nx_pppm >= OFFSET || ny_pppm >= OFFSET || nz_pppm >= OFFSET) - error->all(FLERR,"PPPMSpin grid is too large"); + error->all(FLERR,"PPPMDipole grid is too large"); } /* ---------------------------------------------------------------------- - compute estimated kspace force error for spins + compute estimated kspace force error for dipoles ------------------------------------------------------------------------- */ -double PPPMSpin::compute_df_kspace_spin() +double PPPMDipole::compute_df_kspace_dipole(double dipole2) { double xprd = domain->xprd; double yprd = domain->yprd; double zprd = domain->zprd; double zprd_slab = zprd*slab_volfactor; bigint natoms = atom->natoms; - double qopt = compute_qopt_spin(); - double df_kspace = sqrt(qopt/natoms)*sp2/(3.0*xprd*yprd*zprd_slab); + double qopt = compute_qopt_dipole(); + //double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); + double df_kspace = sqrt(qopt/natoms)*dipole2/(3.0*xprd*yprd*zprd_slab); return df_kspace; } /* ---------------------------------------------------------------------- - compute qopt for spins with ik differentiation + compute qopt for dipoles with ik differentiation ------------------------------------------------------------------------- */ -double PPPMSpin::compute_qopt_spin() +double PPPMDipole::compute_qopt_dipole() { double qopt = 0.0; const double * const prd = domain->prd; @@ -984,7 +983,7 @@ double PPPMSpin::compute_qopt_spin() dot1 = unitkx*kper*qx + unitky*lper*qy + unitkz*mper*qz; dot2 = qx*qx + qy*qy + qz*qz; - //dot1 = dot1*dot1*dot1; // power of 3 for spin forces + //dot1 = dot1*dot1*dot1; // power of 3 for dipole forces //dot2 = dot2*dot2*dot2; u1 = sx*sy*sz; const double w2 = wx*wy*wz; @@ -1009,7 +1008,7 @@ double PPPMSpin::compute_qopt_spin() pre-compute modified (Hockney-Eastwood) Coulomb Green's function ------------------------------------------------------------------------- */ -void PPPMSpin::compute_gf_spin() +void PPPMDipole::compute_gf_dipole() { const double * const prd = domain->prd; @@ -1102,34 +1101,34 @@ void PPPMSpin::compute_gf_spin() calculate f(x) for use in Newton-Raphson solver ------------------------------------------------------------------------- */ -double PPPMSpin::newton_raphson_f() -{ - double xprd = domain->xprd; - double yprd = domain->yprd; - double zprd = domain->zprd; - bigint natoms = atom->natoms; - - double df_rspace,df_kspace; - double vol = xprd*yprd*zprd; - double a = cutoff*g_ewald; - double rg2 = a*a; - double rg4 = rg2*rg2; - double rg6 = rg4*rg2; - double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; - double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * - sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); - df_kspace = compute_df_kspace_spin(); - - return df_rspace - df_kspace; -} +//double PPPMDipole::newton_raphson_f() +//{ +// double xprd = domain->xprd; +// double yprd = domain->yprd; +// double zprd = domain->zprd; +// bigint natoms = atom->natoms; +// +// double df_rspace,df_kspace; +// double vol = xprd*yprd*zprd; +// double a = cutoff*g_ewald; +// double rg2 = a*a; +// double rg4 = rg2*rg2; +// double rg6 = rg4*rg2; +// double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; +// double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; +// df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * +// sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); +// df_kspace = compute_df_kspace_dipole(); +// +// return df_rspace - df_kspace; +//} /* ---------------------------------------------------------------------- - find g_ewald parameter for spins based on desired accuracy + find g_ewald parameter for dipoles based on desired accuracy using a Newton-Raphson solver ------------------------------------------------------------------------- */ -double PPPMSpin::find_gewald_spin(double x, double Rc, +double PPPMDipole::find_gewald_dipole(double x, double Rc, bigint natoms, double vol, double b2) { double dx,tol; @@ -1141,7 +1140,7 @@ double PPPMSpin::find_gewald_spin(double x, double Rc, //Begin algorithm for (int i = 0; i < maxit; i++) { - dx = newton_raphson_f_spin(x,Rc,natoms,vol,b2) / derivf_spin(x,Rc,natoms,vol,b2); + dx = newton_raphson_f_dipole(x,Rc,natoms,vol,b2) / derivf_dipole(x,Rc,natoms,vol,b2); x = x - dx; //Update x if (fabs(dx) < tol) return x; if (x < 0 || x != x) // solver failed @@ -1151,10 +1150,10 @@ double PPPMSpin::find_gewald_spin(double x, double Rc, } /* ---------------------------------------------------------------------- - calculate f(x) objective function for spins + calculate f(x) objective function for dipoles ------------------------------------------------------------------------- */ -double PPPMSpin::newton_raphson_f_spin(double x, double Rc, bigint +double PPPMDipole::newton_raphson_f_dipole(double x, double Rc, bigint natoms, double vol, double b2) { double a = Rc*x; @@ -1171,21 +1170,21 @@ natoms, double vol, double b2) } /* ---------------------------------------------------------------------- - calculate numerical derivative f'(x) of objective function for spins + calculate numerical derivative f'(x) of objective function for dipoles ------------------------------------------------------------------------- */ -double PPPMSpin::derivf_spin(double x, double Rc, +double PPPMDipole::derivf_dipole(double x, double Rc, bigint natoms, double vol, double b2) { double h = 0.000001; //Derivative step-size - return (newton_raphson_f_spin(x + h,Rc,natoms,vol,b2) - newton_raphson_f_spin(x,Rc,natoms,vol,b2)) / h; + return (newton_raphson_f_dipole(x + h,Rc,natoms,vol,b2) - newton_raphson_f_dipole(x,Rc,natoms,vol,b2)) / h; } /* ---------------------------------------------------------------------- calculate the final estimate of the accuracy ------------------------------------------------------------------------- */ -double PPPMSpin::final_accuracy_spin() +double PPPMDipole::final_accuracy_dipole(double dipole2) { double xprd = domain->xprd; double yprd = domain->yprd; @@ -1194,7 +1193,7 @@ double PPPMSpin::final_accuracy_spin() bigint natoms = atom->natoms; if (natoms == 0) natoms = 1; // avoid division by zero - double df_kspace = compute_df_kspace_spin(); + double df_kspace = compute_df_kspace_dipole(mu2); double a = cutoff*g_ewald; double rg2 = a*a; @@ -1202,7 +1201,10 @@ double PPPMSpin::final_accuracy_spin() double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - double df_rspace = (sp2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + //double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + // exp(-rg2)); + double df_rspace = (dipole2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); @@ -1215,10 +1217,10 @@ double PPPMSpin::final_accuracy_spin() pre-compute Green's function denominator expansion coeffs, Gamma(2n) ------------------------------------------------------------------------- */ -void PPPMSpin::compute_gf_denom() +void PPPMDipole::compute_gf_denom() { if (gf_b) memory->destroy(gf_b); - memory->create(gf_b,order,"pppm_spin:gf_b"); + memory->create(gf_b,order,"pppm_dipole:gf_b"); int k,l,m; @@ -1244,7 +1246,7 @@ void PPPMSpin::compute_gf_denom() in global grid ------------------------------------------------------------------------- */ -void PPPMSpin::make_rho_spin() +void PPPMDipole::make_rho_dipole() { int l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; @@ -1254,11 +1256,11 @@ void PPPMSpin::make_rho_spin() // clear 3d density array - memset(&(densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); - memset(&(densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); - memset(&(densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]),0, + memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, ngrid*sizeof(FFT_SCALAR)); // loop over my charges, add their contribution to nearby grid points @@ -1266,8 +1268,7 @@ void PPPMSpin::make_rho_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **sp = atom->sp; - double spx,spy,spz; + double **mu = atom->mu; double **x = atom->x; int nlocal = atom->nlocal; @@ -1282,12 +1283,9 @@ void PPPMSpin::make_rho_spin() compute_rho1d(dx,dy,dz); - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - z0 = delvolinv * spx; - z1 = delvolinv * spy; - z2 = delvolinv * spz; + z0 = delvolinv * mu[i][0]; + z1 = delvolinv * mu[i][1]; + z2 = delvolinv * mu[i][2]; for (n = nlower; n <= nupper; n++) { mz = n+nz; y0 = z0*rho1d[2][n]; @@ -1300,9 +1298,9 @@ void PPPMSpin::make_rho_spin() x2 = y2*rho1d[1][m]; for (l = nlower; l <= nupper; l++) { mx = l+nx; - densityx_brick_spin[mz][my][mx] += x0*rho1d[0][l]; - densityy_brick_spin[mz][my][mx] += x1*rho1d[0][l]; - densityz_brick_spin[mz][my][mx] += x2*rho1d[0][l]; + densityx_brick_dipole[mz][my][mx] += x0*rho1d[0][l]; + densityy_brick_dipole[mz][my][mx] += x1*rho1d[0][l]; + densityz_brick_dipole[mz][my][mx] += x2*rho1d[0][l]; } } } @@ -1313,7 +1311,7 @@ void PPPMSpin::make_rho_spin() remap density from 3d brick decomposition to FFT decomposition ------------------------------------------------------------------------- */ -void PPPMSpin::brick2fft_spin() +void PPPMDipole::brick2fft_dipole() { int n,ix,iy,iz; @@ -1325,36 +1323,36 @@ void PPPMSpin::brick2fft_spin() for (iz = nzlo_in; iz <= nzhi_in; iz++) for (iy = nylo_in; iy <= nyhi_in; iy++) for (ix = nxlo_in; ix <= nxhi_in; ix++) { - densityx_fft_spin[n] = densityx_brick_spin[iz][iy][ix]; - densityy_fft_spin[n] = densityy_brick_spin[iz][iy][ix]; - densityz_fft_spin[n] = densityz_brick_spin[iz][iy][ix]; + densityx_fft_dipole[n] = densityx_brick_dipole[iz][iy][ix]; + densityy_fft_dipole[n] = densityy_brick_dipole[iz][iy][ix]; + densityz_fft_dipole[n] = densityz_brick_dipole[iz][iy][ix]; n++; } - remap->perform(densityx_fft_spin,densityx_fft_spin,work1); - remap->perform(densityy_fft_spin,densityy_fft_spin,work1); - remap->perform(densityz_fft_spin,densityz_fft_spin,work1); + remap->perform(densityx_fft_dipole,densityx_fft_dipole,work1); + remap->perform(densityy_fft_dipole,densityy_fft_dipole,work1); + remap->perform(densityz_fft_dipole,densityz_fft_dipole,work1); } /* ---------------------------------------------------------------------- FFT-based Poisson solver for ik ------------------------------------------------------------------------- */ -void PPPMSpin::poisson_ik_spin() +void PPPMDipole::poisson_ik_dipole() { int i,j,k,n,ii; double eng; double wreal,wimg; - // transform spin density (r -> k) + // transform dipole density (r -> k) n = 0; for (i = 0; i < nfft; i++) { - work1[n] = densityx_fft_spin[i]; + work1[n] = densityx_fft_dipole[i]; work1[n+1] = ZEROF; - work2[n] = densityy_fft_spin[i]; + work2[n] = densityy_fft_dipole[i]; work2[n+1] = ZEROF; - work3[n] = densityz_fft_spin[i]; + work3[n] = densityz_fft_dipole[i]; work3[n+1] = ZEROF; n += 2; } @@ -1421,7 +1419,7 @@ void PPPMSpin::poisson_ik_spin() // extra FFTs for per-atom energy/virial - if (vflag_atom) poisson_peratom_spin(); + if (vflag_atom) poisson_peratom_dipole(); // compute electric potential // FFT leaves data in 3d brick decomposition @@ -1443,7 +1441,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - ux_brick_spin[k][j][i] = work4[n]; + ux_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1464,7 +1462,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - uy_brick_spin[k][j][i] = work4[n]; + uy_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1485,7 +1483,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - uz_brick_spin[k][j][i] = work4[n]; + uz_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1506,7 +1504,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxx_brick_spin[k][j][i] = work4[n]; + vdxx_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1527,7 +1525,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdyy_brick_spin[k][j][i] = work4[n]; + vdyy_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1548,7 +1546,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdzz_brick_spin[k][j][i] = work4[n]; + vdzz_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1569,7 +1567,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxy_brick_spin[k][j][i] = work4[n]; + vdxy_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1590,7 +1588,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdxz_brick_spin[k][j][i] = work4[n]; + vdxz_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1611,7 +1609,7 @@ void PPPMSpin::poisson_ik_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - vdyz_brick_spin[k][j][i] = work4[n]; + vdyz_brick_dipole[k][j][i] = work4[n]; n += 2; } } @@ -1620,7 +1618,7 @@ void PPPMSpin::poisson_ik_spin() FFT-based Poisson solver for per-atom energy/virial ------------------------------------------------------------------------- */ -void PPPMSpin::poisson_peratom_spin() +void PPPMDipole::poisson_peratom_dipole() { int i,ii,j,k,n; @@ -1647,7 +1645,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0x_brick_spin[k][j][i] = work4[n]; + v0x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1670,7 +1668,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0y_brick_spin[k][j][i] = work4[n]; + v0y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1693,7 +1691,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v0z_brick_spin[k][j][i] = work4[n]; + v0z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1716,7 +1714,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1x_brick_spin[k][j][i] = work4[n]; + v1x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1739,7 +1737,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1y_brick_spin[k][j][i] = work4[n]; + v1y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1762,7 +1760,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v1z_brick_spin[k][j][i] = work4[n]; + v1z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1785,7 +1783,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2x_brick_spin[k][j][i] = work4[n]; + v2x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1808,7 +1806,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2y_brick_spin[k][j][i] = work4[n]; + v2y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1831,7 +1829,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v2z_brick_spin[k][j][i] = work4[n]; + v2z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1854,7 +1852,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3x_brick_spin[k][j][i] = work4[n]; + v3x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1877,7 +1875,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3y_brick_spin[k][j][i] = work4[n]; + v3y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1900,7 +1898,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v3z_brick_spin[k][j][i] = work4[n]; + v3z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1923,7 +1921,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4x_brick_spin[k][j][i] = work4[n]; + v4x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1946,7 +1944,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4y_brick_spin[k][j][i] = work4[n]; + v4y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1969,7 +1967,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v4z_brick_spin[k][j][i] = work4[n]; + v4z_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -1992,7 +1990,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5x_brick_spin[k][j][i] = work4[n]; + v5x_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -2015,7 +2013,7 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5y_brick_spin[k][j][i] = work4[n]; + v5y_brick_dipole[k][j][i] = work4[n]; n += 2; } @@ -2038,16 +2036,16 @@ void PPPMSpin::poisson_peratom_spin() for (k = nzlo_in; k <= nzhi_in; k++) for (j = nylo_in; j <= nyhi_in; j++) for (i = nxlo_in; i <= nxhi_in; i++) { - v5z_brick_spin[k][j][i] = work4[n]; + v5z_brick_dipole[k][j][i] = work4[n]; n += 2; } } /* ---------------------------------------------------------------------- - interpolate from grid to get magnetic field & force on my particles for ik + interpolate from grid to get electric field & force on my particles for ik ------------------------------------------------------------------------- */ -void PPPMSpin::fieldforce_ik_spin() +void PPPMDipole::fieldforce_ik_dipole() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz; @@ -2060,11 +2058,11 @@ void PPPMSpin::fieldforce_ik_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **sp = atom->sp; - double spx,spy,spz; + + double **mu = atom->mu; double **x = atom->x; double **f = atom->f; - double **fm = atom->fm; + double **t = atom->torque; int nlocal = atom->nlocal; @@ -2089,36 +2087,29 @@ void PPPMSpin::fieldforce_ik_spin() for (l = nlower; l <= nupper; l++) { mx = l+nx; x0 = y0*rho1d[0][l]; - ex -= x0*ux_brick_spin[mz][my][mx]; - ey -= x0*uy_brick_spin[mz][my][mx]; - ez -= x0*uz_brick_spin[mz][my][mx]; - vxx -= x0*vdxx_brick_spin[mz][my][mx]; - vyy -= x0*vdyy_brick_spin[mz][my][mx]; - vzz -= x0*vdzz_brick_spin[mz][my][mx]; - vxy -= x0*vdxy_brick_spin[mz][my][mx]; - vxz -= x0*vdxz_brick_spin[mz][my][mx]; - vyz -= x0*vdyz_brick_spin[mz][my][mx]; + ex -= x0*ux_brick_dipole[mz][my][mx]; + ey -= x0*uy_brick_dipole[mz][my][mx]; + ez -= x0*uz_brick_dipole[mz][my][mx]; + vxx -= x0*vdxx_brick_dipole[mz][my][mx]; + vyy -= x0*vdyy_brick_dipole[mz][my][mx]; + vzz -= x0*vdzz_brick_dipole[mz][my][mx]; + vxy -= x0*vdxy_brick_dipole[mz][my][mx]; + vxz -= x0*vdxz_brick_dipole[mz][my][mx]; + vyz -= x0*vdyz_brick_dipole[mz][my][mx]; } } } - // convert M-field to mech. and mag. forces + // convert E-field to torque - const double spfactor = mub2mu0 * scale; - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - f[i][0] += spfactor*(vxx*spx + vxy*spy + vxz*spz); - f[i][1] += spfactor*(vxy*spx + vyy*spy + vyz*spz); - f[i][2] += spfactor*(vxz*spx + vyz*spy + vzz*spz); - - const double spfactorh = mub2mu0hbinv * scale; - fm[i][0] += spfactorh*ex; - fm[i][1] += spfactorh*ey; - fm[i][2] += spfactorh*ez; - - // create a new vector (in atom_spin style ?) to store long-range fm tables + const double mufactor = qqrd2e * scale; + f[i][0] += mufactor*(vxx*mu[i][0] + vxy*mu[i][1] + vxz*mu[i][2]); + f[i][1] += mufactor*(vxy*mu[i][0] + vyy*mu[i][1] + vyz*mu[i][2]); + f[i][2] += mufactor*(vxz*mu[i][0] + vyz*mu[i][1] + vzz*mu[i][2]); + t[i][0] += mufactor*(mu[i][1]*ez - mu[i][2]*ey); + t[i][1] += mufactor*(mu[i][2]*ex - mu[i][0]*ez); + t[i][2] += mufactor*(mu[i][0]*ey - mu[i][1]*ex); } } @@ -2126,7 +2117,7 @@ void PPPMSpin::fieldforce_ik_spin() interpolate from grid to get per-atom energy/virial ------------------------------------------------------------------------- */ -void PPPMSpin::fieldforce_peratom_spin() +void PPPMDipole::fieldforce_peratom_dipole() { int i,l,m,n,nx,ny,nz,mx,my,mz; FFT_SCALAR dx,dy,dz,x0,y0,z0; @@ -2140,8 +2131,7 @@ void PPPMSpin::fieldforce_peratom_spin() // (dx,dy,dz) = distance to "lower left" grid pt // (mx,my,mz) = global coords of moving stencil pt - double **sp = atom->sp; - double spx,spy,spz; + double **mu = atom->mu; double **x = atom->x; int nlocal = atom->nlocal; @@ -2170,45 +2160,42 @@ void PPPMSpin::fieldforce_peratom_spin() mx = l+nx; x0 = y0*rho1d[0][l]; if (eflag_atom) { - ux += x0*ux_brick_spin[mz][my][mx]; - uy += x0*uy_brick_spin[mz][my][mx]; - uz += x0*uz_brick_spin[mz][my][mx]; + ux += x0*ux_brick_dipole[mz][my][mx]; + uy += x0*uy_brick_dipole[mz][my][mx]; + uz += x0*uz_brick_dipole[mz][my][mx]; } if (vflag_atom) { - v0x += x0*v0x_brick_spin[mz][my][mx]; - v1x += x0*v1x_brick_spin[mz][my][mx]; - v2x += x0*v2x_brick_spin[mz][my][mx]; - v3x += x0*v3x_brick_spin[mz][my][mx]; - v4x += x0*v4x_brick_spin[mz][my][mx]; - v5x += x0*v5x_brick_spin[mz][my][mx]; - v0y += x0*v0y_brick_spin[mz][my][mx]; - v1y += x0*v1y_brick_spin[mz][my][mx]; - v2y += x0*v2y_brick_spin[mz][my][mx]; - v3y += x0*v3y_brick_spin[mz][my][mx]; - v4y += x0*v4y_brick_spin[mz][my][mx]; - v5y += x0*v5y_brick_spin[mz][my][mx]; - v0z += x0*v0z_brick_spin[mz][my][mx]; - v1z += x0*v1z_brick_spin[mz][my][mx]; - v2z += x0*v2z_brick_spin[mz][my][mx]; - v3z += x0*v3z_brick_spin[mz][my][mx]; - v4z += x0*v4z_brick_spin[mz][my][mx]; - v5z += x0*v5z_brick_spin[mz][my][mx]; + v0x += x0*v0x_brick_dipole[mz][my][mx]; + v1x += x0*v1x_brick_dipole[mz][my][mx]; + v2x += x0*v2x_brick_dipole[mz][my][mx]; + v3x += x0*v3x_brick_dipole[mz][my][mx]; + v4x += x0*v4x_brick_dipole[mz][my][mx]; + v5x += x0*v5x_brick_dipole[mz][my][mx]; + v0y += x0*v0y_brick_dipole[mz][my][mx]; + v1y += x0*v1y_brick_dipole[mz][my][mx]; + v2y += x0*v2y_brick_dipole[mz][my][mx]; + v3y += x0*v3y_brick_dipole[mz][my][mx]; + v4y += x0*v4y_brick_dipole[mz][my][mx]; + v5y += x0*v5y_brick_dipole[mz][my][mx]; + v0z += x0*v0z_brick_dipole[mz][my][mx]; + v1z += x0*v1z_brick_dipole[mz][my][mx]; + v2z += x0*v2z_brick_dipole[mz][my][mx]; + v3z += x0*v3z_brick_dipole[mz][my][mx]; + v4z += x0*v4z_brick_dipole[mz][my][mx]; + v5z += x0*v5z_brick_dipole[mz][my][mx]; } } } } - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - if (eflag_atom) eatom[i] += spx*ux + spy*uy + spz*uz; + if (eflag_atom) eatom[i] += mu[i][0]*ux + mu[i][1]*uy + mu[i][2]*uz; if (vflag_atom) { - vatom[i][0] += spx*v0x + spy*v0y + spz*v0z; - vatom[i][1] += spx*v1x + spy*v1y + spz*v1z; - vatom[i][2] += spx*v2x + spy*v2y + spz*v2z; - vatom[i][3] += spx*v3x + spy*v3y + spz*v3z; - vatom[i][4] += spx*v4x + spy*v4y + spz*v4z; - vatom[i][5] += spx*v5x + spy*v5y + spz*v5z; + vatom[i][0] += mu[i][0]*v0x + mu[i][1]*v0y + mu[i][2]*v0z; + vatom[i][1] += mu[i][0]*v1x + mu[i][1]*v1y + mu[i][2]*v1z; + vatom[i][2] += mu[i][0]*v2x + mu[i][1]*v2y + mu[i][2]*v2z; + vatom[i][3] += mu[i][0]*v3x + mu[i][1]*v3y + mu[i][2]*v3z; + vatom[i][4] += mu[i][0]*v4x + mu[i][1]*v4y + mu[i][2]*v4z; + vatom[i][5] += mu[i][0]*v5x + mu[i][1]*v5y + mu[i][2]*v5z; } } } @@ -2217,20 +2204,20 @@ void PPPMSpin::fieldforce_peratom_spin() pack own values to buf to send to another proc ------------------------------------------------------------------------- */ -void PPPMSpin::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMDipole::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == FORWARD_SP) { - FFT_SCALAR *src_ux = &ux_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_uy = &uy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_uz = &uz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxx = &vdxx_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vyy = &vdyy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vzz = &vdzz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxy = &vdxy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vxz = &vdxz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_vyz = &vdyz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + if (flag == FORWARD_MU) { + FFT_SCALAR *src_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { buf[n++] = src_ux[list[i]]; buf[n++] = src_uy[list[i]]; @@ -2242,25 +2229,25 @@ void PPPMSpin::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) buf[n++] = src_vxz[list[i]]; buf[n++] = src_vyz[list[i]]; } - } else if (flag == FORWARD_SP_PERATOM) { - FFT_SCALAR *v0xsrc = &v0x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1xsrc = &v1x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2xsrc = &v2x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3xsrc = &v3x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4xsrc = &v4x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5xsrc = &v5x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0ysrc = &v0y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1ysrc = &v1y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2ysrc = &v2y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3ysrc = &v3y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4ysrc = &v4y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5ysrc = &v5y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0zsrc = &v0z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1zsrc = &v1z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2zsrc = &v2z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3zsrc = &v3z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4zsrc = &v4z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5zsrc = &v5z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + } else if (flag == FORWARD_MU_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { buf[n++] = v0xsrc[list[i]]; buf[n++] = v1xsrc[list[i]]; @@ -2288,20 +2275,20 @@ void PPPMSpin::pack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) unpack another proc's own values from buf and set own ghost values ------------------------------------------------------------------------- */ -void PPPMSpin::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMDipole::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == FORWARD_SP) { - FFT_SCALAR *dest_ux = &ux_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_uy = &uy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_uz = &uz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxx = &vdxx_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vyy = &vdyy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vzz = &vdzz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxy = &vdxy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vxz = &vdxz_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_vyz = &vdyz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + if (flag == FORWARD_MU) { + FFT_SCALAR *dest_ux = &ux_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uy = &uy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_uz = &uz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxx = &vdxx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyy = &vdyy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vzz = &vdzz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxy = &vdxy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vxz = &vdxz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_vyz = &vdyz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { dest_ux[list[i]] = buf[n++]; dest_uy[list[i]] = buf[n++]; @@ -2313,25 +2300,25 @@ void PPPMSpin::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) dest_vxz[list[i]] = buf[n++]; dest_vyz[list[i]] = buf[n++]; } - } else if (flag == FORWARD_SP_PERATOM) { - FFT_SCALAR *v0xsrc = &v0x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1xsrc = &v1x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2xsrc = &v2x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3xsrc = &v3x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4xsrc = &v4x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5xsrc = &v5x_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0ysrc = &v0y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1ysrc = &v1y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2ysrc = &v2y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3ysrc = &v3y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4ysrc = &v4y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5ysrc = &v5y_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v0zsrc = &v0z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v1zsrc = &v1z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v2zsrc = &v2z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v3zsrc = &v3z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v4zsrc = &v4z_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *v5zsrc = &v5z_brick_spin[nzlo_out][nylo_out][nxlo_out]; + } else if (flag == FORWARD_MU_PERATOM) { + FFT_SCALAR *v0xsrc = &v0x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1xsrc = &v1x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2xsrc = &v2x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3xsrc = &v3x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4xsrc = &v4x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5xsrc = &v5x_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0ysrc = &v0y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1ysrc = &v1y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2ysrc = &v2y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3ysrc = &v3y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4ysrc = &v4y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5ysrc = &v5y_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v0zsrc = &v0z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v1zsrc = &v1z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v2zsrc = &v2z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v3zsrc = &v3z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v4zsrc = &v4z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *v5zsrc = &v5z_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { v0xsrc[list[i]] = buf[n++]; v1xsrc[list[i]] = buf[n++]; @@ -2359,17 +2346,17 @@ void PPPMSpin::unpack_forward(int flag, FFT_SCALAR *buf, int nlist, int *list) pack ghost values into buf to send to another proc ------------------------------------------------------------------------- */ -void PPPMSpin::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMDipole::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == REVERSE_SP) { - FFT_SCALAR *src_spin0 = &densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_spin1 = &densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *src_spin2 = &densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + if (flag == REVERSE_MU) { + FFT_SCALAR *src_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *src_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { - buf[n++] = src_spin0[list[i]]; - buf[n++] = src_spin1[list[i]]; - buf[n++] = src_spin2[list[i]]; + buf[n++] = src_dipole0[list[i]]; + buf[n++] = src_dipole1[list[i]]; + buf[n++] = src_dipole2[list[i]]; } } } @@ -2378,17 +2365,17 @@ void PPPMSpin::pack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) unpack another proc's ghost values from buf and add to own values ------------------------------------------------------------------------- */ -void PPPMSpin::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) +void PPPMDipole::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) { int n = 0; - if (flag == REVERSE_SP) { - FFT_SCALAR *dest_spin0 = &densityx_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_spin1 = &densityy_brick_spin[nzlo_out][nylo_out][nxlo_out]; - FFT_SCALAR *dest_spin2 = &densityz_brick_spin[nzlo_out][nylo_out][nxlo_out]; + if (flag == REVERSE_MU) { + FFT_SCALAR *dest_dipole0 = &densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_dipole1 = &densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]; + FFT_SCALAR *dest_dipole2 = &densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]; for (int i = 0; i < nlist; i++) { - dest_spin0[list[i]] += buf[n++]; - dest_spin1[list[i]] += buf[n++]; - dest_spin2[list[i]] += buf[n++]; + dest_dipole0[list[i]] += buf[n++]; + dest_dipole1[list[i]] += buf[n++]; + dest_dipole2[list[i]] += buf[n++]; } } } @@ -2401,50 +2388,57 @@ void PPPMSpin::unpack_reverse(int flag, FFT_SCALAR *buf, int nlist, int *list) extended to non-neutral systems (J. Chem. Phys. 131, 094107). ------------------------------------------------------------------------- */ -void PPPMSpin::slabcorr() +void PPPMDipole::slabcorr() { - // compute local contribution to global spin moment + // compute local contribution to global dipole moment double **x = atom->x; double zprd = domain->zprd; int nlocal = atom->nlocal; - double spin = 0.0; - double **sp = atom->sp; - double spx,spy,spz; - for (int i = 0; i < nlocal; i++) { - spz = sp[i][2]*sp[i][3]; - spin += spz; + double dipole = 0.0; + double **mu = atom->mu; + for (int i = 0; i < nlocal; i++) dipole += mu[i][2]; + + // sum local contributions to get global dipole moment + + double dipole_all; + MPI_Allreduce(&dipole,&dipole_all,1,MPI_DOUBLE,MPI_SUM,world); + + // need to make non-neutral systems and/or + // per-atom energy translationally invariant + + if (eflag_atom || fabs(qsum) > SMALL) { + + error->all(FLERR,"Cannot (yet) use kspace slab correction with " + "long-range dipoles and non-neutral systems or per-atom energy"); } - // sum local contributions to get global spin moment - - double spin_all; - MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); - // compute corrections - const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; - const double spscale = mub2mu0 * scale; + const double e_slabcorr = MY_2PI*(dipole_all*dipole_all/12.0)/volume; + const double qscale = qqrd2e * scale; - if (eflag_global) energy += spscale * e_slabcorr; + if (eflag_global) energy += qscale * e_slabcorr; // per-atom energy if (eflag_atom) { - double efact = spscale * MY_2PI/volume/12.0; - for (int i = 0; i < nlocal; i++) { - spz = sp[i][2]*sp[i][3]; - eatom[i] += efact * spz * spin_all; - } + double efact = qscale * MY_2PI/volume/12.0; + for (int i = 0; i < nlocal; i++) + eatom[i] += efact * mu[i][2]*dipole_all; } - // add on mag. force corrections + // add on torque corrections - double ffact = spscale * (-4.0*MY_PI/volume); - double **fm = atom->fm; - for (int i = 0; i < nlocal; i++) { - fm[i][2] += ffact * spin_all; + if (atom->torque) { + double ffact = qscale * (-4.0*MY_PI/volume); + double **mu = atom->mu; + double **torque = atom->torque; + for (int i = 0; i < nlocal; i++) { + torque[i][0] += ffact * dipole_all * mu[i][1]; + torque[i][1] += -ffact * dipole_all * mu[i][0]; + } } } @@ -2452,7 +2446,7 @@ void PPPMSpin::slabcorr() perform and time the 1d FFTs required for N timesteps ------------------------------------------------------------------------- */ -int PPPMSpin::timing_1d(int n, double &time1d) +int PPPMDipole::timing_1d(int n, double &time1d) { double time1,time2; @@ -2487,7 +2481,7 @@ int PPPMSpin::timing_1d(int n, double &time1d) perform and time the 3d FFTs required for N timesteps ------------------------------------------------------------------------- */ -int PPPMSpin::timing_3d(int n, double &time3d) +int PPPMDipole::timing_3d(int n, double &time3d) { double time1,time2; @@ -2522,7 +2516,7 @@ int PPPMSpin::timing_3d(int n, double &time3d) memory usage of local arrays ------------------------------------------------------------------------- */ -double PPPMSpin::memory_usage() +double PPPMDipole::memory_usage() { double bytes = nmax*3 * sizeof(double); int nbrick = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * @@ -2536,43 +2530,37 @@ double PPPMSpin::memory_usage() if (peratom_allocate_flag) bytes += 21 * nbrick * sizeof(FFT_SCALAR); - if (cg_spin) bytes += cg_spin->memory_usage(); - if (cg_peratom_spin) bytes += cg_peratom_spin->memory_usage(); + if (cg_dipole) bytes += cg_dipole->memory_usage(); + if (cg_peratom_dipole) bytes += cg_peratom_dipole->memory_usage(); return bytes; } /* ---------------------------------------------------------------------- - compute spsum,spsqsum,sp2 - called initially, when particle count changes, when spins are changed + compute musum,musqsum,mu2 + called initially, when particle count changes, when dipoles are changed ------------------------------------------------------------------------- */ -void PPPMSpin::spsum_spsq() +void PPPMDipole::musum_musq() { const int nlocal = atom->nlocal; - spsum = spsqsum = sp2 = 0.0; - if (atom->sp_flag) { - double **sp = atom->sp; - double spx, spy, spz; - double spsum_local(0.0), spsqsum_local(0.0); - - // not exactly the good loop: need to add norm of spins + musum = musqsum = mu2 = 0.0; + if (atom->mu_flag) { + double** mu = atom->mu; + double musum_local(0.0), musqsum_local(0.0); for (int i = 0; i < nlocal; i++) { - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - spsum_local += spx + spy + spz; - spsqsum_local += spx*spx + spy*spy + spz*spz; + musum_local += mu[i][0] + mu[i][1] + mu[i][2]; + musqsum_local += mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]; } - MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); - sp2 = spsqsum * mub2mu0; + mu2 = musqsum * force->qqrd2e; } - if (sp2 == 0 && comm->me == 0) - error->all(FLERR,"Using kspace solver PPPMSpin on system with no spins"); + if (mu2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); } diff --git a/src/KSPACE/pppm_dipole.h b/src/KSPACE/pppm_dipole.h new file mode 100644 index 0000000000..8db28b540a --- /dev/null +++ b/src/KSPACE/pppm_dipole.h @@ -0,0 +1,213 @@ +/* -*- 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 KSPACE_CLASS + +KSpaceStyle(pppm/dipole,PPPMDipole) + +#else + +#ifndef LMP_PPPM_DIPOLE_H +#define LMP_PPPM_DIPOLE_H + +#include "pppm.h" + +namespace LAMMPS_NS { + +class PPPMDipole : public PPPM { + public: + PPPMDipole(class LAMMPS *, int, char **); + virtual ~PPPMDipole(); + void init(); + void setup(); + void setup_grid(); + void compute(int, int); + int timing_1d(int, double &); + int timing_3d(int, double &); + double memory_usage(); + + protected: + void set_grid_global(double); + //double newton_raphson_f(); + + void allocate(); + void allocate_peratom(); + void deallocate(); + void deallocate_peratom(); + void compute_gf_denom(); + + void slabcorr(); + + // grid communication + + void pack_forward(int, FFT_SCALAR *, int, int *); + void unpack_forward(int, FFT_SCALAR *, int, int *); + void pack_reverse(int, FFT_SCALAR *, int, int *); + void unpack_reverse(int, FFT_SCALAR *, int, int *); + + // dipole + + FFT_SCALAR ***densityx_brick_dipole,***densityy_brick_dipole,***densityz_brick_dipole; + FFT_SCALAR ***vdxx_brick_dipole,***vdyy_brick_dipole,***vdzz_brick_dipole; + FFT_SCALAR ***vdxy_brick_dipole,***vdxz_brick_dipole,***vdyz_brick_dipole; + FFT_SCALAR ***ux_brick_dipole,***uy_brick_dipole,***uz_brick_dipole; + FFT_SCALAR ***v0x_brick_dipole,***v1x_brick_dipole,***v2x_brick_dipole; + FFT_SCALAR ***v3x_brick_dipole,***v4x_brick_dipole,***v5x_brick_dipole; + FFT_SCALAR ***v0y_brick_dipole,***v1y_brick_dipole,***v2y_brick_dipole; + FFT_SCALAR ***v3y_brick_dipole,***v4y_brick_dipole,***v5y_brick_dipole; + FFT_SCALAR ***v0z_brick_dipole,***v1z_brick_dipole,***v2z_brick_dipole; + FFT_SCALAR ***v3z_brick_dipole,***v4z_brick_dipole,***v5z_brick_dipole; + FFT_SCALAR *work3,*work4; + FFT_SCALAR *densityx_fft_dipole,*densityy_fft_dipole,*densityz_fft_dipole; + class GridComm *cg_dipole; + class GridComm *cg_peratom_dipole; + int only_dipole_flag; + double musum,musqsum,mu2; + double find_gewald_dipole(double, double, bigint, double, double); + double newton_raphson_f_dipole(double, double, bigint, double, double); + double derivf_dipole(double, double, bigint, double, double); + double compute_df_kspace_dipole(double); + double compute_qopt_dipole(); + void compute_gf_dipole(); + void make_rho_dipole(); + void brick2fft_dipole(); + void poisson_ik_dipole(); + void poisson_peratom_dipole(); + void fieldforce_ik_dipole(); + void fieldforce_peratom_dipole(); + double final_accuracy_dipole(double dipole2); + void musum_musq(); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Cannot (yet) use charges with Kspace style PPPMDipole + +Charge-dipole interactions are not yet implemented in PPPMDipole so this +feature is not yet supported. + +E: Must redefine kspace_style after changing to triclinic box + +Self-explanatory. + +E: Kspace style requires atom attribute mu + +The atom style defined does not have this attribute. + +E: Cannot (yet) use kspace_modify diff ad with dipoles + +This feature is not yet supported. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Cannot yet use triclinic cells with PPPMDipole + +This feature is not yet supported. + +E: Cannot yet use TIP4P with PPPMDipole + +This feature is not yet supported. + +E: Cannot use nonperiodic boundaries with PPPM + +For kspace style pppm, all 3 dimensions must have periodic boundaries +unless you use the kspace_modify command to define a 2d slab with a +non-periodic z dimension. + +E: Incorrect boundaries with slab PPPM + +Must have periodic x,y dimensions and non-periodic z dimension to use +2d slab option with PPPM. + +E: PPPM order cannot be < 2 or > than %d + +This is a limitation of the PPPM implementation in LAMMPS. + +E: KSpace style is incompatible with Pair style + +Setting a kspace style requires that a pair style with matching +long-range dipole components be used. + +W: Reducing PPPM order b/c stencil extends beyond nearest neighbor processor + +This may lead to a larger grid than desired. See the kspace_modify overlap +command to prevent changing of the PPPM order. + +E: PPPM order < minimum allowed order + +The default minimum order is 2. This can be reset by the +kspace_modify minorder command. + +E: PPPM grid stencil extends beyond nearest neighbor processor + +This is not allowed if the kspace_modify overlap setting is no. + +E: KSpace accuracy must be > 0 + +The kspace accuracy designated in the input must be greater than zero. + +E: Could not compute grid size + +The code is unable to compute a grid size consistent with the desired +accuracy. This error should not occur for typical problems. Please +send an email to the developers. + +E: PPPM grid is too large + +The global PPPM grid is larger than OFFSET in one or more dimensions. +OFFSET is currently set to 4096. You likely need to decrease the +requested accuracy. + +E: Could not compute g_ewald + +The Newton-Raphson solver failed to converge to a good value for +g_ewald. This error should not occur for typical problems. Please +send an email to the developers. + +E: Non-numeric box dimensions - simulation unstable + +The box size has apparently blown up. + +E: Out of range atoms - cannot compute PPPM + +One or more atoms are attempting to map their charge to a PPPM grid +point that is not owned by a processor. This is likely for one of two +reasons, both of them bad. First, it may mean that an atom near the +boundary of a processor's sub-domain has moved more than 1/2 the +"neighbor skin distance"_neighbor.html without neighbor lists being +rebuilt and atoms being migrated to new processors. This also means +you may be missing pairwise interactions that need to be computed. +The solution is to change the re-neighboring criteria via the +"neigh_modify"_neigh_modify command. The safest settings are "delay 0 +every 1 check yes". Second, it may mean that an atom has moved far +outside a processor's sub-domain or even the entire simulation box. +This indicates bad physics, e.g. due to highly overlapping atoms, too +large a timestep, etc. + +E: Using kspace solver PPPMDipole on system with no dipoles + +Must have non-zero dipoles with PPPMDipole. + +E: Must use kspace_modify gewald for system with no dipoles + +Self-explanatory. + +*/ diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp new file mode 100644 index 0000000000..4fde7ba101 --- /dev/null +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -0,0 +1,750 @@ +/* ---------------------------------------------------------------------- + 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: Stan Moore (SNL) + Julien Tranchida (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "pppm_dipole_spin.h" +#include "atom.h" +#include "comm.h" +#include "gridcomm.h" +#include "neighbor.h" +#include "force.h" +#include "pair.h" +#include "bond.h" +#include "angle.h" +#include "domain.h" +#include "fft3d_wrap.h" +#include "remap_wrap.h" +#include "memory.h" +#include "error.h" +#include "update.h" + +#include "math_const.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define MAXORDER 7 +#define OFFSET 16384 +#define LARGE 10000.0 +#define SMALL 0.00001 +#define EPS_HOC 1.0e-7 + +enum{REVERSE_SP}; +enum{FORWARD_SP,FORWARD_SP_PERATOM}; + +#ifdef FFT_SINGLE +#define ZEROF 0.0f +#define ONEF 1.0f +#else +#define ZEROF 0.0 +#define ONEF 1.0 +#endif + +/* ---------------------------------------------------------------------- */ + +PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp, int narg, char **arg) : + PPPMDipole(lmp, narg, arg) +{ + dipoleflag = 0; + spinflag = 1; + group_group_enable = 0; + + cg_dipole = NULL; + cg_peratom_dipole = NULL; +} + +/* ---------------------------------------------------------------------- + free all memory +------------------------------------------------------------------------- */ + +PPPMDipoleSpin::~PPPMDipoleSpin() +{ + if (copymode) return; + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + fft1 = NULL; + fft2 = NULL; + remap = NULL; + cg_dipole = NULL; +} + +/* ---------------------------------------------------------------------- + called once before run +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::init() +{ + if (me == 0) { + if (screen) fprintf(screen,"PPPMDipoleSpin initialization ...\n"); + if (logfile) fprintf(logfile,"PPPMDipoleSpin initialization ...\n"); + } + + // error check + + spinflag = atom->sp?1:0; + + triclinic_check(); + + if (triclinic != domain->triclinic) + error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); + + if (domain->dimension == 2) error->all(FLERR, + "Cannot use PPPMDipoleSpin with 2d simulation"); + if (comm->style != 0) + error->universe_all(FLERR,"PPPMDipoleSpin can only currently be used with " + "comm_style brick"); + + if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); + + if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" + " ad with spins"); + + if (spinflag && strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"'metal' units have to be used with spins"); + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with PPPMDipoleSpin"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab PPPMDipoleSpin"); + } + + if (order < 2 || order > MAXORDER) { + char str[128]; + sprintf(str,"PPPMDipoleSpin order cannot be < 2 or > than %d",MAXORDER); + error->all(FLERR,str); + } + + // extract short-range Coulombic cutoff from pair style + + triclinic = domain->triclinic; + if (triclinic) + error->all(FLERR,"Cannot yet use triclinic cells with PPPMDipoleSpin"); + + pair_check(); + + int itmp = 0; + double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + if (p_cutoff == NULL) + error->all(FLERR,"KSpace style is incompatible with Pair style"); + cutoff = *p_cutoff; + + // kspace TIP4P not yet supported + + if (tip4pflag) + error->all(FLERR,"Cannot yet use TIP4P with PPPMDipoleSpin"); + + scale = 1.0; + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + spsum_spsq(); + natoms_original = atom->natoms; + + // set accuracy (force units) from accuracy_relative or accuracy_absolute + + // is two_charge_force still relevant for spin systems? + + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; + else accuracy = accuracy_relative * two_charge_force; + + // free all arrays previously allocated + + deallocate(); + if (peratom_allocate_flag) deallocate_peratom(); + + // setup FFT grid resolution and g_ewald + // normally one iteration thru while loop is all that is required + // if grid stencil does not extend beyond neighbor proc + // or overlap is allowed, then done + // else reduce order and try again + + int (*procneigh)[2] = comm->procneigh; + + GridComm *cgtmp = NULL; + int iteration = 0; + + while (order >= minorder) { + if (iteration && me == 0) + error->warning(FLERR,"Reducing PPPMDipoleSpin order b/c stencil extends " + "beyond nearest neighbor processor"); + + compute_gf_denom(); + set_grid_global(sp2); + set_grid_local(); + if (overlap_allowed) break; + + cgtmp = new GridComm(lmp,world,1,1, + nxlo_in,nxhi_in,nylo_in,nyhi_in,nzlo_in,nzhi_in, + nxlo_out,nxhi_out,nylo_out,nyhi_out,nzlo_out,nzhi_out, + procneigh[0][0],procneigh[0][1],procneigh[1][0], + procneigh[1][1],procneigh[2][0],procneigh[2][1]); + cgtmp->ghost_notify(); + if (!cgtmp->ghost_overlap()) break; + delete cgtmp; + + order--; + iteration++; + } + + if (order < minorder) error->all(FLERR,"PPPMDipoleSpin order < minimum allowed order"); + if (!overlap_allowed && cgtmp->ghost_overlap()) + error->all(FLERR,"PPPMDipoleSpin grid stencil extends " + "beyond nearest neighbor processor"); + if (cgtmp) delete cgtmp; + + // adjust g_ewald + + if (!gewaldflag) adjust_gewald(); + + // calculate the final accuracy + + double estimated_accuracy = final_accuracy_dipole(sp2); + + // print stats + + int ngrid_max,nfft_both_max; + MPI_Allreduce(&ngrid,&ngrid_max,1,MPI_INT,MPI_MAX,world); + MPI_Allreduce(&nfft_both,&nfft_both_max,1,MPI_INT,MPI_MAX,world); + + if (me == 0) { + +#ifdef FFT_SINGLE + const char fft_prec[] = "single"; +#else + const char fft_prec[] = "double"; +#endif + + if (screen) { + fprintf(screen," G vector (1/distance) = %g\n",g_ewald); + fprintf(screen," grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm); + fprintf(screen," stencil order = %d\n",order); + fprintf(screen," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(screen," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(screen," using %s precision FFTs\n",fft_prec); + fprintf(screen," 3d grid and FFT values/proc = %d %d\n", + ngrid_max,nfft_both_max); + } + if (logfile) { + fprintf(logfile," G vector (1/distance) = %g\n",g_ewald); + fprintf(logfile," grid = %d %d %d\n",nx_pppm,ny_pppm,nz_pppm); + fprintf(logfile," stencil order = %d\n",order); + fprintf(logfile," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(logfile," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(logfile," using %s precision FFTs\n",fft_prec); + fprintf(logfile," 3d grid and FFT values/proc = %d %d\n", + ngrid_max,nfft_both_max); + } + } + + // allocate K-space dependent memory + // don't invoke allocate peratom(), will be allocated when needed + + allocate(); + cg_dipole->ghost_notify(); + cg_dipole->setup(); + + // pre-compute Green's function denominator expansion + // pre-compute 1d charge distribution coefficients + + compute_gf_denom(); + compute_rho_coeff(); +} + +/* ---------------------------------------------------------------------- + compute the PPPMDipoleSpin long-range force, energy, virial +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::compute(int eflag, int vflag) +{ + int i,j; + + // 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; + + if (evflag_atom && !peratom_allocate_flag) { + allocate_peratom(); + cg_peratom_dipole->ghost_notify(); + cg_peratom_dipole->setup(); + } + + // if atom count has changed, update qsum and qsqsum + + if (atom->natoms != natoms_original) { + spsum_spsq(); + natoms_original = atom->natoms; + } + + // return if there are no spins + + if (spsqsum == 0.0) return; + + // convert atoms from box to lamda coords + + boxlo = domain->boxlo; + + // extend size of per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(part2grid); + nmax = atom->nmax; + memory->create(part2grid,nmax,3,"pppm_spin:part2grid"); + } + + // find grid points for all my particles + // map my particle charge onto my local 3d on-grid density + + particle_map(); + make_rho_spin(); + + // all procs communicate density values from their ghost cells + // to fully sum contribution in their 3d bricks + // remap from 3d decomposition to FFT decomposition + + cg_dipole->reverse_comm(this,REVERSE_SP); + brick2fft_dipole(); + + // compute potential gradient on my FFT grid and + // portion of e_long on this proc's FFT grid + // return gradients (electric fields) in 3d brick decomposition + // also performs per-atom calculations via poisson_peratom() + + poisson_ik_dipole(); + + // all procs communicate E-field values + // to fill ghost cells surrounding their 3d bricks + + cg_dipole->forward_comm(this,FORWARD_SP); + + // extra per-atom energy/virial communication + + if (evflag_atom) { + cg_peratom_dipole->forward_comm(this,FORWARD_SP_PERATOM); + } + + // calculate the force on my particles + + fieldforce_ik_spin(); + + // extra per-atom energy/virial communication + + if (evflag_atom) fieldforce_peratom_spin(); + + // sum global energy across procs and add in volume-dependent term + + const double spscale = mub2mu0 * scale; + const double g3 = g_ewald*g_ewald*g_ewald; + + if (eflag_global) { + double energy_all; + MPI_Allreduce(&energy,&energy_all,1,MPI_DOUBLE,MPI_SUM,world); + energy = energy_all; + + energy *= 0.5*volume; + energy -= spsqsum*2.0*g3/3.0/MY_PIS; + energy *= spscale; + } + + // sum global virial across procs + + if (vflag_global) { + double virial_all[6]; + MPI_Allreduce(virial,virial_all,6,MPI_DOUBLE,MPI_SUM,world); + for (i = 0; i < 6; i++) virial[i] = 0.5*spscale*volume*virial_all[i]; + } + + // per-atom energy/virial + // energy includes self-energy correction + + if (evflag_atom) { + double **sp = atom->sp; + double spx,spy,spz; + int nlocal = atom->nlocal; + int ntotal = nlocal; + + if (eflag_atom) { + for (i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + eatom[i] *= 0.5; + eatom[i] -= (spx*spx + spy*spy + spz*spz)*2.0*g3/3.0/MY_PIS; + eatom[i] *= spscale; + } + } + + if (vflag_atom) { + for (i = 0; i < ntotal; i++) + for (j = 0; j < 6; j++) vatom[i][j] *= 0.5*spscale; + } + } + + // 2d slab correction + + if (slabflag == 1) slabcorr(); +} + +/* ---------------------------------------------------------------------- + create discretized "density" on section of global grid due to my particles + density(x,y,z) = charge "density" at grid points of my 3d brick + (nxlo:nxhi,nylo:nyhi,nzlo:nzhi) is extent of my brick (including ghosts) + in global grid +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::make_rho_spin() +{ + int l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz; + FFT_SCALAR x0,y0,z0; + FFT_SCALAR x1,y1,z1; + FFT_SCALAR x2,y2,z2; + + // clear 3d density array + + memset(&(densityx_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + memset(&(densityy_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + memset(&(densityz_brick_dipole[nzlo_out][nylo_out][nxlo_out]),0, + ngrid*sizeof(FFT_SCALAR)); + + // loop over my charges, add their contribution to nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **sp = atom->sp; + double spx,spy,spz; + double **x = atom->x; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) { + + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + z0 = delvolinv * spx; + z1 = delvolinv * spy; + z2 = delvolinv * spz; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + y0 = z0*rho1d[2][n]; + y1 = z1*rho1d[2][n]; + y2 = z2*rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + x0 = y0*rho1d[1][m]; + x1 = y1*rho1d[1][m]; + x2 = y2*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + densityx_brick_dipole[mz][my][mx] += x0*rho1d[0][l]; + densityy_brick_dipole[mz][my][mx] += x1*rho1d[0][l]; + densityz_brick_dipole[mz][my][mx] += x2*rho1d[0][l]; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + interpolate from grid to get magnetic field & force on my particles for ik +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::fieldforce_ik_spin() +{ + int i,l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz; + FFT_SCALAR x0,y0,z0; + FFT_SCALAR ex,ey,ez; + FFT_SCALAR vxx,vyy,vzz,vxy,vxz,vyz; + + // loop over my charges, interpolate electric field from nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **sp = atom->sp; + double spx,spy,spz; + double **x = atom->x; + double **f = atom->f; + double **fm = atom->fm; + + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) { + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + ex = ey = ez = ZEROF; + vxx = vyy = vzz = vxy = vxz = vyz = ZEROF; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + z0 = rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + y0 = z0*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + x0 = y0*rho1d[0][l]; + ex -= x0*ux_brick_dipole[mz][my][mx]; + ey -= x0*uy_brick_dipole[mz][my][mx]; + ez -= x0*uz_brick_dipole[mz][my][mx]; + vxx -= x0*vdxx_brick_dipole[mz][my][mx]; + vyy -= x0*vdyy_brick_dipole[mz][my][mx]; + vzz -= x0*vdzz_brick_dipole[mz][my][mx]; + vxy -= x0*vdxy_brick_dipole[mz][my][mx]; + vxz -= x0*vdxz_brick_dipole[mz][my][mx]; + vyz -= x0*vdyz_brick_dipole[mz][my][mx]; + } + } + } + + // convert M-field to mech. and mag. forces + + const double spfactor = mub2mu0 * scale; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + f[i][0] += spfactor*(vxx*spx + vxy*spy + vxz*spz); + f[i][1] += spfactor*(vxy*spx + vyy*spy + vyz*spz); + f[i][2] += spfactor*(vxz*spx + vyz*spy + vzz*spz); + + const double spfactorh = mub2mu0hbinv * scale; + fm[i][0] += spfactorh*ex; + fm[i][1] += spfactorh*ey; + fm[i][2] += spfactorh*ez; + + // create a new vector (in atom_spin style ?) to store long-range fm tables + + } +} + +/* ---------------------------------------------------------------------- + interpolate from grid to get per-atom energy/virial +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::fieldforce_peratom_spin() +{ + int i,l,m,n,nx,ny,nz,mx,my,mz; + FFT_SCALAR dx,dy,dz,x0,y0,z0; + FFT_SCALAR ux,uy,uz; + FFT_SCALAR v0x,v1x,v2x,v3x,v4x,v5x; + FFT_SCALAR v0y,v1y,v2y,v3y,v4y,v5y; + FFT_SCALAR v0z,v1z,v2z,v3z,v4z,v5z; + + // loop over my charges, interpolate from nearby grid points + // (nx,ny,nz) = global coords of grid pt to "lower left" of charge + // (dx,dy,dz) = distance to "lower left" grid pt + // (mx,my,mz) = global coords of moving stencil pt + + double **sp = atom->sp; + double spx,spy,spz; + double **x = atom->x; + + int nlocal = atom->nlocal; + + for (i = 0; i < nlocal; i++) { + nx = part2grid[i][0]; + ny = part2grid[i][1]; + nz = part2grid[i][2]; + dx = nx+shiftone - (x[i][0]-boxlo[0])*delxinv; + dy = ny+shiftone - (x[i][1]-boxlo[1])*delyinv; + dz = nz+shiftone - (x[i][2]-boxlo[2])*delzinv; + + compute_rho1d(dx,dy,dz); + + ux = uy = uz = ZEROF; + v0x = v1x = v2x = v3x = v4x = v5x = ZEROF; + v0y = v1y = v2y = v3y = v4y = v5y = ZEROF; + v0z = v1z = v2z = v3z = v4z = v5z = ZEROF; + for (n = nlower; n <= nupper; n++) { + mz = n+nz; + z0 = rho1d[2][n]; + for (m = nlower; m <= nupper; m++) { + my = m+ny; + y0 = z0*rho1d[1][m]; + for (l = nlower; l <= nupper; l++) { + mx = l+nx; + x0 = y0*rho1d[0][l]; + if (eflag_atom) { + ux += x0*ux_brick_dipole[mz][my][mx]; + uy += x0*uy_brick_dipole[mz][my][mx]; + uz += x0*uz_brick_dipole[mz][my][mx]; + } + if (vflag_atom) { + v0x += x0*v0x_brick_dipole[mz][my][mx]; + v1x += x0*v1x_brick_dipole[mz][my][mx]; + v2x += x0*v2x_brick_dipole[mz][my][mx]; + v3x += x0*v3x_brick_dipole[mz][my][mx]; + v4x += x0*v4x_brick_dipole[mz][my][mx]; + v5x += x0*v5x_brick_dipole[mz][my][mx]; + v0y += x0*v0y_brick_dipole[mz][my][mx]; + v1y += x0*v1y_brick_dipole[mz][my][mx]; + v2y += x0*v2y_brick_dipole[mz][my][mx]; + v3y += x0*v3y_brick_dipole[mz][my][mx]; + v4y += x0*v4y_brick_dipole[mz][my][mx]; + v5y += x0*v5y_brick_dipole[mz][my][mx]; + v0z += x0*v0z_brick_dipole[mz][my][mx]; + v1z += x0*v1z_brick_dipole[mz][my][mx]; + v2z += x0*v2z_brick_dipole[mz][my][mx]; + v3z += x0*v3z_brick_dipole[mz][my][mx]; + v4z += x0*v4z_brick_dipole[mz][my][mx]; + v5z += x0*v5z_brick_dipole[mz][my][mx]; + } + } + } + } + + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + if (eflag_atom) eatom[i] += spx*ux + spy*uy + spz*uz; + if (vflag_atom) { + vatom[i][0] += spx*v0x + spy*v0y + spz*v0z; + vatom[i][1] += spx*v1x + spy*v1y + spz*v1z; + vatom[i][2] += spx*v2x + spy*v2y + spz*v2z; + vatom[i][3] += spx*v3x + spy*v3y + spz*v3z; + vatom[i][4] += spx*v4x + spy*v4y + spz*v4z; + vatom[i][5] += spx*v5x + spy*v5y + spz*v5z; + } + } +} + +/* ---------------------------------------------------------------------- + Slab-geometry correction term to dampen inter-slab interactions between + periodically repeating slabs. Yields good approximation to 2D Ewald if + adequate empty space is left between repeating slabs (J. Chem. Phys. + 111, 3155). Slabs defined here to be parallel to the xy plane. Also + extended to non-neutral systems (J. Chem. Phys. 131, 094107). +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::slabcorr() +{ + // compute local contribution to global spin moment + + double **x = atom->x; + double zprd = domain->zprd; + int nlocal = atom->nlocal; + + double spin = 0.0; + double **sp = atom->sp; + double spx,spy,spz; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + spin += spz; + } + + // sum local contributions to get global spin moment + + double spin_all; + MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); + + // compute corrections + + const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; + const double spscale = mub2mu0 * scale; + + if (eflag_global) energy += spscale * e_slabcorr; + + // per-atom energy + + if (eflag_atom) { + double efact = spscale * MY_2PI/volume/12.0; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + eatom[i] += efact * spz * spin_all; + } + } + + // add on mag. force corrections + + double ffact = spscale * (-4.0*MY_PI/volume); + double **fm = atom->fm; + for (int i = 0; i < nlocal; i++) { + fm[i][2] += ffact * spin_all; + } +} + +/* ---------------------------------------------------------------------- + compute spsum,spsqsum,sp2 + called initially, when particle count changes, when spins are changed +------------------------------------------------------------------------- */ + +void PPPMDipoleSpin::spsum_spsq() +{ + const int nlocal = atom->nlocal; + + spsum = spsqsum = sp2 = 0.0; + if (atom->sp_flag) { + double **sp = atom->sp; + double spx, spy, spz; + double spsum_local(0.0), spsqsum_local(0.0); + + // not exactly the good loop: need to add norm of spins + + for (int i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + spsum_local += spx + spy + spz; + spsqsum_local += spx*spx + spy*spy + spz*spz; + } + + MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); + + sp2 = spsqsum * mub2mu0; + } + + if (sp2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMDipoleSpin on system with no spins"); +} diff --git a/src/KSPACE/pppm_spin.h b/src/KSPACE/pppm_dipole_spin.h similarity index 66% rename from src/KSPACE/pppm_spin.h rename to src/KSPACE/pppm_dipole_spin.h index 3b4d42d4ea..347006e586 100644 --- a/src/KSPACE/pppm_spin.h +++ b/src/KSPACE/pppm_dipole_spin.h @@ -13,28 +13,23 @@ #ifdef KSPACE_CLASS -KSpaceStyle(pppm/spin,PPPMSpin) +KSpaceStyle(pppm/dipole/spin,PPPMDipoleSpin) #else -#ifndef LMP_PPPM_DIPOLE_H -#define LMP_PPPM_DIPOLE_H +#ifndef LMP_PPPM_DIPOLE_SPIN_H +#define LMP_PPPM_DIPOLE_SPIN_H -#include "pppm.h" +#include "pppm_dipole.h" namespace LAMMPS_NS { -class PPPMSpin : public PPPM { +class PPPMDipoleSpin : public PPPMDipole { public: - PPPMSpin(class LAMMPS *, int, char **); - virtual ~PPPMSpin(); + PPPMDipoleSpin(class LAMMPS *, int, char **); + virtual ~PPPMDipoleSpin(); void init(); - void setup(); - void setup_grid(); void compute(int, int); - int timing_1d(int, double &); - int timing_3d(int, double &); - double memory_usage(); protected: double hbar; // reduced Planck's constant @@ -42,55 +37,15 @@ class PPPMSpin : public PPPM { double mu_0; // vacuum permeability double mub2mu0; // prefactor for mech force double mub2mu0hbinv; // prefactor for mag force - void set_grid_global(); - double newton_raphson_f(); - - void allocate(); - void allocate_peratom(); - void deallocate(); - void deallocate_peratom(); - void compute_gf_denom(); void slabcorr(); - // grid communication - - void pack_forward(int, FFT_SCALAR *, int, int *); - void unpack_forward(int, FFT_SCALAR *, int, int *); - void pack_reverse(int, FFT_SCALAR *, int, int *); - void unpack_reverse(int, FFT_SCALAR *, int, int *); - // spin - FFT_SCALAR ***densityx_brick_spin,***densityy_brick_spin,***densityz_brick_spin; - FFT_SCALAR ***vdxx_brick_spin,***vdyy_brick_spin,***vdzz_brick_spin; - FFT_SCALAR ***vdxy_brick_spin,***vdxz_brick_spin,***vdyz_brick_spin; - FFT_SCALAR ***ux_brick_spin,***uy_brick_spin,***uz_brick_spin; - FFT_SCALAR ***v0x_brick_spin,***v1x_brick_spin,***v2x_brick_spin; - FFT_SCALAR ***v3x_brick_spin,***v4x_brick_spin,***v5x_brick_spin; - FFT_SCALAR ***v0y_brick_spin,***v1y_brick_spin,***v2y_brick_spin; - FFT_SCALAR ***v3y_brick_spin,***v4y_brick_spin,***v5y_brick_spin; - FFT_SCALAR ***v0z_brick_spin,***v1z_brick_spin,***v2z_brick_spin; - FFT_SCALAR ***v3z_brick_spin,***v4z_brick_spin,***v5z_brick_spin; - FFT_SCALAR *work3,*work4; - FFT_SCALAR *densityx_fft_spin,*densityy_fft_spin,*densityz_fft_spin; - class GridComm *cg_spin; - class GridComm *cg_peratom_spin; - int only_spin_flag; double spsum,spsqsum,sp2; - double find_gewald_spin(double, double, bigint, double, double); - double newton_raphson_f_spin(double, double, bigint, double, double); - double derivf_spin(double, double, bigint, double, double); - double compute_df_kspace_spin(); - double compute_qopt_spin(); - void compute_gf_spin(); void make_rho_spin(); - void brick2fft_spin(); - void poisson_ik_spin(); - void poisson_peratom_spin(); void fieldforce_ik_spin(); void fieldforce_peratom_spin(); - double final_accuracy_spin(); void spsum_spsq(); }; @@ -102,9 +57,9 @@ class PPPMSpin : public PPPM { /* ERROR/WARNING messages: -E: Cannot (yet) use charges with Kspace style PPPMSpin +E: Cannot (yet) use charges with Kspace style PPPMDipoleSpin -Charge-spin interactions are not yet implemented in PPPMSpin so this +Charge-spin interactions are not yet implemented in PPPMDipoleSpin so this feature is not yet supported. E: Must redefine kspace_style after changing to triclinic box @@ -123,11 +78,11 @@ E: Cannot (yet) use 'electron' units with spins This feature is not yet supported. -E: Cannot yet use triclinic cells with PPPMSpin +E: Cannot yet use triclinic cells with PPPMDipoleSpin This feature is not yet supported. -E: Cannot yet use TIP4P with PPPMSpin +E: Cannot yet use TIP4P with PPPMDipoleSpin This feature is not yet supported. @@ -207,9 +162,9 @@ outside a processor's sub-domain or even the entire simulation box. This indicates bad physics, e.g. due to highly overlapping atoms, too large a timestep, etc. -E: Using kspace solver PPPMSpin on system with no spins +E: Using kspace solver PPPMDipoleSpin on system with no spins -Must have non-zero spins with PPPMSpin. +Must have non-zero spins with PPPMDipoleSpin. E: Must use kspace_modify gewald for system with no spins diff --git a/src/SPIN/atom_vec_spin.cpp b/src/SPIN/atom_vec_spin.cpp index 6460a6185f..fb2b6dd797 100644 --- a/src/SPIN/atom_vec_spin.cpp +++ b/src/SPIN/atom_vec_spin.cpp @@ -48,7 +48,7 @@ AtomVecSpin::AtomVecSpin(LAMMPS *lmp) : AtomVec(lmp) comm_x_only = 0; comm_f_only = 0; size_forward = 7; - size_reverse = 6; + size_reverse = 9; size_border = 10; size_velocity = 3; size_data_atom = 9; @@ -58,7 +58,6 @@ AtomVecSpin::AtomVecSpin(LAMMPS *lmp) : AtomVec(lmp) atom->sp_flag = 1; } - /* ---------------------------------------------------------------------- grow atom arrays n = 0 grows arrays by a chunk @@ -88,6 +87,7 @@ void AtomVecSpin::grow(int n) sp = memory->grow(atom->sp,nmax,4,"atom:sp"); fm = memory->grow(atom->fm,nmax*comm->nthreads,3,"atom:fm"); + fm_long = memory->grow(atom->fm_long,nmax*comm->nthreads,3,"atom:fm_long"); if (atom->nextra_grow) for (int iextra = 0; iextra < atom->nextra_grow; iextra++) @@ -103,7 +103,7 @@ void AtomVecSpin::grow_reset() tag = atom->tag; type = atom->type; mask = atom->mask; image = atom->image; x = atom->x; v = atom->v; f = atom->f; - sp = atom->sp; fm = atom->fm; + sp = atom->sp; fm = atom->fm; fm_long = atom->fm_long; } @@ -342,6 +342,9 @@ int AtomVecSpin::pack_reverse(int n, int first, double *buf) buf[m++] = fm[i][0]; buf[m++] = fm[i][1]; buf[m++] = fm[i][2]; + buf[m++] = fm_long[i][0]; + buf[m++] = fm_long[i][1]; + buf[m++] = fm_long[i][2]; } return m; @@ -361,6 +364,9 @@ void AtomVecSpin::unpack_reverse(int n, int *list, double *buf) fm[j][0] += buf[m++]; fm[j][1] += buf[m++]; fm[j][2] += buf[m++]; + fm_long[j][0] += buf[m++]; + fm_long[j][1] += buf[m++]; + fm_long[j][2] += buf[m++]; } } @@ -939,6 +945,7 @@ bigint AtomVecSpin::memory_usage() if (atom->memcheck("sp")) bytes += memory->usage(sp,nmax,4); if (atom->memcheck("fm")) bytes += memory->usage(fm,nmax*comm->nthreads,3); + if (atom->memcheck("fm_long")) bytes += memory->usage(fm_long,nmax*comm->nthreads,3); return bytes; } @@ -947,6 +954,7 @@ void AtomVecSpin::force_clear(int n, size_t nbytes) { memset(&atom->f[0][0],0,3*nbytes); memset(&atom->fm[0][0],0,3*nbytes); + memset(&atom->fm_long[0][0],0,3*nbytes); } diff --git a/src/SPIN/atom_vec_spin.h b/src/SPIN/atom_vec_spin.h index 34bc55b99f..1f1c34df52 100644 --- a/src/SPIN/atom_vec_spin.h +++ b/src/SPIN/atom_vec_spin.h @@ -68,10 +68,12 @@ class AtomVecSpin : public AtomVec { int *type,*mask; imageint *image; double **x,**v,**f; // lattice quantities - double **sp,**fm; // spin quantities - // sp[i][0-2] direction of the spin i + + // spin quantities + double **sp; // sp[i][0-2] direction of the spin i // sp[i][3] atomic magnetic moment of the spin i - + double **fm; // fm[i][0-2] direction of magnetic precession + double **fm_long; // storage of long-range spin prec. components }; } diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index cc074bb97d..74570afbce 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -441,8 +441,6 @@ void PairSpinExchange::allocate() memory->create(cutsq,n+1,n+1,"pair:cutsq"); } - - /* ---------------------------------------------------------------------- proc 0 writes to restart file ------------------------------------------------------------------------- */ @@ -527,4 +525,3 @@ void PairSpinExchange::read_restart_settings(FILE *fp) MPI_Bcast(&offset_flag,1,MPI_INT,0,world); MPI_Bcast(&mix_flag,1,MPI_INT,0,world); } - diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp index 95c4e6b5a9..ca4f3d5e24 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_long.cpp @@ -13,19 +13,19 @@ /* ------------------------------------------------------------------------ Contributing authors: Julien Tranchida (SNL) - Stan Moore (SNL) - - Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. arXiv preprint arXiv:1801.10233. -------------------------------------------------------------------------- */ + Aidan Thompson (SNL) + Please cite the related publication: + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. +------------------------------------------------------------------------- */ #include #include #include #include + #include "pair_spin_long.h" #include "atom.h" #include "comm.h" @@ -80,10 +80,154 @@ PairSpinLong::~PairSpinLong() { if (allocated) { memory->destroy(setflag); - memory->destroy(cutsq); + memory->destroy(cut_spin_long); } } +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSpinLong::settings(int narg, char **arg) +{ + if (narg < 1 || narg > 2) + error->all(FLERR,"Incorrect args in pair_style command"); + + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Spin simulations require metal unit style"); + + cut_spin_long_global = force->numeric(FLERR,arg[0]); + //cut_spin = 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+1; j <= atom->ntypes; j++) { + if (setflag[i][j]) { + cut_spin_long[i][j] = cut_spin_long_global; + } + } + } + } + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSpinLong::coeff(int narg, char **arg) +{ + if (!allocated) allocate(); + + // check if args correct + + if (strcmp(arg[2],"long") != 0) + error->all(FLERR,"Incorrect args in pair_style command"); + if (narg != 3) + error->all(FLERR,"Incorrect args in pair_style command"); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double spin_long_cut_one = force->numeric(FLERR,arg[3]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + cut_spin_long[i][j] = spin_long_cut_one; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSpinLong::init_style() +{ + if (!atom->sp_flag) + error->all(FLERR,"Pair spin requires atom/spin style"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // checking if nve/spin is a listed fix + + int ifix = 0; + while (ifix < modify->nfix) { + if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + ifix++; + } + if (ifix == modify->nfix) + error->all(FLERR,"pair/spin style requires nve/spin"); + + // get the lattice_flag from nve/spin + + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { + lockfixnvespin = (FixNVESpin *) modify->fix[i]; + lattice_flag = lockfixnvespin->lattice_flag; + } + } + + // insure use of KSpace long-range solver, set g_ewald + + if (force->kspace == NULL) + error->all(FLERR,"Pair style requires a KSpace style"); + + g_ewald = force->kspace->g_ewald; + +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSpinLong::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + cut_spin_long[j][i] = cut_spin_long[i][j]; + + return cut_spin_long_global; +} + +/* ---------------------------------------------------------------------- + extract the larger cutoff if "cut" or "cut_coul" +------------------------------------------------------------------------- */ + +void *PairSpinLong::extract(const char *str, int &dim) +{ + if (strcmp(str,"cut") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"ewald_order") == 0) { + ewald_order = 0; + ewald_order |= 1<<1; + ewald_order |= 1<<3; + dim = 0; + return (void *) &ewald_order; + } else if (strcmp(str,"ewald_mix") == 0) { + dim = 0; + return (void *) &mix_flag; + } + return NULL; +} + /* ---------------------------------------------------------------------- */ void PairSpinLong::compute(int eflag, int vflag) @@ -95,6 +239,7 @@ void PairSpinLong::compute(int eflag, int vflag) double evdwl,ecoul; double xi[3],rij[3]; double spi[4],spj[4],fi[3],fmi[3]; + double local_cut2; double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; @@ -156,26 +301,25 @@ void PairSpinLong::compute(int eflag, int vflag) rij[2] = x[j][2] - xi[2]; rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - if (rsq < cutsq[itype][jtype]) { + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { r2inv = 1.0/rsq; rinv = sqrt(r2inv); - if (rsq < cut_spinsq) { - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - bij[0] = erfc * rinv; - bij[1] = (bij[0] + pre1*expm2) * r2inv; - bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - compute_long(i,j,rij,bij,fmi,spi,spj); - compute_long_mech(i,j,rij,bij,fmi,spi,spj); - - } + compute_long(i,j,rij,bij,fmi,spi,spj); + compute_long_mech(i,j,rij,bij,fmi,spi,spj); } // force accumulation @@ -194,7 +338,7 @@ void PairSpinLong::compute(int eflag, int vflag) } if (eflag) { - if (rsq <= cut_spinsq) { + if (rsq <= local_cut2) { evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + spi[2]*fmi[2]; evdwl *= hbar; @@ -219,6 +363,7 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; double bij[4],xi[3],rij[3],spi[4],spj[4]; + double local_cut2; double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; @@ -267,25 +412,24 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) rij[2] = x[j][2] - xi[2]; rsq = rij[0]*rij[0] + rij[1]*rij[1] + rij[2]*rij[2]; - if (rsq < cutsq[itype][jtype]) { + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { r2inv = 1.0/rsq; rinv = sqrt(r2inv); - if (rsq < cut_spinsq) { - r = sqrt(rsq); - grij = g_ewald * r; - expm2 = exp(-grij*grij); - t = 1.0 / (1.0 + EWALD_P*grij); - erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - bij[0] = erfc * rinv; - bij[1] = (bij[0] + pre1*expm2) * r2inv; - bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - compute_long(i,j,rij,bij,fmi,spi,spj); - - } + compute_long(i,j,rij,bij,fmi,spi,spj); } } @@ -361,111 +505,7 @@ void PairSpinLong::allocate() for (int j = i; j <= n; j++) setflag[i][j] = 0; - memory->create(cutsq,n+1,n+1,"pair:cutsq"); -} - -/* ---------------------------------------------------------------------- - global settings -------------------------------------------------------------------------- */ - -void PairSpinLong::settings(int narg, char **arg) -{ - if (narg < 1 || narg > 2) - error->all(FLERR,"Incorrect args in pair_style command"); - - if (strcmp(update->unit_style,"metal") != 0) - error->all(FLERR,"Spin simulations require metal unit style"); - - cut_spin = force->numeric(FLERR,arg[0]); - -} - -/* ---------------------------------------------------------------------- - set coeffs for one or more type pairs -------------------------------------------------------------------------- */ - -void PairSpinLong::coeff(int narg, char **arg) -{ - if (narg < 4 || narg > 5) - error->all(FLERR,"Incorrect args for pair coefficients"); - if (!allocated) allocate(); - - // check if args correct - - if (strcmp(arg[2],"long") != 0) - error->all(FLERR,"Incorrect args in pair_style command"); - if (narg != 3) - error->all(FLERR,"Incorrect args in pair_style command"); - - int ilo,ihi,jlo,jhi; - force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); - force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); - - int count = 0; - for (int i = ilo; i <= ihi; i++) { - for (int j = MAX(jlo,i); j <= jhi; j++) { - setflag[i][j] = 1; - count++; - } - } - - if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); -} - -/* ---------------------------------------------------------------------- - init for one type pair i,j and corresponding j,i -------------------------------------------------------------------------- */ - -double PairSpinLong::init_one(int i, int j) -{ - if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - - double cut = cut_spin; - return cut; -} - -/* ---------------------------------------------------------------------- - init specific to this pair style -------------------------------------------------------------------------- */ - -void PairSpinLong::init_style() -{ - if (!atom->sp_flag) - error->all(FLERR,"Pair spin requires atom/spin style"); - - // need a full neighbor list - - int irequest = neighbor->request(this,instance_me); - neighbor->requests[irequest]->half = 0; - neighbor->requests[irequest]->full = 1; - - // checking if nve/spin is a listed fix - - int ifix = 0; - while (ifix < modify->nfix) { - if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; - ifix++; - } - if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); - - // get the lattice_flag from nve/spin - - for (int i = 0; i < modify->nfix; i++) { - if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { - lockfixnvespin = (FixNVESpin *) modify->fix[i]; - lattice_flag = lockfixnvespin->lattice_flag; - } - } - - // insure use of KSpace long-range solver, set g_ewald - - if (force->kspace == NULL) - error->all(FLERR,"Pair style requires a KSpace style"); - - g_ewald = force->kspace->g_ewald; - - cut_spinsq = cut_spin * cut_spin; + memory->create(cut_spin_long,n+1,n+1,"pair:cut_spin_long"); } /* ---------------------------------------------------------------------- @@ -477,10 +517,14 @@ void PairSpinLong::write_restart(FILE *fp) write_restart_settings(fp); int i,j; - for (i = 1; i <= atom->ntypes; i++) + 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(&cut_spin_long[i][j],sizeof(int),1,fp); + } } + } } /* ---------------------------------------------------------------------- @@ -495,11 +539,18 @@ void PairSpinLong::read_restart(FILE *fp) int i,j; int me = comm->me; - for (i = 1; i <= atom->ntypes; i++) + 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(&cut_spin_long[i][j],sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); + } } + } } /* ---------------------------------------------------------------------- @@ -508,7 +559,7 @@ void PairSpinLong::read_restart(FILE *fp) void PairSpinLong::write_restart_settings(FILE *fp) { - fwrite(&cut_spin,sizeof(double),1,fp); + fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); } @@ -519,32 +570,9 @@ void PairSpinLong::write_restart_settings(FILE *fp) void PairSpinLong::read_restart_settings(FILE *fp) { if (comm->me == 0) { - fread(&cut_spin,sizeof(double),1,fp); + fread(&cut_spin_long_global,sizeof(double),1,fp); fread(&mix_flag,sizeof(int),1,fp); } - MPI_Bcast(&cut_spin,1,MPI_DOUBLE,0,world); + MPI_Bcast(&cut_spin_long_global,1,MPI_DOUBLE,0,world); MPI_Bcast(&mix_flag,1,MPI_INT,0,world); } - -/* ---------------------------------------------------------------------- */ - -void *PairSpinLong::extract(const char *str, int &dim) -{ - if (strcmp(str,"cut") == 0) { - dim = 0; - return (void *) &cut_spin; - } else if (strcmp(str,"cut_coul") == 0) { - dim = 0; - return (void *) &cut_spin; - } else if (strcmp(str,"ewald_order") == 0) { - ewald_order = 0; - ewald_order |= 1<<1; - ewald_order |= 1<<3; - dim = 0; - return (void *) &ewald_order; - } else if (strcmp(str,"ewald_mix") == 0) { - dim = 0; - return (void *) &mix_flag; - } - return NULL; -} diff --git a/src/SPIN/pair_spin_long.h b/src/SPIN/pair_spin_long.h index 867b771f74..0cdf6d2b80 100644 --- a/src/SPIN/pair_spin_long.h +++ b/src/SPIN/pair_spin_long.h @@ -49,6 +49,8 @@ class PairSpinLong : public PairSpin { void read_restart(FILE *); void write_restart_settings(FILE *); void read_restart_settings(FILE *); + + double cut_spin_long_global; // global long cutoff distance protected: double hbar; // reduced Planck's constant @@ -56,7 +58,8 @@ class PairSpinLong : public PairSpin { double mu_0; // vacuum permeability double mub2mu0; // prefactor for mech force double mub2mu0hbinv; // prefactor for mag force - double cut_spin, cut_spinsq; + + double **cut_spin_long; // cutoff distance long double g_ewald; int ewald_order; From cf1d421e10cf384098210c32cf3ea2374baf55e9 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 23 Aug 2018 15:18:30 -0600 Subject: [PATCH 0039/1242] Commit JT 082318 - corrected memory errors in pppm_dipole and pppm_dipole_spin - created fm_long in atom_vec_spin - fm_long added to fm in initial_integrate (in ComputeInteractionsSpin) --- .../SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy | 1 + .../exchange_fit_hcp_co/exchange_fit.py | 32 +++++++ .../exchange_fit_hcp_co/exchange_hcp_co.dat | 9 ++ examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 55 +++++++++++ examples/SPIN/pppm_spin/in.spin.pppm_spin | 61 ++++++++++++ src/KSPACE/pppm.cpp | 6 +- src/KSPACE/pppm_dipole.cpp | 93 +++++++++---------- src/KSPACE/pppm_dipole.h | 8 +- src/KSPACE/pppm_dipole_spin.cpp | 84 +++++++++-------- src/KSPACE/pppm_dipole_spin.h | 1 - src/SPIN/atom_vec_spin.cpp | 1 - src/SPIN/fix_nve_spin.cpp | 18 ++++ src/SPIN/fix_nve_spin.h | 3 +- src/SPIN/pair_spin_long.cpp | 11 ++- src/atom.cpp | 3 +- src/atom.h | 1 + src/pair.h | 2 +- 17 files changed, 288 insertions(+), 101 deletions(-) create mode 120000 examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy create mode 100644 examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py create mode 100644 examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat create mode 100644 examples/SPIN/pppm_spin/in.dipole.pppm_dipole create mode 100644 examples/SPIN/pppm_spin/in.spin.pppm_spin diff --git a/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy b/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy new file mode 120000 index 0000000000..6a47c9eebe --- /dev/null +++ b/examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy @@ -0,0 +1 @@ +../cobalt_fcc/Co_PurjaPun_2012.eam.alloy \ No newline at end of file diff --git a/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py new file mode 100644 index 0000000000..fa7dba417e --- /dev/null +++ b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_fit.py @@ -0,0 +1,32 @@ +#Program fitting the exchange interaction +#Model curve: Bethe-Slater function +import numpy as np, pylab, tkinter +import matplotlib.pyplot as plt +from scipy.optimize import curve_fit +from decimal import * + +print("Loop begin") + +#Definition of the Bethe-Slater function +def func(x,a,b,c): + return 4*a*((x/c)**2)*(1-b*(x/c)**2)*np.exp(-(x/c)**2) + +#Exchange coeff table (data to fit) +rdata, Jdata = np.loadtxt('exchange_hcp_co.dat', usecols=(0,1), unpack=True) +plt.plot(rdata, Jdata, 'b-', label='data') + +#Perform the fit +popt, pcov = curve_fit(func, rdata, Jdata, bounds=(0, [500.,5.,5.])) +plt.plot(rdata, func(rdata, *popt), 'r--', label='fit') + +#Print the fitted params +print("Parameters: a={:.10} (in meV), b={:.10} (adim), c={:.10} (in Ang)".format(*popt)) + +#Ploting the result +plt.xlabel('r_ij') +pylab.xlim([0,6.5]) +plt.ylabel('J_ij') +plt.legend() +plt.show() + +print("Loop end") diff --git a/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat new file mode 100644 index 0000000000..0968fa3edb --- /dev/null +++ b/examples/SPIN/pppm_spin/exchange_fit_hcp_co/exchange_hcp_co.dat @@ -0,0 +1,9 @@ +2.25569176882662 73.37931034482759 +2.3817863397548162 47.99999999999999 +2.4518388791593697 34.39080459770115 +2.507880910683012 31.816091954022987 +2.5359019264448337 28.137931034482747 +2.5779334500875657 25.011494252873554 +2.6339754816112086 19.126436781609186 +2.760070052539404 13.241379310344826 +3.5446584938704033 6.068965517241367 diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole new file mode 100644 index 0000000000..804ddad1e2 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole @@ -0,0 +1,55 @@ +# 3d Lennard-Jones melt + +units lj +#atom_style charge +atom_style hybrid sphere dipole +processors * 1 1 + +lattice fcc 0.8442 +#region box block 0 10 0 10 0 10 +region box block 0 5 0 5 0 5 +create_box 3 box +create_atoms 1 box +mass * 1.0 + +region long block 3 6 0 10 0 10 +set region long type 2 +set group all dipole/random 98934 0.75 +#set type 1:2 charge 0.0 + +velocity all create 1.0 87287 + +#pair_style lj/long/coul/long long off 2.5 +#pair_coeff * * 1.0 1.0 2.5 +#pair_coeff * 2 1.0 1.0 5.0 +pair_style lj/cut/dipole/long 3.0 +pair_coeff * * 1.0 1.0 + +#kspace_style pppm/disp 1.0e-4 +kspace_style pppm/dipole 1.0e-4 +kspace_modify gewald/disp 0.1 + +neighbor 0.3 bin +neigh_modify every 2 delay 4 check yes + +group fast type 1 +group slow type 2 +fix 0 all balance 20 1.0 shift x 5 1.0 & + weight group 2 fast 1.0 slow 2.0 weight time 0.66 + +fix 1 all nve + +#dump id all atom 50 dump.melt + +#dump 2 all image 25 image.*.jpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 2 pad 3 + +#dump 3 all movie 25 movie.mpg type type & +# axes yes 0.8 0.02 view 60 -30 +#dump_modify 3 pad 3 + +#thermo 50 +thermo 1 +#run 500 +run 5 diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin new file mode 100644 index 0000000000..87d18f4d16 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -0,0 +1,61 @@ +# hcp cobalt in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice hcp 2.5071 +region box block 0.0 20.0 0.0 20.0 0.0 8.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for hcp cobalt + +mass 1 58.93 + +#set group all spin/random 31 1.72 +set group all spin 1.72 0.0 0.0 1.0 +velocity all create 100 4928459 rot yes dist gaussian + +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 +pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * spin/long long 8.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +kspace_style pppm/dipole/spin 1.0e-4 + +#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +fix 3 all nve/spin lattice yes + +timestep 0.0001 + + +compute out_mag all compute/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_style custom step time v_magnorm v_emag temp etotal +thermo 10 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +run 20000 diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 132389b7d6..8eec8e2542 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -100,6 +100,9 @@ PPPM::PPPM(LAMMPS *lmp, int narg, char **arg) : KSpace(lmp, narg, arg), nyhi_in = nylo_in = nyhi_out = nylo_out = 0; nzhi_in = nzlo_in = nzhi_out = nzlo_out = 0; + // test + nlower = nupper = 0; + density_brick = vdx_brick = vdy_brick = vdz_brick = NULL; density_fft = NULL; u_brick = NULL; @@ -1428,12 +1431,13 @@ void PPPM::set_grid_local() double zprd = prd[2]; double zprd_slab = zprd*slab_volfactor; - double dist[3]; + double dist[3] = {0.0,0.0,0.0}; double cuthalf = 0.5*neighbor->skin + qdist; if (triclinic == 0) dist[0] = dist[1] = dist[2] = cuthalf; else kspacebbox(cuthalf,&dist[0]); int nlo,nhi; + nlo = nhi = 0; nlo = static_cast ((sublo[0]-dist[0]-boxlo[0]) * nx_pppm/xprd + shift) - OFFSET; diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index a03f5b9980..4d2b594af8 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -116,9 +116,10 @@ void PPPMDipole::init() // error check dipoleflag = atom->mu?1:0; - qsum_qsq(0); + qsum_qsq(0); // q[i] might not be declared ? + if (dipoleflag && q2) - error->all(FLERR,"Cannot (yet) uses charges with Kspace style PPPMDipole"); + error->all(FLERR,"Cannot (yet) use charges with Kspace style PPPMDipole"); triclinic_check(); @@ -168,7 +169,9 @@ void PPPMDipole::init() cutoff = *p_cutoff; // kspace TIP4P not yet supported + // qdist = offset only for TIP4P fictitious charge + qdist = 0.0; if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); @@ -206,7 +209,7 @@ void PPPMDipole::init() "beyond nearest neighbor processor"); compute_gf_denom(); - set_grid_global(mu2); + set_grid_global(); set_grid_local(); if (overlap_allowed) break; @@ -235,7 +238,7 @@ void PPPMDipole::init() // calculate the final accuracy - double estimated_accuracy = final_accuracy_dipole(mu2); + double estimated_accuracy = final_accuracy_dipole(); // print stats @@ -607,7 +610,7 @@ void PPPMDipole::allocate() // summation coeffs order_allocated = order; - memory->create(gf_b,order,"pppm_dipole:gf_b"); + if (!gf_b) memory->create(gf_b,order,"pppm_dipole:gf_b"); memory->create2d_offset(rho1d,3,-order/2,order/2,"pppm_dipole:rho1d"); memory->create2d_offset(drho1d,3,-order/2,order/2,"pppm_dipole:drho1d"); memory->create2d_offset(rho_coeff,order,(1-order)/2,order/2,"pppm_dipole:rho_coeff"); @@ -791,7 +794,8 @@ void PPPMDipole::deallocate_peratom() used for charge accumulation, FFTs, and electric field interpolation ------------------------------------------------------------------------- */ -void PPPMDipole::set_grid_global(double dipole2) +//void PPPMDipole::set_grid_global(double dipole2) +void PPPMDipole::set_grid_global() { // use xprd,yprd,zprd // adjust z dimension for 2d slab PPPMDipole @@ -813,14 +817,11 @@ void PPPMDipole::set_grid_global(double dipole2) if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); - //if (mu2 == 0.0) - if (dipole2 == 0.0) + if (mu2 == 0.0) error->all(FLERR,"Must use kspace_modify gewald for systems with no dipoles"); g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; - //Try Newton Solver double g_ewald_new = - find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,dipole2); - //find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + find_gewald_dipole(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; else error->warning(FLERR,"PPPMDipole dipole Newton solver failed, " "using old method to estimate g_ewald"); @@ -837,6 +838,7 @@ void PPPMDipole::set_grid_global(double dipole2) while (1) { // set grid dimension + nx_pppm = static_cast (xprd/h_x); ny_pppm = static_cast (yprd/h_y); nz_pppm = static_cast (zprd_slab/h_z); @@ -845,7 +847,8 @@ void PPPMDipole::set_grid_global(double dipole2) if (ny_pppm <= 1) ny_pppm = 2; if (nz_pppm <= 1) nz_pppm = 2; - //set local grid dimension + // set local grid dimension + int npey_fft,npez_fft; if (nz_pppm >= nprocs) { npey_fft = 1; @@ -862,7 +865,7 @@ void PPPMDipole::set_grid_global(double dipole2) nzlo_fft = me_z*nz_pppm/npez_fft; nzhi_fft = (me_z+1)*nz_pppm/npez_fft - 1; - double df_kspace = compute_df_kspace_dipole(dipole2); + double df_kspace = compute_df_kspace_dipole(); count++; @@ -895,7 +898,7 @@ void PPPMDipole::set_grid_global(double dipole2) compute estimated kspace force error for dipoles ------------------------------------------------------------------------- */ -double PPPMDipole::compute_df_kspace_dipole(double dipole2) +double PPPMDipole::compute_df_kspace_dipole() { double xprd = domain->xprd; double yprd = domain->yprd; @@ -903,8 +906,7 @@ double PPPMDipole::compute_df_kspace_dipole(double dipole2) double zprd_slab = zprd*slab_volfactor; bigint natoms = atom->natoms; double qopt = compute_qopt_dipole(); - //double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); - double df_kspace = sqrt(qopt/natoms)*dipole2/(3.0*xprd*yprd*zprd_slab); + double df_kspace = sqrt(qopt/natoms)*mu2/(3.0*xprd*yprd*zprd_slab); return df_kspace; } @@ -1101,27 +1103,27 @@ void PPPMDipole::compute_gf_dipole() calculate f(x) for use in Newton-Raphson solver ------------------------------------------------------------------------- */ -//double PPPMDipole::newton_raphson_f() -//{ -// double xprd = domain->xprd; -// double yprd = domain->yprd; -// double zprd = domain->zprd; -// bigint natoms = atom->natoms; -// -// double df_rspace,df_kspace; -// double vol = xprd*yprd*zprd; -// double a = cutoff*g_ewald; -// double rg2 = a*a; -// double rg4 = rg2*rg2; -// double rg6 = rg4*rg2; -// double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; -// double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; -// df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * -// sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); -// df_kspace = compute_df_kspace_dipole(); -// -// return df_rspace - df_kspace; -//} +double PPPMDipole::newton_raphson_f() +{ + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + bigint natoms = atom->natoms; + + double df_rspace,df_kspace; + double vol = xprd*yprd*zprd; + double a = cutoff*g_ewald; + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); + df_kspace = compute_df_kspace_dipole(); + + return df_rspace - df_kspace; +} /* ---------------------------------------------------------------------- find g_ewald parameter for dipoles based on desired accuracy @@ -1184,7 +1186,7 @@ double PPPMDipole::derivf_dipole(double x, double Rc, calculate the final estimate of the accuracy ------------------------------------------------------------------------- */ -double PPPMDipole::final_accuracy_dipole(double dipole2) +double PPPMDipole::final_accuracy_dipole() { double xprd = domain->xprd; double yprd = domain->yprd; @@ -1193,7 +1195,7 @@ double PPPMDipole::final_accuracy_dipole(double dipole2) bigint natoms = atom->natoms; if (natoms == 0) natoms = 1; // avoid division by zero - double df_kspace = compute_df_kspace_dipole(mu2); + double df_kspace = compute_df_kspace_dipole(); double a = cutoff*g_ewald; double rg2 = a*a; @@ -1201,10 +1203,7 @@ double PPPMDipole::final_accuracy_dipole(double dipole2) double rg6 = rg4*rg2; double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; - //double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * - // sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * - // exp(-rg2)); - double df_rspace = (dipole2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * + double df_rspace = (mu2/(sqrt(vol*powint(g_ewald,4)*powint(cutoff,9)*natoms)) * sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * exp(-rg2)); @@ -2521,11 +2520,11 @@ double PPPMDipole::memory_usage() double bytes = nmax*3 * sizeof(double); int nbrick = (nxhi_out-nxlo_out+1) * (nyhi_out-nylo_out+1) * (nzhi_out-nzlo_out+1); - bytes += 6 * nfft_both * sizeof(double); // vg - bytes += nfft_both * sizeof(double); // greensfn + bytes += 6 * nfft_both * sizeof(double); // vg + bytes += nfft_both * sizeof(double); // greensfn bytes += nfft_both*5 * sizeof(FFT_SCALAR); // work*2*2 - bytes += 9 * nbrick * sizeof(FFT_SCALAR); // ubrick*3 + vdbrick*6 - bytes += nfft_both*7 * sizeof(FFT_SCALAR); //density_ffx*3 + work*2*2 + bytes += 9 * nbrick * sizeof(FFT_SCALAR); // ubrick*3 + vdbrick*6 + bytes += nfft_both*7 * sizeof(FFT_SCALAR); // density_ffx*3 + work*2*2 if (peratom_allocate_flag) bytes += 21 * nbrick * sizeof(FFT_SCALAR); diff --git a/src/KSPACE/pppm_dipole.h b/src/KSPACE/pppm_dipole.h index 8db28b540a..52bd2e5a9d 100644 --- a/src/KSPACE/pppm_dipole.h +++ b/src/KSPACE/pppm_dipole.h @@ -37,8 +37,8 @@ class PPPMDipole : public PPPM { double memory_usage(); protected: - void set_grid_global(double); - //double newton_raphson_f(); + void set_grid_global(); + double newton_raphson_f(); void allocate(); void allocate_peratom(); @@ -76,7 +76,7 @@ class PPPMDipole : public PPPM { double find_gewald_dipole(double, double, bigint, double, double); double newton_raphson_f_dipole(double, double, bigint, double, double); double derivf_dipole(double, double, bigint, double, double); - double compute_df_kspace_dipole(double); + double compute_df_kspace_dipole(); double compute_qopt_dipole(); void compute_gf_dipole(); void make_rho_dipole(); @@ -85,7 +85,7 @@ class PPPMDipole : public PPPM { void poisson_peratom_dipole(); void fieldforce_ik_dipole(); void fieldforce_peratom_dipole(); - double final_accuracy_dipole(double dipole2); + double final_accuracy_dipole(); void musum_musq(); }; diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index 4fde7ba101..a5aee7150c 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -50,8 +50,8 @@ using namespace MathSpecial; #define SMALL 0.00001 #define EPS_HOC 1.0e-7 -enum{REVERSE_SP}; -enum{FORWARD_SP,FORWARD_SP_PERATOM}; +enum{REVERSE_MU}; +enum{FORWARD_MU,FORWARD_MU_PERATOM}; #ifdef FFT_SINGLE #define ZEROF 0.0f @@ -68,10 +68,12 @@ PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp, int narg, char **arg) : { dipoleflag = 0; spinflag = 1; - group_group_enable = 0; - - cg_dipole = NULL; - cg_peratom_dipole = NULL; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } /* ---------------------------------------------------------------------- @@ -104,7 +106,10 @@ void PPPMDipoleSpin::init() // error check spinflag = atom->sp?1:0; - + //qsum_qsq(0); // q[i] is probably not declared ? + //if (spinflag && q2) + // error->all(FLERR,"Cannot use charges with Kspace style PPPMDipoleSpin"); + triclinic_check(); if (triclinic != domain->triclinic) @@ -118,8 +123,8 @@ void PPPMDipoleSpin::init() if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); - if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use kspace_modify diff" - " ad with spins"); + if (atom->sp && differentiation_flag == 1) error->all(FLERR,"Cannot (yet) use" + " kspace_modify diff ad with spins"); if (spinflag && strcmp(update->unit_style,"metal") != 0) error->all(FLERR,"'metal' units have to be used with spins"); @@ -148,21 +153,19 @@ void PPPMDipoleSpin::init() int itmp = 0; double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + // probably not the correct extract here if (p_cutoff == NULL) error->all(FLERR,"KSpace style is incompatible with Pair style"); cutoff = *p_cutoff; // kspace TIP4P not yet supported - + // qdist = offset only for TIP4P fictitious charge + + qdist = 0.0; if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMDipoleSpin"); scale = 1.0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz spsum_spsq(); natoms_original = atom->natoms; @@ -188,14 +191,14 @@ void PPPMDipoleSpin::init() GridComm *cgtmp = NULL; int iteration = 0; - + while (order >= minorder) { if (iteration && me == 0) error->warning(FLERR,"Reducing PPPMDipoleSpin order b/c stencil extends " "beyond nearest neighbor processor"); compute_gf_denom(); - set_grid_global(sp2); + set_grid_global(); set_grid_local(); if (overlap_allowed) break; @@ -224,7 +227,7 @@ void PPPMDipoleSpin::init() // calculate the final accuracy - double estimated_accuracy = final_accuracy_dipole(sp2); + double estimated_accuracy = final_accuracy_dipole(); // print stats @@ -310,7 +313,7 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // return if there are no spins - if (spsqsum == 0.0) return; + if (musqsum == 0.0) return; // convert atoms from box to lamda coords @@ -334,7 +337,7 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // to fully sum contribution in their 3d bricks // remap from 3d decomposition to FFT decomposition - cg_dipole->reverse_comm(this,REVERSE_SP); + cg_dipole->reverse_comm(this,REVERSE_MU); brick2fft_dipole(); // compute potential gradient on my FFT grid and @@ -347,12 +350,12 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) // all procs communicate E-field values // to fill ghost cells surrounding their 3d bricks - cg_dipole->forward_comm(this,FORWARD_SP); + cg_dipole->forward_comm(this,FORWARD_MU); // extra per-atom energy/virial communication if (evflag_atom) { - cg_peratom_dipole->forward_comm(this,FORWARD_SP_PERATOM); + cg_peratom_dipole->forward_comm(this,FORWARD_MU_PERATOM); } // calculate the force on my particles @@ -374,7 +377,7 @@ void PPPMDipoleSpin::compute(int eflag, int vflag) energy = energy_all; energy *= 0.5*volume; - energy -= spsqsum*2.0*g3/3.0/MY_PIS; + energy -= musqsum*2.0*g3/3.0/MY_PIS; energy *= spscale; } @@ -510,7 +513,7 @@ void PPPMDipoleSpin::fieldforce_ik_spin() double spx,spy,spz; double **x = atom->x; double **f = atom->f; - double **fm = atom->fm; + double **fm_long = atom->fm_long; int nlocal = atom->nlocal; @@ -548,7 +551,7 @@ void PPPMDipoleSpin::fieldforce_ik_spin() } } - // convert M-field to mech. and mag. forces + // convert M-field and store mech. forces const double spfactor = mub2mu0 * scale; spx = sp[i][0]*sp[i][3]; @@ -558,13 +561,12 @@ void PPPMDipoleSpin::fieldforce_ik_spin() f[i][1] += spfactor*(vxy*spx + vyy*spy + vyz*spz); f[i][2] += spfactor*(vxz*spx + vyz*spy + vzz*spz); + // store long-range mag. precessions + const double spfactorh = mub2mu0hbinv * scale; - fm[i][0] += spfactorh*ex; - fm[i][1] += spfactorh*ey; - fm[i][2] += spfactorh*ez; - - // create a new vector (in atom_spin style ?) to store long-range fm tables - + fm_long[i][0] += spfactorh*ex; + fm_long[i][1] += spfactorh*ey; + fm_long[i][2] += spfactorh*ez; } } @@ -708,9 +710,11 @@ void PPPMDipoleSpin::slabcorr() // add on mag. force corrections double ffact = spscale * (-4.0*MY_PI/volume); - double **fm = atom->fm; + //double **fm = atom->fm; + double **fm_long = atom->fm_long; for (int i = 0; i < nlocal; i++) { - fm[i][2] += ffact * spin_all; + //fm[i][2] += ffact * spin_all; + fm_long[i][2] += ffact * spin_all; } } @@ -723,13 +727,13 @@ void PPPMDipoleSpin::spsum_spsq() { const int nlocal = atom->nlocal; - spsum = spsqsum = sp2 = 0.0; + musum = musqsum = mu2 = 0.0; if (atom->sp_flag) { double **sp = atom->sp; double spx, spy, spz; double spsum_local(0.0), spsqsum_local(0.0); - // not exactly the good loop: need to add norm of spins + // sum (direction x norm) of all spins for (int i = 0; i < nlocal; i++) { spx = sp[i][0]*sp[i][3]; @@ -739,12 +743,14 @@ void PPPMDipoleSpin::spsum_spsq() spsqsum_local += spx*spx + spy*spy + spz*spz; } - MPI_Allreduce(&spsum_local,&spsum,1,MPI_DOUBLE,MPI_SUM,world); - MPI_Allreduce(&spsqsum_local,&spsqsum,1,MPI_DOUBLE,MPI_SUM,world); + // store results into pppm_dipole quantities - sp2 = spsqsum * mub2mu0; + MPI_Allreduce(&spsum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&spsqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + + mu2 = musqsum * mub2mu0; } - if (sp2 == 0 && comm->me == 0) + if (mu2 == 0 && comm->me == 0) error->all(FLERR,"Using kspace solver PPPMDipoleSpin on system with no spins"); } diff --git a/src/KSPACE/pppm_dipole_spin.h b/src/KSPACE/pppm_dipole_spin.h index 347006e586..8d6c5d4eb2 100644 --- a/src/KSPACE/pppm_dipole_spin.h +++ b/src/KSPACE/pppm_dipole_spin.h @@ -42,7 +42,6 @@ class PPPMDipoleSpin : public PPPMDipole { // spin - double spsum,spsqsum,sp2; void make_rho_spin(); void fieldforce_ik_spin(); void fieldforce_peratom_spin(); diff --git a/src/SPIN/atom_vec_spin.cpp b/src/SPIN/atom_vec_spin.cpp index fb2b6dd797..477da613d2 100644 --- a/src/SPIN/atom_vec_spin.cpp +++ b/src/SPIN/atom_vec_spin.cpp @@ -106,7 +106,6 @@ void AtomVecSpin::grow_reset() sp = atom->sp; fm = atom->fm; fm_long = atom->fm_long; } - /* ---------------------------------------------------------------------- copy atom I info to atom J ------------------------------------------------------------------------- */ diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index b75f03212a..996bd3c2da 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -126,6 +126,7 @@ FixNVESpin::FixNVESpin(LAMMPS *lmp, int narg, char **arg) : // initialize the magnetic interaction flags pair_spin_flag = 0; + long_spin_flag = 0; precession_spin_flag = 0; maglangevin_flag = 0; tdamp_flag = temp_flag = 0; @@ -209,8 +210,16 @@ void FixNVESpin::init() if (count != npairspin) error->all(FLERR,"Incorrect number of spin pairs"); + // set pair/spin and long/spin flags + if (npairspin >= 1) pair_spin_flag = 1; + for (int i = 0; ipair_match("spin/long",0,i)) { + long_spin_flag = 1; + } + } + // ptrs FixPrecessionSpin classes int iforce; @@ -425,6 +434,7 @@ void FixNVESpin::ComputeInteractionsSpin(int i) double **sp = atom->sp; double **fm = atom->fm; + double **fm_long = atom->fm_long; // force computation for spin i @@ -442,6 +452,14 @@ void FixNVESpin::ComputeInteractionsSpin(int i) } } + // update magnetic long-range components + + if (long_spin_flag) { + fmi[0] += fm_long[i][0]; + fmi[1] += fm_long[i][1]; + fmi[2] += fm_long[i][2]; + } + // update magnetic precession interactions if (precession_spin_flag) { diff --git a/src/SPIN/fix_nve_spin.h b/src/SPIN/fix_nve_spin.h index afc1db14d6..565de13e92 100644 --- a/src/SPIN/fix_nve_spin.h +++ b/src/SPIN/fix_nve_spin.h @@ -58,7 +58,8 @@ friend class PairSpin; int nlocal_max; // max value of nlocal (for lists size) int pair_spin_flag; // magnetic pair flags - int precession_spin_flag; // magnetic precession flags + int long_spin_flag; // magnetic long-range flag + int precession_spin_flag; // magnetic precession flags int maglangevin_flag; // magnetic langevin flags int tdamp_flag, temp_flag; diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp index ca4f3d5e24..efedea3247 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_long.cpp @@ -81,6 +81,7 @@ PairSpinLong::~PairSpinLong() if (allocated) { memory->destroy(setflag); memory->destroy(cut_spin_long); + memory->destroy(cutsq); } } @@ -97,7 +98,6 @@ void PairSpinLong::settings(int narg, char **arg) error->all(FLERR,"Spin simulations require metal unit style"); cut_spin_long_global = force->numeric(FLERR,arg[0]); - //cut_spin = force->numeric(FLERR,arg[0]); // reset cutoffs that have been explicitly set @@ -126,7 +126,7 @@ void PairSpinLong::coeff(int narg, char **arg) if (strcmp(arg[2],"long") != 0) error->all(FLERR,"Incorrect args in pair_style command"); - if (narg != 3) + if (narg < 1 || narg > 4) error->all(FLERR,"Incorrect args in pair_style command"); int ilo,ihi,jlo,jhi; @@ -197,9 +197,9 @@ void PairSpinLong::init_style() double PairSpinLong::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); - + cut_spin_long[j][i] = cut_spin_long[i][j]; - + return cut_spin_long_global; } @@ -505,7 +505,8 @@ void PairSpinLong::allocate() for (int j = i; j <= n; j++) setflag[i][j] = 0; - memory->create(cut_spin_long,n+1,n+1,"pair:cut_spin_long"); + memory->create(cut_spin_long,n+1,n+1,"pair/spin/long:cut_spin_long"); + memory->create(cutsq,n+1,n+1,"pair/spin/long:cutsq"); } /* ---------------------------------------------------------------------- diff --git a/src/atom.cpp b/src/atom.cpp index cf4d20a71e..58b00712f7 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -98,7 +98,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp) // SPIN package - sp = fm = NULL; + sp = fm = fm_long = NULL; // USER-DPD @@ -277,6 +277,7 @@ Atom::~Atom() memory->destroy(sp); memory->destroy(fm); + memory->destroy(fm_long); memory->destroy(vfrac); memory->destroy(s0); diff --git a/src/atom.h b/src/atom.h index 7e003dff5e..95c4a9c30f 100644 --- a/src/atom.h +++ b/src/atom.h @@ -65,6 +65,7 @@ class Atom : protected Pointers { double **sp; double **fm; + double **fm_long; // PERI package diff --git a/src/pair.h b/src/pair.h index f830b7c035..0b46d58782 100644 --- a/src/pair.h +++ b/src/pair.h @@ -61,7 +61,7 @@ class Pair : protected Pointers { int dispersionflag; // 1 if compatible with LJ/dispersion solver int tip4pflag; // 1 if compatible with TIP4P solver int dipoleflag; // 1 if compatible with dipole solver - int spinflag; // 1 if compatible with spin long solver + int spinflag; // 1 if compatible with spin solver int reinitflag; // 1 if compatible with fix adapt and alike int tail_flag; // pair_modify flag for LJ tail correction From 16911adcea92142dc01a550a733499fc1efea7b2 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 30 Aug 2018 07:33:25 -0600 Subject: [PATCH 0040/1242] Commit1 JT 083018 - started to work on ewald_dipole (not yet triclinic) - compiles and runs (no memory issue) - check the energy accuracy --- examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 7 +- examples/SPIN/pppm_spin/in.spin.pppm_spin | 7 +- src/KSPACE/ewald_dipole.cpp | 847 ++++++++++++++++++ src/KSPACE/ewald_dipole.h | 104 +++ src/KSPACE/pppm.cpp | 3 - src/KSPACE/pppm_dipole.cpp | 8 +- src/KSPACE/pppm_dipole_spin.cpp | 2 - 7 files changed, 963 insertions(+), 15 deletions(-) create mode 100644 src/KSPACE/ewald_dipole.cpp create mode 100644 src/KSPACE/ewald_dipole.h diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole index 804ddad1e2..c2c49e3caf 100644 --- a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole +++ b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole @@ -23,11 +23,12 @@ velocity all create 1.0 87287 #pair_coeff * * 1.0 1.0 2.5 #pair_coeff * 2 1.0 1.0 5.0 pair_style lj/cut/dipole/long 3.0 -pair_coeff * * 1.0 1.0 +pair_coeff * * 0.0 0.0 #kspace_style pppm/disp 1.0e-4 -kspace_style pppm/dipole 1.0e-4 -kspace_modify gewald/disp 0.1 +#kspace_style pppm/dipole 1.0e-4 +kspace_style ewald/dipole 1.0e-4 +kspace_modify gewald 0.1 neighbor 0.3 bin neigh_modify every 2 delay 4 check yes diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin index 87d18f4d16..f7e462c343 100644 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -11,7 +11,7 @@ boundary p p p atom_modify map array lattice hcp 2.5071 -region box block 0.0 20.0 0.0 20.0 0.0 8.0 +region box block 0.0 8.0 0.0 8.0 0.0 8.0 create_box 1 box create_atoms 1 box @@ -33,7 +33,7 @@ neighbor 0.1 bin neigh_modify every 10 check yes delay 20 kspace_style pppm/dipole/spin 1.0e-4 - +kspace_modify mesh 32 32 32 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 @@ -58,4 +58,5 @@ thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -run 20000 +#run 20000 +run 1 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp new file mode 100644 index 0000000000..d03d93a7c5 --- /dev/null +++ b/src/KSPACE/ewald_dipole.cpp @@ -0,0 +1,847 @@ +/* ---------------------------------------------------------------------- + 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) + Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "ewald_dipole.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "pair.h" +#include "domain.h" +#include "math_const.h" +#include "memory.h" +#include "error.h" +#include "update.h" + +#include "math_const.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define SMALL 0.00001 + +/* ---------------------------------------------------------------------- */ + +EwaldDipole::EwaldDipole(LAMMPS *lmp, int narg, char **arg) : Ewald(lmp, narg, arg) +{ + ewaldflag = dipoleflag = 1; + group_group_enable = 0; + muk = NULL; +} + +/* ---------------------------------------------------------------------- + free all memory +------------------------------------------------------------------------- */ + +EwaldDipole::~EwaldDipole() +{ + memory->destroy(muk); +} + +/* ---------------------------------------------------------------------- + called once before run +------------------------------------------------------------------------- */ + +void EwaldDipole::init() +{ + if (comm->me == 0) { + if (screen) fprintf(screen,"EwaldDipole initialization ...\n"); + if (logfile) fprintf(logfile,"EwaldDipole initialization ...\n"); + } + + // error check + + dipoleflag = atom->mu?1:0; + qsum_qsq(0); // q[i] might not be declared ? + + if (dipoleflag && q2) + error->all(FLERR,"Cannot (yet) use charges with Kspace style EwaldDipole"); + + triclinic_check(); + + // set triclinic to 0 for now (no triclinic calc.) + triclinic = 0; + + if (triclinic) + error->all(FLERR,"Cannot (yet) use EwaldDipole with triclinic box"); + + if (domain->dimension == 2) + error->all(FLERR,"Cannot use EwaldDipole with 2d simulation"); + + if (!atom->mu) error->all(FLERR,"Kspace style requires atom attribute mu"); +//if (!atom->q_flag) error->all(FLERR,"Kspace style requires atom attribute q"); + + if (dipoleflag && strcmp(update->unit_style,"electron") == 0) + error->all(FLERR,"Cannot (yet) use 'electron' units with dipoles"); + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with EwaldDipole"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab EwaldDipole"); + //if (domain->triclinic) + // error->all(FLERR,"Cannot (yet) use EwaldDipole with triclinic box " + // "and slab correction"); + } + + // extract short-range Coulombic cutoff from pair style + + triclinic = domain->triclinic; + if (triclinic) + error->all(FLERR,"Cannot yet use triclinic cells with EwaldDipole"); + + pair_check(); + + int itmp; + double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + if (p_cutoff == NULL) + error->all(FLERR,"KSpace style is incompatible with Pair style"); + double cutoff = *p_cutoff; + + // kspace TIP4P not yet supported + // qdist = offset only for TIP4P fictitious charge + + //qdist = 0.0; + if (tip4pflag) + error->all(FLERR,"Cannot yet use TIP4P with EwaldDipole"); + + // compute musum & musqsum and warn if no dipole + + scale = 1.0; + qqrd2e = force->qqrd2e; + musum_musq(); + natoms_original = atom->natoms; + + // set accuracy (force units) from accuracy_relative or accuracy_absolute + + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; + else accuracy = accuracy_relative * two_charge_force; + + // setup K-space resolution + + bigint natoms = atom->natoms; + + // use xprd,yprd,zprd even if triclinic so grid size is the same + // adjust z dimension for 2d slab EwaldDipole + // 3d EwaldDipole just uses zprd since slab_volfactor = 1.0 + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double zprd_slab = zprd*slab_volfactor; + + // make initial g_ewald estimate + // based on desired accuracy and real space cutoff + // fluid-occupied volume used to estimate real-space error + // zprd used rather than zprd_slab + + if (!gewaldflag) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); + if (q2 == 0.0) + error->all(FLERR,"Must use 'kspace_modify gewald' for uncharged system"); + g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); + if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; + else g_ewald = sqrt(-log(g_ewald)) / cutoff; + } + + // setup EwaldDipole coefficients so can print stats + + setup(); + + // final RMS accuracy + + double lprx = rms(kxmax_orig,xprd,natoms,q2); + double lpry = rms(kymax_orig,yprd,natoms,q2); + double lprz = rms(kzmax_orig,zprd_slab,natoms,q2); + double lpr = sqrt(lprx*lprx + lpry*lpry + lprz*lprz) / sqrt(3.0); + double q2_over_sqrt = q2 / sqrt(natoms*cutoff*xprd*yprd*zprd_slab); + double spr = 2.0 *q2_over_sqrt * exp(-g_ewald*g_ewald*cutoff*cutoff); + double tpr = estimate_table_accuracy(q2_over_sqrt,spr); + double estimated_accuracy = sqrt(lpr*lpr + spr*spr + tpr*tpr); + + // stats + + if (comm->me == 0) { + if (screen) { + fprintf(screen," G vector (1/distance) = %g\n",g_ewald); + fprintf(screen," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(screen," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(screen," KSpace vectors: actual max1d max3d = %d %d %d\n", + kcount,kmax,kmax3d); + fprintf(screen," kxmax kymax kzmax = %d %d %d\n", + kxmax,kymax,kzmax); + } + if (logfile) { + fprintf(logfile," G vector (1/distance) = %g\n",g_ewald); + fprintf(logfile," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(logfile," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(logfile," KSpace vectors: actual max1d max3d = %d %d %d\n", + kcount,kmax,kmax3d); + fprintf(logfile," kxmax kymax kzmax = %d %d %d\n", + kxmax,kymax,kzmax); + } + } +} + +/* ---------------------------------------------------------------------- + adjust EwaldDipole coeffs, called initially and whenever volume has changed +------------------------------------------------------------------------- */ + +void EwaldDipole::setup() +{ + // volume-dependent factors + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + + // adjustment of z dimension for 2d slab EwaldDipole + // 3d EwaldDipole just uses zprd since slab_volfactor = 1.0 + + double zprd_slab = zprd*slab_volfactor; + volume = xprd * yprd * zprd_slab; + + unitk[0] = 2.0*MY_PI/xprd; + unitk[1] = 2.0*MY_PI/yprd; + unitk[2] = 2.0*MY_PI/zprd_slab; + + int kmax_old = kmax; + + if (kewaldflag == 0) { + + // determine kmax + // function of current box size, accuracy, G_ewald (short-range cutoff) + + bigint natoms = atom->natoms; + double err; + kxmax = 1; + kymax = 1; + kzmax = 1; + + // set kmax in 3 directions to respect accuracy + + err = rms_dipole(kxmax,xprd,natoms); + while (err > accuracy) { + kxmax++; + err = rms_dipole(kxmax,xprd,natoms); + } + + err = rms_dipole(kxmax,xprd,natoms); + while (err > accuracy) { + kymax++; + err = rms_dipole(kxmax,xprd,natoms); + } + + err = rms_dipole(kxmax,xprd,natoms); + while (err > accuracy) { + kzmax++; + err = rms_dipole(kxmax,xprd,natoms); + } + + kmax = MAX(kxmax,kymax); + kmax = MAX(kmax,kzmax); + kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + + double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax; + double gsqymx = unitk[1]*unitk[1]*kymax*kymax; + double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax; + gsqmx = MAX(gsqxmx,gsqymx); + gsqmx = MAX(gsqmx,gsqzmx); + + kxmax_orig = kxmax; + kymax_orig = kymax; + kzmax_orig = kzmax; + + // scale lattice vectors for triclinic skew + + //if (triclinic) { + // double tmp[3]; + // tmp[0] = kxmax/xprd; + // tmp[1] = kymax/yprd; + // tmp[2] = kzmax/zprd; + // lamda2xT(&tmp[0],&tmp[0]); + // kxmax = MAX(1,static_cast(tmp[0])); + // kymax = MAX(1,static_cast(tmp[1])); + // kzmax = MAX(1,static_cast(tmp[2])); + + // kmax = MAX(kxmax,kymax); + // kmax = MAX(kmax,kzmax); + // kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + //} + + } else { + + kxmax = kx_ewald; + kymax = ky_ewald; + kzmax = kz_ewald; + + kxmax_orig = kxmax; + kymax_orig = kymax; + kzmax_orig = kzmax; + + kmax = MAX(kxmax,kymax); + kmax = MAX(kmax,kzmax); + kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + + double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax; + double gsqymx = unitk[1]*unitk[1]*kymax*kymax; + double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax; + gsqmx = MAX(gsqxmx,gsqymx); + gsqmx = MAX(gsqmx,gsqzmx); + } + + gsqmx *= 1.00001; + + // if size has grown, reallocate k-dependent and nlocal-dependent arrays + + if (kmax > kmax_old) { + deallocate(); + allocate(); + group_allocate_flag = 0; + + memory->destroy(ek); + memory->destroy3d_offset(cs,-kmax_created); + memory->destroy3d_offset(sn,-kmax_created); + memory->destroy(muk); + nmax = atom->nmax; + memory->create(ek,nmax,3,"ewald:ek"); + memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald:cs"); + memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald:sn"); + memory->create(muk,kmax3d,nmax,"ewald:muk"); + kmax_created = kmax; + } + + // pre-compute EwaldDipole coefficients + + coeffs(); + //if (triclinic == 0) + // coeffs(); + //else + // coeffs_triclinic(); +} + +/* ---------------------------------------------------------------------- + compute dipole RMS accuracy for a dimension +------------------------------------------------------------------------- */ + +double EwaldDipole::rms_dipole(int km, double prd, bigint natoms) +{ + if (natoms == 0) natoms = 1; // avoid division by zero + + // error from eq.(46), Wang et al., JCP 115, 6351 (2001) + + double value = 8*MY_PI*mu2*g_ewald/volume * + sqrt(2*MY_PI*km*km*km/(15.0*natoms)) * + exp(-MY_PI*MY_PI*km*km/(g_ewald*g_ewald*prd*prd)); + + return value; +} + +/* ---------------------------------------------------------------------- + compute the EwaldDipole long-range force, energy, virial +------------------------------------------------------------------------- */ + +void EwaldDipole::compute(int eflag, int vflag) +{ + int i,j,k; + + // set energy/virial flags + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = evflag_atom = eflag_global = vflag_global = + eflag_atom = vflag_atom = 0; + + // if atom count has changed, update qsum and qsqsum + + if (atom->natoms != natoms_original) { + //qsum_qsq(); + musum_musq(); + natoms_original = atom->natoms; + } + + // return if there are no charges + + if (qsqsum == 0.0) return; + + // extend size of per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(ek); + memory->destroy3d_offset(cs,-kmax_created); + memory->destroy3d_offset(sn,-kmax_created); + memory->destroy(muk); + nmax = atom->nmax; + memory->create(ek,nmax,3,"ewald:ek"); + memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald:cs"); + memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald:sn"); + memory->create(muk,kmax3d,nmax,"ewald:muk"); + kmax_created = kmax; + } + + // partial structure factors on each processor + // total structure factor by summing over procs + + //if (triclinic == 0) + // eik_dot_r(); + //else + // eik_dot_r_triclinic(); + eik_dot_r(); + + MPI_Allreduce(sfacrl,sfacrl_all,kcount,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(sfacim,sfacim_all,kcount,MPI_DOUBLE,MPI_SUM,world); + + // K-space portion of electric field + // double loop over K-vectors and local atoms + // perform per-atom calculations if needed + + double **f = atom->f; + double *q = atom->q; + int nlocal = atom->nlocal; + + int kx,ky,kz; + double cypz,sypz,exprl,expim,partial,partial_peratom; + + for (i = 0; i < nlocal; i++) { + ek[i][0] = 0.0; + ek[i][1] = 0.0; + ek[i][2] = 0.0; + } + + for (k = 0; k < kcount; k++) { + kx = kxvecs[k]; + ky = kyvecs[k]; + kz = kzvecs[k]; + + for (i = 0; i < nlocal; i++) { + cypz = cs[ky][1][i]*cs[kz][2][i] - sn[ky][1][i]*sn[kz][2][i]; + sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i]; + exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; + expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; + partial = expim*sfacrl_all[k] - exprl*sfacim_all[k]; + ek[i][0] += partial*eg[k][0]; + ek[i][1] += partial*eg[k][1]; + ek[i][2] += partial*eg[k][2]; + + if (evflag_atom) { + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + //if (eflag_atom) eatom[i] += q[i]*ug[k]*partial_peratom; + if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; + if (vflag_atom) + for (j = 0; j < 6; j++) + vatom[i][j] += ug[k]*vg[k][j]*partial_peratom; + } + } + } + + // convert E-field to force + + const double qscale = qqrd2e * scale; + const double muscale = qqrd2e * scale; + + for (i = 0; i < nlocal; i++) { + for (k = 0; k < kcount; k++) { + //f[i][0] += qscale * q[i]*ek[i][0]; + //f[i][1] += qscale * q[i]*ek[i][1]; + //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; + f[i][0] += muscale * muk[k][i] * ek[i][0]; + f[i][1] += muscale * muk[k][i] * ek[i][1]; + if (slabflag != 2) f[i][2] += muscale * muk[k][i] * ek[i][2]; + } + } + + // sum global energy across Kspace vevs and add in volume-dependent term + + if (eflag_global) { + for (k = 0; k < kcount; k++) + energy += ug[k] * (sfacrl_all[k]*sfacrl_all[k] + + sfacim_all[k]*sfacim_all[k]); + + energy -= g_ewald*qsqsum/MY_PIS + + MY_PI2*qsum*qsum / (g_ewald*g_ewald*volume); + energy *= qscale; + } + + // global virial + + if (vflag_global) { + double uk; + for (k = 0; k < kcount; k++) { + uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); + for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j]; + } + for (j = 0; j < 6; j++) virial[j] *= qscale; + } + + // per-atom energy/virial + // energy includes self-energy correction + + if (evflag_atom) { + if (eflag_atom) { + for (i = 0; i < nlocal; i++) { + eatom[i] -= g_ewald*q[i]*q[i]/MY_PIS + MY_PI2*q[i]*qsum / + (g_ewald*g_ewald*volume); + eatom[i] *= qscale; + } + } + + if (vflag_atom) + for (i = 0; i < nlocal; i++) + for (j = 0; j < 6; j++) vatom[i][j] *= q[i]*qscale; + } + + // 2d slab correction + + if (slabflag == 1) slabcorr(); +} + +/* ---------------------------------------------------------------------- */ + +void EwaldDipole::eik_dot_r() +{ + int i,k,l,m,n,ic; + double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; + double sqk,clpm,slpm; + double mux, muy, muz; + + double **x = atom->x; + //double *q = atom->q; + double **mu = atom->mu; + int nlocal = atom->nlocal; + + n = 0; + mux = muy = muz = 0.0; + + // loop on different k-directions + // loop on n kpoints and nlocal atoms + // store (n x nlocal) tab. of values of (mu_i dot k) + // store n values of sum_j[ (mu_j dot k) exp(-k dot r_j) ] + + // (k,0,0), (0,l,0), (0,0,m) + + // loop 1: k=1, l=1, m=1 + // define first val. of cos and sin + + for (ic = 0; ic < 3; ic++) { + sqk = (unitk[ic] * unitk[ic]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + for (i = 0; i < nlocal; i++) { + cs[0][ic][i] = 1.0; + sn[0][ic][i] = 0.0; + cs[1][ic][i] = cos(unitk[ic]*x[i][ic]); + sn[1][ic][i] = sin(unitk[ic]*x[i][ic]); + cs[-1][ic][i] = cs[1][0][i]; + sn[-1][ic][i] = -sn[1][0][i]; + muk[n][i] = (mu[i][ic]*unitk[ic]); + cstr1 += muk[n][i]*cs[1][ic][i]; + sstr1 += muk[n][i]*sn[1][ic][i]; + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + } + } + + // loop 2: k>1, l>1, m>1 + + for (m = 2; m <= kmax; m++) { + for (ic = 0; ic < 3; ic++) { + sqk = m*unitk[ic] * m*unitk[ic]; + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + for (i = 0; i < nlocal; i++) { + cs[m][ic][i] = cs[m-1][ic][i]*cs[1][ic][i] - + sn[m-1][ic][i]*sn[1][ic][i]; + sn[m][ic][i] = sn[m-1][ic][i]*cs[1][ic][i] + + cs[m-1][ic][i]*sn[1][ic][i]; + cs[-m][ic][i] = cs[m][ic][i]; + sn[-m][ic][i] = -sn[m][ic][i]; + muk[n][i] = (mu[i][ic]*m*unitk[ic]); + cstr1 += muk[n][i]*cs[1][ic][i]; + sstr1 += muk[n][i]*sn[1][ic][i]; + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + } + } + } + + // 1 = (k,l,0), 2 = (k,-l,0) + + for (k = 1; k <= kxmax; k++) { + for (l = 1; l <= kymax; l++) { + sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + mux = mu[i][0]; + muy = mu[i][1]; + + // dir 1: (k,l,0) + muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1]); + cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); + sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); + + // dir 2: (k,-l,0) + muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1]); + cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); + sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (0,l,m), 2 = (0,l,-m) + + for (l = 1; l <= kymax; l++) { + for (m = 1; m <= kzmax; m++) { + sqk = (l*unitk[1] * l*unitk[1]) + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + muy = mu[i][1]; + muz = mu[i][2]; + + // dir 1: (0,l,m) + muk[n][i] = (muy*l*unitk[1] + muz*m*unitk[2]); + cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); + sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); + + // dir 2: (0,l,-m) + muk[n+1][i] = (muy*l*unitk[1] - muz*m*unitk[2]); + cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); + sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (k,0,m), 2 = (k,0,-m) + + for (k = 1; k <= kxmax; k++) { + for (m = 1; m <= kzmax; m++) { + sqk = (k*unitk[0] * k*unitk[0]) + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + mux = mu[i][0]; + muz = mu[i][2]; + + // dir 1: (k,0,m) + muk[n][i] = (mux*k*unitk[0] + muz*m*unitk[2]); + cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); + sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); + + // dir 2: (k,0,-m) + muk[n+1][i] = (mux*k*unitk[0] - muz*m*unitk[2]); + cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); + sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (k,l,m), 2 = (k,-l,m), 3 = (k,l,-m), 4 = (k,-l,-m) + + for (k = 1; k <= kxmax; k++) { + for (l = 1; l <= kymax; l++) { + for (m = 1; m <= kzmax; m++) { + sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]) + + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + cstr3 = 0.0; + sstr3 = 0.0; + cstr4 = 0.0; + sstr4 = 0.0; + for (i = 0; i < nlocal; i++) { + mux = mu[i][0]; + muy = mu[i][1]; + muz = mu[i][2]; + + // dir 1: (k,l,m) + muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; + slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; + cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 2: (k,-l,m) + muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; + slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; + cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 3: (k,l,-m) + muk[n+2][i] = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; + slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; + cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 4: (k,-l,-m) + muk[n+3][i] = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; + slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; + cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr4 += muk[n+3][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + sfacrl[n] = cstr3; + sfacim[n++] = sstr3; + sfacrl[n] = cstr4; + sfacim[n++] = sstr4; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + Slab-geometry correction term to dampen inter-slab interactions between + periodically repeating slabs. Yields good approximation to 2D EwaldDipole if + adequate empty space is left between repeating slabs (J. Chem. Phys. + 111, 3155). Slabs defined here to be parallel to the xy plane. Also + extended to non-neutral systems (J. Chem. Phys. 131, 094107). +------------------------------------------------------------------------- */ + +void EwaldDipole::slabcorr() +{ + // compute local contribution to global dipole moment + + double *q = atom->q; + double **x = atom->x; + double zprd = domain->zprd; + int nlocal = atom->nlocal; + + double dipole = 0.0; + for (int i = 0; i < nlocal; i++) dipole += q[i]*x[i][2]; + + // sum local contributions to get global dipole moment + + double dipole_all; + MPI_Allreduce(&dipole,&dipole_all,1,MPI_DOUBLE,MPI_SUM,world); + + // need to make non-neutral systems and/or + // per-atom energy translationally invariant + + double dipole_r2 = 0.0; + if (eflag_atom || fabs(qsum) > SMALL) { + for (int i = 0; i < nlocal; i++) + dipole_r2 += q[i]*x[i][2]*x[i][2]; + + // sum local contributions + + double tmp; + MPI_Allreduce(&dipole_r2,&tmp,1,MPI_DOUBLE,MPI_SUM,world); + dipole_r2 = tmp; + } + + // compute corrections + + const double e_slabcorr = MY_2PI*(dipole_all*dipole_all - + qsum*dipole_r2 - qsum*qsum*zprd*zprd/12.0)/volume; + const double qscale = qqrd2e * scale; + + if (eflag_global) energy += qscale * e_slabcorr; + + // per-atom energy + + if (eflag_atom) { + double efact = qscale * MY_2PI/volume; + for (int i = 0; i < nlocal; i++) + eatom[i] += efact * q[i]*(x[i][2]*dipole_all - 0.5*(dipole_r2 + + qsum*x[i][2]*x[i][2]) - qsum*zprd*zprd/12.0); + } + + // add on force corrections + + double ffact = qscale * (-4.0*MY_PI/volume); + double **f = atom->f; + + for (int i = 0; i < nlocal; i++) f[i][2] += ffact * q[i]*(dipole_all - qsum*x[i][2]); +} + +/* ---------------------------------------------------------------------- + compute musum,musqsum,mu2 + called initially, when particle count changes, when dipoles are changed +------------------------------------------------------------------------- */ + +void EwaldDipole::musum_musq() +{ + const int nlocal = atom->nlocal; + + musum = musqsum = mu2 = 0.0; + if (atom->mu_flag) { + double** mu = atom->mu; + double musum_local(0.0), musqsum_local(0.0); + + for (int i = 0; i < nlocal; i++) { + musum_local += mu[i][0] + mu[i][1] + mu[i][2]; + musqsum_local += mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]; + } + + MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + + mu2 = musqsum * force->qqrd2e; + } + + if (mu2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); +} diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h new file mode 100644 index 0000000000..5cd969bbee --- /dev/null +++ b/src/KSPACE/ewald_dipole.h @@ -0,0 +1,104 @@ +/* -*- 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 KSPACE_CLASS + +KSpaceStyle(ewald/dipole,EwaldDipole) + +#else + +#ifndef LMP_EWALD_DIPOLE_H +#define LMP_EWALD_DIPOLE_H + +#include "ewald.h" + +namespace LAMMPS_NS { + +class EwaldDipole : public Ewald { + public: + EwaldDipole(class LAMMPS *, int, char **); + virtual ~EwaldDipole(); + void init(); + void setup(); + virtual void compute(int, int); + + protected: + double musum,musqsum,mu2; + double **muk; // mu_i dot k + + void musum_musq(); + double rms_dipole(int, double, bigint); + virtual void eik_dot_r(); + void slabcorr(); + + // triclinic + + //void eik_dot_r_triclinic(); + +}; + +} + +#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: Cannot use EwaldDipole with 2d simulation + +The kspace style ewald cannot be used in 2d simulations. You can use +2d EwaldDipole in a 3d simulation; see the kspace_modify command. + +E: Kspace style requires atom attribute q + +The atom style defined does not have these attributes. + +E: Cannot use nonperiodic boundaries with EwaldDipole + +For kspace style ewald, all 3 dimensions must have periodic boundaries +unless you use the kspace_modify command to define a 2d slab with a +non-periodic z dimension. + +E: Incorrect boundaries with slab EwaldDipole + +Must have periodic x,y dimensions and non-periodic z dimension to use +2d slab option with EwaldDipole. + +E: Cannot (yet) use EwaldDipole with triclinic box and slab correction + +This feature is not yet supported. + +E: KSpace style is incompatible with Pair style + +Setting a kspace style requires that a pair style with matching +long-range Coulombic or dispersion components be used. + +E: KSpace accuracy must be > 0 + +The kspace accuracy designated in the input must be greater than zero. + +E: Must use 'kspace_modify gewald' for uncharged system + +UNDOCUMENTED + +E: Cannot (yet) use K-space slab correction with compute group/group for triclinic systems + +This option is not yet supported. + +*/ diff --git a/src/KSPACE/pppm.cpp b/src/KSPACE/pppm.cpp index 8eec8e2542..694860521e 100644 --- a/src/KSPACE/pppm.cpp +++ b/src/KSPACE/pppm.cpp @@ -100,9 +100,6 @@ PPPM::PPPM(LAMMPS *lmp, int narg, char **arg) : KSpace(lmp, narg, arg), nyhi_in = nylo_in = nyhi_out = nylo_out = 0; nzhi_in = nzlo_in = nzhi_out = nzlo_out = 0; - // test - nlower = nupper = 0; - density_brick = vdx_brick = vdy_brick = vdz_brick = NULL; density_fft = NULL; u_brick = NULL; diff --git a/src/KSPACE/pppm_dipole.cpp b/src/KSPACE/pppm_dipole.cpp index 4d2b594af8..fd986f5eb1 100644 --- a/src/KSPACE/pppm_dipole.cpp +++ b/src/KSPACE/pppm_dipole.cpp @@ -126,8 +126,9 @@ void PPPMDipole::init() if (triclinic != domain->triclinic) error->all(FLERR,"Must redefine kspace_style after changing to triclinic box"); - if (domain->dimension == 2) error->all(FLERR, - "Cannot use PPPMDipole with 2d simulation"); + if (domain->dimension == 2) + error->all(FLERR,"Cannot use PPPMDipole with 2d simulation"); + if (comm->style != 0) error->universe_all(FLERR,"PPPMDipole can only currently be used with " "comm_style brick"); @@ -175,7 +176,7 @@ void PPPMDipole::init() if (tip4pflag) error->all(FLERR,"Cannot yet use TIP4P with PPPMDipole"); - // compute qsum & qsqsum and warn if not charge-neutral + // compute musum & musqsum and warn if no dipoles scale = 1.0; qqrd2e = force->qqrd2e; @@ -794,7 +795,6 @@ void PPPMDipole::deallocate_peratom() used for charge accumulation, FFTs, and electric field interpolation ------------------------------------------------------------------------- */ -//void PPPMDipole::set_grid_global(double dipole2) void PPPMDipole::set_grid_global() { // use xprd,yprd,zprd diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index a5aee7150c..aa85c5d289 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -710,10 +710,8 @@ void PPPMDipoleSpin::slabcorr() // add on mag. force corrections double ffact = spscale * (-4.0*MY_PI/volume); - //double **fm = atom->fm; double **fm_long = atom->fm_long; for (int i = 0; i < nlocal; i++) { - //fm[i][2] += ffact * spin_all; fm_long[i][2] += ffact * spin_all; } } From 634ed487a5048b72147acdb09443218a5386fd60 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Tue, 4 Sep 2018 22:43:55 -0500 Subject: [PATCH 0041/1242] Use pkg-config to find kim-api-v2 library settings --- lib/kim/Makefile.lammps | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/lib/kim/Makefile.lammps b/lib/kim/Makefile.lammps index c7c9d9fd2f..1c2ab417d5 100644 --- a/lib/kim/Makefile.lammps +++ b/lib/kim/Makefile.lammps @@ -5,8 +5,6 @@ # The KIM API package can be downloaded from https://openkim.org/kim-api # Follow the instructions in the INSTALL file to build and install the # KIM API. Add the openkim.org Models you are interested in using. -# Make sure the directory where the "kim-api-build-conifg" utility is -# located is on the PATH. # # As long as you have followed the KIM API build and install instructions, # there should not be any reason to change this file. @@ -15,18 +13,5 @@ # Settings that the LAMMPS build will import when this package is installed - -include ../../lib/kim/Makefile.KIM_DIR - -ifeq ($(wildcard $(KIM_INSTALL_DIR)/bin/kim-api-v2-build-config),) - KIM_CONFIG_HELPER = kim-api-v2-build-config -else - KIM_CONFIG_HELPER = $(KIM_INSTALL_DIR)/bin/kim-api-v2-build-config -endif -ifeq ($(shell $(KIM_CONFIG_HELPER) --version 2> /dev/null),) - $(error $(KIM_CONFIG_HELPER) utility is not available. Something is wrong with your KIM API package setup) -endif - -kim_SYSINC = $(shell $(KIM_CONFIG_HELPER) --includes) -kim_SYSLIB = $(shell $(KIM_CONFIG_HELPER) --ldlibs) -kim_SYSPATH = $(shell $(KIM_CONFIG_HELPER) --ldflags) +kim_SYSINC = $(shell pkg-config --cflags libkim-api-v2) +kim_SYSLIB = $(shell pkg-config --libs libkim-api-v2) From e6b5112ddc80ed86a97ed05176aae2b01ccb9e8b Mon Sep 17 00:00:00 2001 From: "Stan Gerald Moore (stamoor)" Date: Thu, 13 Sep 2018 14:36:54 -0600 Subject: [PATCH 0042/1242] Fix issues in ewald_dipole --- src/KSPACE/ewald_dipole.cpp | 86 +++++++++++++++++++++++++++++++------ src/KSPACE/ewald_dipole.h | 3 ++ 2 files changed, 75 insertions(+), 14 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index d03d93a7c5..43c4717096 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -28,6 +28,7 @@ #include "pair.h" #include "domain.h" #include "math_const.h" +#include "math_special.h" #include "memory.h" #include "error.h" #include "update.h" @@ -37,6 +38,7 @@ using namespace LAMMPS_NS; using namespace MathConst; +using namespace MathSpecial; #define SMALL 0.00001 @@ -157,13 +159,11 @@ void EwaldDipole::init() // zprd used rather than zprd_slab if (!gewaldflag) { - if (accuracy <= 0.0) - error->all(FLERR,"KSpace accuracy must be > 0"); - if (q2 == 0.0) - error->all(FLERR,"Must use 'kspace_modify gewald' for uncharged system"); - g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*q2); - if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; - else g_ewald = sqrt(-log(g_ewald)) / cutoff; + double g_ewald_new = + NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + if (g_ewald_new > 0.0) g_ewald = g_ewald_new; + else error->warning(FLERR,"Ewald/disp Newton solver failed, " + "using old method to estimate g_ewald"); } // setup EwaldDipole coefficients so can print stats @@ -252,16 +252,16 @@ void EwaldDipole::setup() err = rms_dipole(kxmax,xprd,natoms); } - err = rms_dipole(kxmax,xprd,natoms); + err = rms_dipole(kymax,yprd,natoms); while (err > accuracy) { kymax++; - err = rms_dipole(kxmax,xprd,natoms); + err = rms_dipole(kymax,yprd,natoms); } - err = rms_dipole(kxmax,xprd,natoms); + err = rms_dipole(kzmax,zprd,natoms); while (err > accuracy) { kzmax++; - err = rms_dipole(kxmax,xprd,natoms); + err = rms_dipole(kzmax,zprd,natoms); } kmax = MAX(kxmax,kymax); @@ -387,7 +387,7 @@ void EwaldDipole::compute(int eflag, int vflag) // return if there are no charges - if (qsqsum == 0.0) return; + if (musqsum == 0.0) return; // extend size of per-atom arrays if necessary @@ -482,8 +482,8 @@ void EwaldDipole::compute(int eflag, int vflag) energy += ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); - energy -= g_ewald*qsqsum/MY_PIS + - MY_PI2*qsum*qsum / (g_ewald*g_ewald*volume); + const double g3 = g_ewald*g_ewald*g_ewald; + energy -= musqsum*2.0*g3/3.0/MY_PIS; energy *= qscale; } @@ -845,3 +845,61 @@ void EwaldDipole::musum_musq() if (mu2 == 0 && comm->me == 0) error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); } + +/* ---------------------------------------------------------------------- + Newton solver used to find g_ewald for LJ systems +------------------------------------------------------------------------- */ + +double EwaldDipole::NewtonSolve(double x, double Rc, + bigint natoms, double vol, double b2) +{ + double dx,tol; + int maxit; + + maxit = 10000; //Maximum number of iterations + tol = 0.00001; //Convergence tolerance + + //Begin algorithm + + for (int i = 0; i < maxit; i++) { + dx = f(x,Rc,natoms,vol,b2) / derivf(x,Rc,natoms,vol,b2); + x = x - dx; //Update x + if (fabs(dx) < tol) return x; + if (x < 0 || x != x) // solver failed + return -1; + } + return -1; +} + +/* ---------------------------------------------------------------------- + Calculate f(x) + ------------------------------------------------------------------------- */ + +double EwaldDipole::f(double x, double Rc, bigint natoms, double vol, double b2) +{ + double a = Rc*x; + double f = 0.0; + + double rg2 = a*a; + double rg4 = rg2*rg2; + double rg6 = rg4*rg2; + double Cc = 4.0*rg4 + 6.0*rg2 + 3.0; + double Dc = 8.0*rg6 + 20.0*rg4 + 30.0*rg2 + 15.0; + f = (b2/(sqrt(vol*powint(x,4)*powint(Rc,9)*natoms)) * + sqrt(13.0/6.0*Cc*Cc + 2.0/15.0*Dc*Dc - 13.0/15.0*Cc*Dc) * + exp(-rg2)) - accuracy; + + return f; +} + +/* ---------------------------------------------------------------------- + Calculate numerical derivative f'(x) + ------------------------------------------------------------------------- */ + +double EwaldDipole::derivf(double x, double Rc, + bigint natoms, double vol, double b2) +{ + double h = 0.000001; //Derivative step-size + return (f(x + h,Rc,natoms,vol,b2) - f(x,Rc,natoms,vol,b2)) / h; +} + diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index 5cd969bbee..77f6a2817c 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -40,6 +40,9 @@ class EwaldDipole : public Ewald { double rms_dipole(int, double, bigint); virtual void eik_dot_r(); void slabcorr(); + double NewtonSolve(double, double, bigint, double, double); + double f(double, double, bigint, double, double); + double derivf(double, double, bigint, double, double); // triclinic From a76457ef22d0864b78dc4b48f1c249a3fd153a47 Mon Sep 17 00:00:00 2001 From: "Stan Gerald Moore (stamoor)" Date: Fri, 14 Sep 2018 13:05:48 -0600 Subject: [PATCH 0043/1242] Fix bug in ewald_dipole structure factor --- src/KSPACE/ewald_dipole.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 43c4717096..d7c3aad206 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -584,8 +584,8 @@ void EwaldDipole::eik_dot_r() cs[-m][ic][i] = cs[m][ic][i]; sn[-m][ic][i] = -sn[m][ic][i]; muk[n][i] = (mu[i][ic]*m*unitk[ic]); - cstr1 += muk[n][i]*cs[1][ic][i]; - sstr1 += muk[n][i]*sn[1][ic][i]; + cstr1 += muk[n][i]*cs[m][ic][i]; + sstr1 += muk[n][i]*sn[m][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; From 82a5346ab1f1ddfa8ad114a7dceff47d0cdbe0ee Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 14 Sep 2018 15:09:59 -0600 Subject: [PATCH 0044/1242] Commit JT 091418 - created pair_spin_long_qsymp - modified ewald_dipole --- examples/SPIN/pppm_spin/in.spin.pppm_spin | 7 +- src/KSPACE/ewald_dipole.cpp | 100 ++-- src/KSPACE/ewald_dipole.h | 6 +- src/SPIN/fix_nve_spin.cpp | 17 +- src/SPIN/fix_nve_spin.h | 1 - src/SPIN/pair_spin_long.cpp | 24 +- src/SPIN/pair_spin_long_qsymp.cpp | 655 ++++++++++++++++++++++ src/SPIN/pair_spin_long_qsymp.h | 100 ++++ 8 files changed, 828 insertions(+), 82 deletions(-) create mode 100644 src/SPIN/pair_spin_long_qsymp.cpp create mode 100644 src/SPIN/pair_spin_long_qsymp.h diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin index f7e462c343..9e57797f55 100644 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -23,17 +23,20 @@ mass 1 58.93 set group all spin 1.72 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * spin/long long 8.0 +pair_coeff * * spin/long/qsymp long 8.0 +#pair_coeff * * spin/long long 8.0 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 kspace_style pppm/dipole/spin 1.0e-4 kspace_modify mesh 32 32 32 + #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index d03d93a7c5..3b3e3b93db 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -79,9 +79,9 @@ void EwaldDipole::init() triclinic_check(); - // set triclinic to 0 for now (no triclinic calc.) - triclinic = 0; - + // no triclinic ewald dipole (yet) + + triclinic = domain->triclinic; if (triclinic) error->all(FLERR,"Cannot (yet) use EwaldDipole with triclinic box"); @@ -100,9 +100,6 @@ void EwaldDipole::init() if (domain->xperiodic != 1 || domain->yperiodic != 1 || domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) error->all(FLERR,"Incorrect boundaries with slab EwaldDipole"); - //if (domain->triclinic) - // error->all(FLERR,"Cannot (yet) use EwaldDipole with triclinic box " - // "and slab correction"); } // extract short-range Coulombic cutoff from pair style @@ -278,23 +275,6 @@ void EwaldDipole::setup() kymax_orig = kymax; kzmax_orig = kzmax; - // scale lattice vectors for triclinic skew - - //if (triclinic) { - // double tmp[3]; - // tmp[0] = kxmax/xprd; - // tmp[1] = kymax/yprd; - // tmp[2] = kzmax/zprd; - // lamda2xT(&tmp[0],&tmp[0]); - // kxmax = MAX(1,static_cast(tmp[0])); - // kymax = MAX(1,static_cast(tmp[1])); - // kzmax = MAX(1,static_cast(tmp[2])); - - // kmax = MAX(kxmax,kymax); - // kmax = MAX(kmax,kzmax); - // kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; - //} - } else { kxmax = kx_ewald; @@ -340,10 +320,6 @@ void EwaldDipole::setup() // pre-compute EwaldDipole coefficients coeffs(); - //if (triclinic == 0) - // coeffs(); - //else - // coeffs_triclinic(); } /* ---------------------------------------------------------------------- @@ -380,7 +356,6 @@ void EwaldDipole::compute(int eflag, int vflag) // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - //qsum_qsq(); musum_musq(); natoms_original = atom->natoms; } @@ -407,10 +382,6 @@ void EwaldDipole::compute(int eflag, int vflag) // partial structure factors on each processor // total structure factor by summing over procs - //if (triclinic == 0) - // eik_dot_r(); - //else - // eik_dot_r_triclinic(); eik_dot_r(); MPI_Allreduce(sfacrl,sfacrl_all,kcount,MPI_DOUBLE,MPI_SUM,world); @@ -421,7 +392,8 @@ void EwaldDipole::compute(int eflag, int vflag) // perform per-atom calculations if needed double **f = atom->f; - double *q = atom->q; + //double *q = atom->q; + double **mu = atom->mu; int nlocal = atom->nlocal; int kx,ky,kz; @@ -439,21 +411,34 @@ void EwaldDipole::compute(int eflag, int vflag) kz = kzvecs[k]; for (i = 0; i < nlocal; i++) { + + // calculating exp(i*k*ri) + cypz = cs[ky][1][i]*cs[kz][2][i] - sn[ky][1][i]*sn[kz][2][i]; sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i]; exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; + + // taking im-part of struct_fact x exp(i*k*ri) (for force calc.) + partial = expim*sfacrl_all[k] - exprl*sfacim_all[k]; - ek[i][0] += partial*eg[k][0]; - ek[i][1] += partial*eg[k][1]; - ek[i][2] += partial*eg[k][2]; + //ek[i][0] += partial*eg[k][0]; + //ek[i][1] += partial*eg[k][1]; + //ek[i][2] += partial*eg[k][2]; + ek[i][0] += kx*partial*eg[k][0]; + ek[i][1] += ky*partial*eg[k][1]; + ek[i][2] += kz*partial*eg[k][2]; if (evflag_atom) { + + // taking re-part of struct_fact x exp(i*k*ri) (for energy calc.) + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; //if (eflag_atom) eatom[i] += q[i]*ug[k]*partial_peratom; if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) + // to be done vatom[i][j] += ug[k]*vg[k][j]*partial_peratom; } } @@ -461,30 +446,33 @@ void EwaldDipole::compute(int eflag, int vflag) // convert E-field to force - const double qscale = qqrd2e * scale; + //const double qscale = qqrd2e * scale; const double muscale = qqrd2e * scale; for (i = 0; i < nlocal; i++) { - for (k = 0; k < kcount; k++) { - //f[i][0] += qscale * q[i]*ek[i][0]; - //f[i][1] += qscale * q[i]*ek[i][1]; - //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; - f[i][0] += muscale * muk[k][i] * ek[i][0]; - f[i][1] += muscale * muk[k][i] * ek[i][1]; - if (slabflag != 2) f[i][2] += muscale * muk[k][i] * ek[i][2]; - } + //f[i][0] += qscale * q[i]*ek[i][0]; + //f[i][1] += qscale * q[i]*ek[i][1]; + //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; + f[i][0] += muscale * mu[i][0] * ek[i][0]; + f[i][1] += muscale * mu[i][1] * ek[i][1]; + if (slabflag != 2) f[i][2] += muscale * mu[i][2] * ek[i][2]; } // sum global energy across Kspace vevs and add in volume-dependent term if (eflag_global) { - for (k = 0; k < kcount; k++) + for (k = 0; k < kcount; k++) { + + // taking the re-part of struct_fact_i x struct_fact_j + energy += ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); + } - energy -= g_ewald*qsqsum/MY_PIS + - MY_PI2*qsum*qsum / (g_ewald*g_ewald*volume); - energy *= qscale; + // substracting self energy and scaling + + energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy *= muscale; } // global virial @@ -495,7 +483,8 @@ void EwaldDipole::compute(int eflag, int vflag) uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j]; } - for (j = 0; j < 6; j++) virial[j] *= qscale; + //for (j = 0; j < 6; j++) virial[j] *= qscale; + for (j = 0; j < 6; j++) virial[j] *= muscale; } // per-atom energy/virial @@ -504,9 +493,9 @@ void EwaldDipole::compute(int eflag, int vflag) if (evflag_atom) { if (eflag_atom) { for (i = 0; i < nlocal; i++) { - eatom[i] -= g_ewald*q[i]*q[i]/MY_PIS + MY_PI2*q[i]*qsum / - (g_ewald*g_ewald*volume); - eatom[i] *= qscale; + eatom[i] -= (mu[i][0]*mu[i][0] + mu[i][1]*mu[i][1] + mu[i][2]*mu[i][2]) + *2.0*g3/3.0/MY_PIS; + eatom[i] *= muscale; } } @@ -520,7 +509,9 @@ void EwaldDipole::compute(int eflag, int vflag) if (slabflag == 1) slabcorr(); } -/* ---------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + compute the +------------------------------------------------------------------------- */ void EwaldDipole::eik_dot_r() { @@ -530,7 +521,6 @@ void EwaldDipole::eik_dot_r() double mux, muy, muz; double **x = atom->x; - //double *q = atom->q; double **mu = atom->mu; int nlocal = atom->nlocal; diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index 5cd969bbee..401742ed3a 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -34,17 +34,13 @@ class EwaldDipole : public Ewald { protected: double musum,musqsum,mu2; - double **muk; // mu_i dot k + double **muk; // store mu_i dot k void musum_musq(); double rms_dipole(int, double, bigint); virtual void eik_dot_r(); void slabcorr(); - // triclinic - - //void eik_dot_r_triclinic(); - }; } diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 996bd3c2da..5e972cd14d 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -295,6 +295,13 @@ void FixNVESpin::initial_integrate(int vflag) } } + // update fm_kspace if long-range + // remove short-range comp. of fm_kspace + + if (long_spin_flag) { + + } + // update half s for all atoms if (sector_flag) { // sectoring seq. update @@ -434,7 +441,7 @@ void FixNVESpin::ComputeInteractionsSpin(int i) double **sp = atom->sp; double **fm = atom->fm; - double **fm_long = atom->fm_long; + //double **fm_long = atom->fm_long; // force computation for spin i @@ -452,14 +459,6 @@ void FixNVESpin::ComputeInteractionsSpin(int i) } } - // update magnetic long-range components - - if (long_spin_flag) { - fmi[0] += fm_long[i][0]; - fmi[1] += fm_long[i][1]; - fmi[2] += fm_long[i][2]; - } - // update magnetic precession interactions if (precession_spin_flag) { diff --git a/src/SPIN/fix_nve_spin.h b/src/SPIN/fix_nve_spin.h index 565de13e92..9fcbfb3803 100644 --- a/src/SPIN/fix_nve_spin.h +++ b/src/SPIN/fix_nve_spin.h @@ -48,7 +48,6 @@ friend class PairSpin; int lattice_flag; // lattice_flag = 0 if spins only // lattice_flag = 1 if spin-lattice calc. - protected: int sector_flag; // sector_flag = 0 if serial algorithm // sector_flag = 1 if parallel algorithm diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_long.cpp index efedea3247..d7ecdf5edd 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_long.cpp @@ -362,13 +362,15 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) int i,j,jj,jnum,itype,jtype; double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; - double bij[4],xi[3],rij[3],spi[4],spj[4]; + double bij[4],xi[3],rij[3]; + double spi[4],spj[4]; double local_cut2; double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; double **x = atom->x; double **sp = atom->sp; + double **fm_long = atom->fm_long; int *type = atom->type; ilist = list->ilist; @@ -433,15 +435,16 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) } } - // force accumulation + // adding the kspace components to fm + + fmi[0] += fm_long[i][0]; + fmi[1] += fm_long[i][1]; + fmi[2] += fm_long[i][2]; - fmi[0] *= mub2mu0hbinv; - fmi[1] *= mub2mu0hbinv; - fmi[2] *= mub2mu0hbinv; } /* ---------------------------------------------------------------------- - compute exchange interaction between spins i and j + compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ void PairSpinLong::compute_long(int i, int j, double rij[3], @@ -456,13 +459,14 @@ void PairSpinLong::compute_long(int i, int j, double rij[3], b1 = bij[1]; b2 = bij[2]; - fmi[0] += gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); - fmi[1] += gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); - fmi[2] += gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); + fmi[0] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); + fmi[1] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); + fmi[2] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); } /* ---------------------------------------------------------------------- - compute the mechanical force due to the exchange interaction between atom i and atom j + compute the mechanical force due to the dipolar interaction between + atom i and atom j ------------------------------------------------------------------------- */ void PairSpinLong::compute_long_mech(int i, int j, double rij[3], diff --git a/src/SPIN/pair_spin_long_qsymp.cpp b/src/SPIN/pair_spin_long_qsymp.cpp new file mode 100644 index 0000000000..3b499d0ef7 --- /dev/null +++ b/src/SPIN/pair_spin_long_qsymp.cpp @@ -0,0 +1,655 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + 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) + Aidan Thompson (SNL) + + Please cite the related publication: + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include + +#include "pair_spin_long_qsymp.h" +#include "atom.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "fix_nve_spin.h" +#include "force.h" +#include "kspace.h" +#include "math_const.h" +#include "memory.h" +#include "modify.h" +#include "error.h" +#include "update.h" + + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define EWALD_F 1.12837917 +#define EWALD_P 0.3275911 +#define A1 0.254829592 +#define A2 -0.284496736 +#define A3 1.421413741 +#define A4 -1.453152027 +#define A5 1.061405429 + +/* ---------------------------------------------------------------------- */ + +PairSpinLongQsymp::PairSpinLongQsymp(LAMMPS *lmp) : PairSpin(lmp), +lockfixnvespin(NULL) +{ + single_enable = 0; + ewaldflag = pppmflag = spinflag = 1; + respa_enable = 0; + no_virial_fdotr_compute = 1; + lattice_flag = 0; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + +} + +/* ---------------------------------------------------------------------- + free all arrays +------------------------------------------------------------------------- */ + +PairSpinLongQsymp::~PairSpinLongQsymp() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cut_spin_long); + memory->destroy(cutsq); + } +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::settings(int narg, char **arg) +{ + if (narg < 1 || narg > 2) + error->all(FLERR,"Incorrect args in pair_style command"); + + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Spin simulations require metal unit style"); + + cut_spin_long_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+1; j <= atom->ntypes; j++) { + if (setflag[i][j]) { + cut_spin_long[i][j] = cut_spin_long_global; + } + } + } + } + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::coeff(int narg, char **arg) +{ + if (!allocated) allocate(); + + // check if args correct + + if (strcmp(arg[2],"long") != 0) + error->all(FLERR,"Incorrect args in pair_style command"); + if (narg < 1 || narg > 4) + error->all(FLERR,"Incorrect args in pair_style command"); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double spin_long_cut_one = force->numeric(FLERR,arg[3]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + cut_spin_long[i][j] = spin_long_cut_one; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::init_style() +{ + if (!atom->sp_flag) + error->all(FLERR,"Pair spin requires atom/spin style"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // checking if nve/spin is a listed fix + + int ifix = 0; + while (ifix < modify->nfix) { + if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + ifix++; + } + if (ifix == modify->nfix) + error->all(FLERR,"pair/spin style requires nve/spin"); + + // get the lattice_flag from nve/spin + + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { + lockfixnvespin = (FixNVESpin *) modify->fix[i]; + lattice_flag = lockfixnvespin->lattice_flag; + } + } + + // insure use of KSpace long-range solver, set g_ewald + + if (force->kspace == NULL) + error->all(FLERR,"Pair style requires a KSpace style"); + + g_ewald = force->kspace->g_ewald; + +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSpinLongQsymp::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + cut_spin_long[j][i] = cut_spin_long[i][j]; + + return cut_spin_long_global; +} + +/* ---------------------------------------------------------------------- + extract the larger cutoff if "cut" or "cut_coul" +------------------------------------------------------------------------- */ + +void *PairSpinLongQsymp::extract(const char *str, int &dim) +{ + if (strcmp(str,"cut") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"ewald_order") == 0) { + ewald_order = 0; + ewald_order |= 1<<1; + ewald_order |= 1<<3; + dim = 0; + return (void *) &ewald_order; + } else if (strcmp(str,"ewald_mix") == 0) { + dim = 0; + return (void *) &mix_flag; + } + return NULL; +} + +/* ---------------------------------------------------------------------- */ + +void PairSpinLongQsymp::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double r,rinv,r2inv,rsq; + double grij,expm2,t,erfc,erf; + double sjdotr,gigj; + double bij[4]; + double cij[4]; + double evdwl,ecoul; + double xi[3],rij[3]; + double spi[4],spj[4],fi[3],fmi[3]; + double fmx_erf_s,fmy_erf_s,fmz_erf_s; + double local_cut2; + double pre1,pre2,pre3; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double **fm = atom->fm; + double **fm_long = atom->fm_long; + double **sp = atom->sp; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over atoms and their neighbors + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + itype = type[i]; + + for (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]; + spj[3] = sp[j][3]; + + evdwl = 0.0; + + fi[0] = fi[1] = fi[2] = 0.0; + fmi[0] = fmi[1] = fmi[2] = 0.0; + fmx_erf_s = fmy_erf_s = fmz_erf_s = 0.0; + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + cij[0] = cij[1] = cij[2] = cij[3] = 0.0; + + 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]; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + + r = sqrt(rsq); + grij = g_ewald * r; + expm2 = exp(-grij*grij); + t = 1.0 / (1.0 + EWALD_P*grij); + erfc = t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + erf = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + // evaluating erfc for mech. force and energy calc. + + bij[0] = erfc * rinv; + bij[1] = (bij[0] + pre1*expm2) * r2inv; + bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + compute_long(i,j,rij,bij,fmi,spi,spj); + compute_long_mech(i,j,rij,bij,fmi,spi,spj); + + // evaluating erf comp. for fm_kspace correction + + cij[0] = erf * rinv; + cij[1] = (bij[0] + pre1*expm2) * r2inv; + cij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + //cij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + gigj = spi[3] * spj[3]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + // evaluating short-range correction to the kspace part on [0,rc] + + fmx_erf_s += gigj * (cij[2] * sjdotr * rij[0] - cij[1] * spj[0]); + fmy_erf_s += gigj * (cij[2] * sjdotr * rij[1] - cij[1] * spj[1]); + fmz_erf_s += gigj * (cij[2] * sjdotr * rij[2] - cij[1] * spj[2]); + + } + + // force accumulation + + f[i][0] += fi[0] * mub2mu0; + f[i][1] += fi[1] * mub2mu0; + f[i][2] += fi[2] * mub2mu0; + fm[i][0] += fmi[0] * mub2mu0hbinv; + fm[i][1] += fmi[1] * mub2mu0hbinv; + fm[i][2] += fmi[2] * mub2mu0hbinv; + + // correction of the fm_kspace + + fm_long[i][0] -= mub2mu0hbinv * fmx_erf_s; + fm_long[i][1] -= mub2mu0hbinv * fmy_erf_s; + fm_long[i][2] -= mub2mu0hbinv * fmz_erf_s; + + if (newton_pair || j < nlocal) { + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; + f[j][2] -= fi[2]; + } + + if (eflag) { + if (rsq <= local_cut2) { + 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],rij[0],rij[1],rij[2]); + + } + } +} + +/* ---------------------------------------------------------------------- + update the pair interaction fmi acting on the spin ii + adding 1/r (for r in [0,rc]) contribution to the pair + removing erf(r)/r (for r in [0,rc]) from the kspace force +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) +{ + int i,j,jj,jnum,itype,jtype; + double r,rinv,r2inv,r3inv,rsq; + double grij,expm2,t,erf; + double sjdotr,sjdotrr3inv; + double b1,b2,gigj; + double bij[4],xi[3],rij[3]; + double spi[4],spj[4]; + double local_cut2; + double pre1,pre2,pre3; + int *ilist,*jlist,*numneigh,**firstneigh; + //double fmx_erf_s,fmy_erf_s,fmz_erf_s; + double fmx_s,fmy_s,fmz_s; + //double fmx_long,fmy_long,fmz_long; + + double **x = atom->x; + double **sp = atom->sp; + double **fm_long = atom->fm_long; + int *type = atom->type; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + pre1 = 2.0 * g_ewald / MY_PIS; + pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; + pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; + + // computation of the exchange interaction + // loop over neighbors of atom i + + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + itype = type[i]; + + //fmx_long = fmy_long = fmz_long = 0.0; + //fmx_erf_s = fmy_erf_s = fmz_erf_s = 0.0; + fmx_s = fmy_s = fmz_s = 0.0; + + for (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]; + spj[3] = sp[j][3]; + + bij[0] = bij[1] = bij[2] = bij[3] = 0.0; + + 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]; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + + r = sqrt(rsq); + //grij = g_ewald * r; + //expm2 = exp(-grij*grij); + //t = 1.0 / (1.0 + EWALD_P*grij); + + // evaluating erf instead of erfc + + //erf = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; + + //bij[0] = erf * rinv; + //bij[1] = (bij[0] + pre1*expm2) * r2inv; + //bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; + //bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; + + //gigj = spi[3] * spj[3]; + //sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + //b1 = bij[1]; + //b2 = bij[2]; + + // evaluating short-range correction to the kspace part on [0,rc] + + //fmx_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[0] - b1 * spj[0]); + //fmy_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[1] - b1 * spj[1]); + //fmz_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[2] - b1 * spj[2]); + + // evaluating real dipolar interaction on [0,rc] + + sjdotrr3inv = 3.0 * sjdotr * r3inv; + fmx_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[0] - sp[i][0]/r3inv); + fmy_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[1] - sp[i][1]/r3inv); + fmz_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[2] - sp[i][2]/r3inv); + + } + } + + // removing short-range erf function from kspace force + + //fmx_long = fm_long[i][0] - fmx_erf_s; + //fmy_long = fm_long[i][1] - fmy_erf_s; + //fmz_long = fm_long[i][2] - fmz_erf_s; + + // adding truncated kspace force and short-range full force + + //fmi[0] += fmx_s + fmx_long; + //fmi[1] += fmy_s + fmy_long; + //fmi[2] += fmz_s + fmz_long; + fmi[0] += (fmx_s + fm_long[i][0]); + fmi[1] += (fmy_s + fm_long[i][1]); + fmi[2] += (fmz_s + fm_long[i][2]); +} + +/* ---------------------------------------------------------------------- + compute dipolar interaction between spins i and j +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::compute_long(int i, int j, double rij[3], + double bij[4], double fmi[3], double spi[4], double spj[4]) +{ + double sjdotr; + double b1,b2,gigj; + + gigj = spi[3] * spj[3]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + b1 = bij[1]; + b2 = bij[2]; + + fmi[0] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); + fmi[1] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); + fmi[2] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); +} + +/* ---------------------------------------------------------------------- + compute the mechanical force due to the dipolar interaction between + atom i and atom j +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::compute_long_mech(int i, int j, double rij[3], + double bij[4], double fi[3], double spi[3], double spj[3]) +{ + double sdots,sidotr,sjdotr,b2,b3; + double g1,g2,g1b2_g2b3,gigj; + + gigj = spi[3] * spj[3]; + sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + b2 = bij[2]; + b3 = bij[3]; + g1 = sdots; + g2 = -sidotr*sjdotr; + g1b2_g2b3 = g1*b2 + g2*b3; + + fi[0] += gigj * (rij[0] * g1b2_g2b3 + + b2 * (sjdotr*spi[0] + sidotr*spj[0])); + fi[1] += gigj * (rij[1] * g1b2_g2b3 + + b2 * (sjdotr*spi[1] + sidotr*spj[1])); + fi[2] += gigj * (rij[2] * g1b2_g2b3 + + b2 * (sjdotr*spi[2] + sidotr*spj[2])); +} + + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::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(cut_spin_long,n+1,n+1,"pair/spin/long:cut_spin_long"); + memory->create(cutsq,n+1,n+1,"pair/spin/long:cutsq"); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::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(&cut_spin_long[i][j],sizeof(int),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::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(&cut_spin_long[i][j],sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::write_restart_settings(FILE *fp) +{ + fwrite(&cut_spin_long_global,sizeof(double),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinLongQsymp::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_spin_long_global,sizeof(double),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); +} diff --git a/src/SPIN/pair_spin_long_qsymp.h b/src/SPIN/pair_spin_long_qsymp.h new file mode 100644 index 0000000000..ae8c5a3864 --- /dev/null +++ b/src/SPIN/pair_spin_long_qsymp.h @@ -0,0 +1,100 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + 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(spin/long/qsymp,PairSpinLongQsymp) + +#else + +#ifndef LMP_PAIR_SPIN_LONG_QSYMP_H +#define LMP_PAIR_SPIN_LONG_QSYMP_H + +#include "pair_spin.h" + +namespace LAMMPS_NS { + +class PairSpinLongQsymp : public PairSpin { + public: + double cut_coul; + double **sigma; + + PairSpinLongQsymp(class LAMMPS *); + ~PairSpinLongQsymp(); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + void init_style(); + void *extract(const char *, int &); + + void compute(int, int); + void compute_single_pair(int, double *); + + void compute_long(int, int, double *, double *, double *, + double *, double *); + void compute_long_mech(int, int, double *, double *, double *, + double *, double *); + + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + + double cut_spin_long_global; // global long cutoff distance + + protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force + + double **cut_spin_long; // cutoff distance long + + double g_ewald; + int ewald_order; + + int lattice_flag; // flag for mech force computation + class FixNVESpin *lockfixnvespin; // ptr for setups + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args in pair_style command + +Self-explanatory. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair dipole/long requires atom attributes q, mu, torque + +The atom style defined does not have these attributes. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Pair style requires a KSpace style + +No kspace style is defined. + +*/ From b9e33e631f81fac627b09fefcb0e285b1148668c Mon Sep 17 00:00:00 2001 From: "Stan Gerald Moore (stamoor)" Date: Sat, 15 Sep 2018 13:34:24 -0600 Subject: [PATCH 0045/1242] Fix bug in ewald_dipole forces --- src/KSPACE/ewald_dipole.cpp | 84 ++++++++++++++++++------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index d7c3aad206..f5746ec31c 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -443,7 +443,7 @@ void EwaldDipole::compute(int eflag, int vflag) sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i]; exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; - partial = expim*sfacrl_all[k] - exprl*sfacim_all[k]; + partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial*eg[k][0]; ek[i][1] += partial*eg[k][1]; ek[i][2] += partial*eg[k][2]; @@ -465,14 +465,12 @@ void EwaldDipole::compute(int eflag, int vflag) const double muscale = qqrd2e * scale; for (i = 0; i < nlocal; i++) { - for (k = 0; k < kcount; k++) { - //f[i][0] += qscale * q[i]*ek[i][0]; - //f[i][1] += qscale * q[i]*ek[i][1]; - //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; - f[i][0] += muscale * muk[k][i] * ek[i][0]; - f[i][1] += muscale * muk[k][i] * ek[i][1]; - if (slabflag != 2) f[i][2] += muscale * muk[k][i] * ek[i][2]; - } + //f[i][0] += qscale * q[i]*ek[i][0]; + //f[i][1] += qscale * q[i]*ek[i][1]; + //if (slabflag != 2) f[i][2] += qscale * q[i]*ek[i][2]; + f[i][0] += muscale * ek[i][0]; + f[i][1] += muscale * ek[i][1]; + if (slabflag != 2) f[i][2] += muscale * ek[i][2]; } // sum global energy across Kspace vevs and add in volume-dependent term @@ -548,7 +546,7 @@ void EwaldDipole::eik_dot_r() // define first val. of cos and sin for (ic = 0; ic < 3; ic++) { - sqk = (unitk[ic] * unitk[ic]); + sqk = unitk[ic]*unitk[ic]; if (sqk <= gsqmx) { cstr1 = 0.0; sstr1 = 0.0; @@ -557,8 +555,8 @@ void EwaldDipole::eik_dot_r() sn[0][ic][i] = 0.0; cs[1][ic][i] = cos(unitk[ic]*x[i][ic]); sn[1][ic][i] = sin(unitk[ic]*x[i][ic]); - cs[-1][ic][i] = cs[1][0][i]; - sn[-1][ic][i] = -sn[1][0][i]; + cs[-1][ic][i] = cs[1][ic][i]; + sn[-1][ic][i] = -sn[1][ic][i]; muk[n][i] = (mu[i][ic]*unitk[ic]); cstr1 += muk[n][i]*cs[1][ic][i]; sstr1 += muk[n][i]*sn[1][ic][i]; @@ -583,7 +581,7 @@ void EwaldDipole::eik_dot_r() cs[m-1][ic][i]*sn[1][ic][i]; cs[-m][ic][i] = cs[m][ic][i]; sn[-m][ic][i] = -sn[m][ic][i]; - muk[n][i] = (mu[i][ic]*m*unitk[ic]); + muk[n][i] = (mu[i][ic]*m*unitk[ic]); cstr1 += muk[n][i]*cs[m][ic][i]; sstr1 += muk[n][i]*sn[m][ic][i]; } @@ -604,16 +602,16 @@ void EwaldDipole::eik_dot_r() cstr2 = 0.0; sstr2 = 0.0; for (i = 0; i < nlocal; i++) { - mux = mu[i][0]; - muy = mu[i][1]; + mux = mu[i][0]; + muy = mu[i][1]; - // dir 1: (k,l,0) - muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1]); + // dir 1: (k,l,0) + muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1]); cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); - // dir 2: (k,-l,0) - muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1]); + // dir 2: (k,-l,0) + muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1]); cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); } @@ -636,16 +634,16 @@ void EwaldDipole::eik_dot_r() cstr2 = 0.0; sstr2 = 0.0; for (i = 0; i < nlocal; i++) { - muy = mu[i][1]; - muz = mu[i][2]; + muy = mu[i][1]; + muz = mu[i][2]; - // dir 1: (0,l,m) - muk[n][i] = (muy*l*unitk[1] + muz*m*unitk[2]); + // dir 1: (0,l,m) + muk[n][i] = (muy*l*unitk[1] + muz*m*unitk[2]); cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); - // dir 2: (0,l,-m) - muk[n+1][i] = (muy*l*unitk[1] - muz*m*unitk[2]); + // dir 2: (0,l,-m) + muk[n+1][i] = (muy*l*unitk[1] - muz*m*unitk[2]); cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); } @@ -656,7 +654,7 @@ void EwaldDipole::eik_dot_r() } } } - + // 1 = (k,0,m), 2 = (k,0,-m) for (k = 1; k <= kxmax; k++) { @@ -668,16 +666,16 @@ void EwaldDipole::eik_dot_r() cstr2 = 0.0; sstr2 = 0.0; for (i = 0; i < nlocal; i++) { - mux = mu[i][0]; - muz = mu[i][2]; + mux = mu[i][0]; + muz = mu[i][2]; - // dir 1: (k,0,m) - muk[n][i] = (mux*k*unitk[0] + muz*m*unitk[2]); + // dir 1: (k,0,m) + muk[n][i] = (mux*k*unitk[0] + muz*m*unitk[2]); cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); - // dir 2: (k,0,-m) - muk[n+1][i] = (mux*k*unitk[0] - muz*m*unitk[2]); + // dir 2: (k,0,-m) + muk[n+1][i] = (mux*k*unitk[0] - muz*m*unitk[2]); cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); } @@ -706,33 +704,33 @@ void EwaldDipole::eik_dot_r() cstr4 = 0.0; sstr4 = 0.0; for (i = 0; i < nlocal; i++) { - mux = mu[i][0]; - muy = mu[i][1]; - muz = mu[i][2]; + mux = mu[i][0]; + muy = mu[i][1]; + muz = mu[i][2]; - // dir 1: (k,l,m) - muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); + // dir 1: (k,l,m) + muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); - // dir 2: (k,-l,m) - muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); + // dir 2: (k,-l,m) + muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); - // dir 3: (k,l,-m) - muk[n+2][i] = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); + // dir 3: (k,l,-m) + muk[n+2][i] = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); - // dir 4: (k,-l,-m) - muk[n+3][i] = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); + // dir 4: (k,-l,-m) + muk[n+3][i] = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); From cce9fe4a34b39e81ec17e863bd9b42e3248edbb5 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 21 Sep 2018 09:55:41 -0600 Subject: [PATCH 0046/1242] Commit2 JT 092118 - created pair_spin_dipolar_cut - real-space short-range calc of the spin dipolar interaction - run and check valgrind ok --- .../SPIN/pppm_spin/in.spin.spin_dipolar_cut | 62 ++ src/SPIN/pair_spin_dipolar_cut.cpp | 528 ++++++++++++++++++ src/SPIN/pair_spin_dipolar_cut.h | 100 ++++ 3 files changed, 690 insertions(+) create mode 100644 examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut create mode 100644 src/SPIN/pair_spin_dipolar_cut.cpp create mode 100644 src/SPIN/pair_spin_dipolar_cut.h diff --git a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut new file mode 100644 index 0000000000..838181e6d8 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut @@ -0,0 +1,62 @@ +# hcp cobalt in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice hcp 2.5071 +region box block 0.0 8.0 0.0 8.0 0.0 8.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for hcp cobalt + +mass 1 58.93 + +#set group all spin/random 31 1.72 +set group all spin 1.72 0.0 0.0 1.0 +velocity all create 100 4928459 rot yes dist gaussian + +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 +pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * spin/dipolar/cut long 8.0 +#pair_coeff * * spin/long long 8.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +fix 3 all nve/spin lattice yes + +timestep 0.0001 + + +compute out_mag all compute/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_style custom step time v_magnorm v_emag temp etotal +thermo 10 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +#run 20000 +run 10 diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp new file mode 100644 index 0000000000..f686d12926 --- /dev/null +++ b/src/SPIN/pair_spin_dipolar_cut.cpp @@ -0,0 +1,528 @@ +/* ---------------------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + 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) + Aidan Thompson (SNL) + + Please cite the related publication: + Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). + Massively parallel symplectic algorithm for coupled magnetic spin dynamics + and molecular dynamics. Journal of Computational Physics. +------------------------------------------------------------------------- */ + +#include +#include +#include +#include + +#include "pair_spin_dipolar_cut.h" +#include "atom.h" +#include "comm.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" +#include "fix_nve_spin.h" +#include "force.h" +#include "kspace.h" +#include "math_const.h" +#include "memory.h" +#include "modify.h" +#include "error.h" +#include "update.h" + + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define EWALD_F 1.12837917 +#define EWALD_P 0.3275911 +#define A1 0.254829592 +#define A2 -0.284496736 +#define A3 1.421413741 +#define A4 -1.453152027 +#define A5 1.061405429 + +/* ---------------------------------------------------------------------- */ + +PairSpinDipolarCut::PairSpinDipolarCut(LAMMPS *lmp) : PairSpin(lmp), +lockfixnvespin(NULL) +{ + single_enable = 0; + spinflag = 1; + respa_enable = 0; + no_virial_fdotr_compute = 1; + lattice_flag = 0; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + +} + +/* ---------------------------------------------------------------------- + free all arrays +------------------------------------------------------------------------- */ + +PairSpinDipolarCut::~PairSpinDipolarCut() +{ + if (allocated) { + memory->destroy(setflag); + memory->destroy(cut_spin_long); + memory->destroy(cutsq); + } +} + +/* ---------------------------------------------------------------------- + global settings +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::settings(int narg, char **arg) +{ + if (narg < 1 || narg > 2) + error->all(FLERR,"Incorrect args in pair_style command"); + + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"Spin simulations require metal unit style"); + + cut_spin_long_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+1; j <= atom->ntypes; j++) { + if (setflag[i][j]) { + cut_spin_long[i][j] = cut_spin_long_global; + } + } + } + } + +} + +/* ---------------------------------------------------------------------- + set coeffs for one or more type pairs +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::coeff(int narg, char **arg) +{ + if (!allocated) allocate(); + + // check if args correct + + if (strcmp(arg[2],"long") != 0) + error->all(FLERR,"Incorrect args in pair_style command"); + if (narg < 1 || narg > 4) + error->all(FLERR,"Incorrect args in pair_style command"); + + int ilo,ihi,jlo,jhi; + force->bounds(FLERR,arg[0],atom->ntypes,ilo,ihi); + force->bounds(FLERR,arg[1],atom->ntypes,jlo,jhi); + + double spin_long_cut_one = force->numeric(FLERR,arg[3]); + + int count = 0; + for (int i = ilo; i <= ihi; i++) { + for (int j = MAX(jlo,i); j <= jhi; j++) { + setflag[i][j] = 1; + cut_spin_long[i][j] = spin_long_cut_one; + count++; + } + } + + if (count == 0) error->all(FLERR,"Incorrect args for pair coefficients"); +} + +/* ---------------------------------------------------------------------- + init specific to this pair style +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::init_style() +{ + if (!atom->sp_flag) + error->all(FLERR,"Pair spin requires atom/spin style"); + + // need a full neighbor list + + int irequest = neighbor->request(this,instance_me); + neighbor->requests[irequest]->half = 0; + neighbor->requests[irequest]->full = 1; + + // checking if nve/spin is a listed fix + + int ifix = 0; + while (ifix < modify->nfix) { + if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + ifix++; + } + if (ifix == modify->nfix) + error->all(FLERR,"pair/spin style requires nve/spin"); + + // get the lattice_flag from nve/spin + + for (int i = 0; i < modify->nfix; i++) { + if (strcmp(modify->fix[i]->style,"nve/spin") == 0) { + lockfixnvespin = (FixNVESpin *) modify->fix[i]; + lattice_flag = lockfixnvespin->lattice_flag; + } + } + +} + +/* ---------------------------------------------------------------------- + init for one type pair i,j and corresponding j,i +------------------------------------------------------------------------- */ + +double PairSpinDipolarCut::init_one(int i, int j) +{ + if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); + + cut_spin_long[j][i] = cut_spin_long[i][j]; + + return cut_spin_long_global; +} + +/* ---------------------------------------------------------------------- + extract the larger cutoff if "cut" or "cut_coul" +------------------------------------------------------------------------- */ + +void *PairSpinDipolarCut::extract(const char *str, int &dim) +{ + if (strcmp(str,"cut") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"cut_coul") == 0) { + dim = 0; + return (void *) &cut_spin_long_global; + } else if (strcmp(str,"ewald_order") == 0) { + ewald_order = 0; + ewald_order |= 1<<1; + ewald_order |= 1<<3; + dim = 0; + return (void *) &ewald_order; + } else if (strcmp(str,"ewald_mix") == 0) { + dim = 0; + return (void *) &mix_flag; + } + return NULL; +} + +/* ---------------------------------------------------------------------- */ + +void PairSpinDipolarCut::compute(int eflag, int vflag) +{ + int i,j,ii,jj,inum,jnum,itype,jtype; + double rinv,r2inv,r3inv,rsq; + double evdwl,ecoul; + double xi[3],rij[3]; + double spi[4],spj[4],fi[3],fmi[3]; + double local_cut2; + int *ilist,*jlist,*numneigh,**firstneigh; + + evdwl = ecoul = 0.0; + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = vflag_fdotr = 0; + + double **x = atom->x; + double **f = atom->f; + double **fm = atom->fm; + double **sp = atom->sp; + int *type = atom->type; + int nlocal = atom->nlocal; + int newton_pair = force->newton_pair; + + inum = list->inum; + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // computation of the exchange interaction + // loop over atoms and their neighbors + + for (ii = 0; ii < inum; ii++) { + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + itype = type[i]; + + for (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]; + spj[3] = sp[j][3]; + + fi[0] = fi[1] = fi[2] = 0.0; + fmi[0] = fmi[1] = fmi[2] = 0.0; + + 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]; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + + compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); + if (lattice_flag) compute_dipolar_mech(i,j,rij,fmi,spi,spj,r2inv); + } + + // force accumulation + + 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][2] += fmi[2]; + + if (newton_pair || j < nlocal) { + f[j][0] -= fi[0]; + f[j][1] -= fi[1]; + f[j][2] -= fi[2]; + } + + if (eflag) { + if (rsq <= local_cut2) { + 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],rij[0],rij[1],rij[2]); + + } + } +} + +/* ---------------------------------------------------------------------- + update the pair interaction fmi acting on the spin ii + adding 1/r (for r in [0,rc]) contribution to the pair + removing erf(r)/r (for r in [0,rc]) from the kspace force +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) +{ + int i,j,jj,jnum,itype,jtype; + double rsq,rinv,r2inv,r3inv; + double xi[3],rij[3]; + double spi[4],spj[4]; + double local_cut2; + int *ilist,*jlist,*numneigh,**firstneigh; + + double **x = atom->x; + double **sp = atom->sp; + int *type = atom->type; + + ilist = list->ilist; + numneigh = list->numneigh; + firstneigh = list->firstneigh; + + // computation of the exchange interaction + // loop over neighbors of atom i + + i = ilist[ii]; + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spi[3] = sp[i][3]; + jlist = firstneigh[i]; + jnum = numneigh[i]; + itype = type[i]; + + for (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]; + spj[3] = sp[j][3]; + + 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]; + + local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + + if (rsq < local_cut2) { + r2inv = 1.0/rsq; + rinv = sqrt(r2inv); + r3inv = r2inv*rinv; + + // compute dipolar interaction + + compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); + } + } + + //fmi[0] *= mub2mu0hbinv; + //fmi[1] *= mub2mu0hbinv; + //fmi[2] *= mub2mu0hbinv; +} + +/* ---------------------------------------------------------------------- + compute dipolar interaction between spins i and j +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::compute_dipolar(int i, int j, double rij[3], + double fmi[3], double spi[4], double spj[4], double r3inv) +{ + double sjdotr; + double gigjri2,pre; + + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + gigjri2 = (spi[3] * spj[3])*r3inv; + pre = mub2mu0hbinv * gigjri2 / 4.0 / MY_PI; + + fmi[0] += pre * gigjri2 * (3.0 * sjdotr *rij[0] - spj[0]); + fmi[1] += pre * gigjri2 * (3.0 * sjdotr *rij[1] - spj[1]); + fmi[2] += pre * gigjri2 * (3.0 * sjdotr *rij[2] - spj[2]); +} + +/* ---------------------------------------------------------------------- + compute the mechanical force due to the dipolar interaction between + atom i and atom j +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double rij[3], + double fi[3], double spi[3], double spj[3], double r2inv) +{ + double sdots,sidotr,sjdotr,b2,b3; + double gigjri4,bij,pre; + + gigjri4 = (spi[3] * spj[3])/r2inv/r2inv; + sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + + bij = sdots - 5.0 * sidotr*sjdotr; + pre = mub2mu0 * bij / 4.0 / MY_PI; + fi[0] += pre * (rij[0] * bij + (sjdotr*spi[0] + sidotr*spj[0])); + fi[1] += pre * (rij[1] * bij + (sjdotr*spi[1] + sidotr*spj[1])); + fi[2] += pre * (rij[2] * bij + (sjdotr*spi[2] + sidotr*spj[2])); +} + + +/* ---------------------------------------------------------------------- + allocate all arrays +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::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(cut_spin_long,n+1,n+1,"pair/spin/long:cut_spin_long"); + memory->create(cutsq,n+1,n+1,"pair/spin/long:cutsq"); +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::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(&cut_spin_long[i][j],sizeof(int),1,fp); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::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(&cut_spin_long[i][j],sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long[i][j],1,MPI_INT,0,world); + } + } + } +} + +/* ---------------------------------------------------------------------- + proc 0 writes to restart file +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::write_restart_settings(FILE *fp) +{ + fwrite(&cut_spin_long_global,sizeof(double),1,fp); + fwrite(&mix_flag,sizeof(int),1,fp); +} + +/* ---------------------------------------------------------------------- + proc 0 reads from restart file, bcasts +------------------------------------------------------------------------- */ + +void PairSpinDipolarCut::read_restart_settings(FILE *fp) +{ + if (comm->me == 0) { + fread(&cut_spin_long_global,sizeof(double),1,fp); + fread(&mix_flag,sizeof(int),1,fp); + } + MPI_Bcast(&cut_spin_long_global,1,MPI_DOUBLE,0,world); + MPI_Bcast(&mix_flag,1,MPI_INT,0,world); +} diff --git a/src/SPIN/pair_spin_dipolar_cut.h b/src/SPIN/pair_spin_dipolar_cut.h new file mode 100644 index 0000000000..ac17ac2120 --- /dev/null +++ b/src/SPIN/pair_spin_dipolar_cut.h @@ -0,0 +1,100 @@ +/* -*- c++ -*- ---------------------------------------------------------- + LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator + www.cs.sandia.gov/~sjplimp/lammps.html + Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories + + 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(spin/dipolar/cut,PairSpinDipolarCut) + +#else + +#ifndef LMP_PAIR_SPIN_DIPOLAR_CUT_H +#define LMP_PAIR_SPIN_DIPOLAR_CUT_H + +#include "pair_spin.h" + +namespace LAMMPS_NS { + +class PairSpinDipolarCut : public PairSpin { + public: + double cut_coul; + double **sigma; + + PairSpinDipolarCut(class LAMMPS *); + ~PairSpinDipolarCut(); + void settings(int, char **); + void coeff(int, char **); + double init_one(int, int); + void init_style(); + void *extract(const char *, int &); + + void compute(int, int); + void compute_single_pair(int, double *); + + void compute_dipolar(int, int, double *, double *, double *, + double *, double); + void compute_dipolar_mech(int, int, double *, double *, double *, + double *, double); + + void write_restart(FILE *); + void read_restart(FILE *); + void write_restart_settings(FILE *); + void read_restart_settings(FILE *); + + double cut_spin_long_global; // global long cutoff distance + + protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force + + double **cut_spin_long; // cutoff distance long + + double g_ewald; + int ewald_order; + + int lattice_flag; // flag for mech force computation + class FixNVESpin *lockfixnvespin; // ptr for setups + + void allocate(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Incorrect args in pair_style command + +Self-explanatory. + +E: Incorrect args for pair coefficients + +Self-explanatory. Check the input script or data file. + +E: Pair dipole/long requires atom attributes q, mu, torque + +The atom style defined does not have these attributes. + +E: Cannot (yet) use 'electron' units with dipoles + +This feature is not yet supported. + +E: Pair style requires a KSpace style + +No kspace style is defined. + +*/ From 53a779067ee59366eb96fddfd2c37e0471c0c4bf Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 24 Sep 2018 10:59:17 -0600 Subject: [PATCH 0047/1242] Commit JT 092418 - ewald_dipole_spin added - accuracy problem (with eval of gewald and Newton solver) --- examples/SPIN/pppm_spin/in.spin.ewald_spin | 67 ++ src/KSPACE/ewald_dipole.cpp | 6 +- src/KSPACE/ewald_dipole.h | 3 - src/KSPACE/ewald_dipole_spin.cpp | 895 +++++++++++++++++++++ src/KSPACE/ewald_dipole_spin.h | 102 +++ 5 files changed, 1067 insertions(+), 6 deletions(-) create mode 100644 examples/SPIN/pppm_spin/in.spin.ewald_spin create mode 100644 src/KSPACE/ewald_dipole_spin.cpp create mode 100644 src/KSPACE/ewald_dipole_spin.h diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin new file mode 100644 index 0000000000..d9ca46b27a --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.ewald_spin @@ -0,0 +1,67 @@ +# hcp cobalt in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice hcp 2.5071 +region box block 0.0 8.0 0.0 8.0 0.0 8.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for hcp cobalt + +mass 1 58.93 + +#set group all spin/random 31 1.72 +set group all spin 1.72 0.0 0.0 1.0 +velocity all create 100 4928459 rot yes dist gaussian + +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 +pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +#pair_coeff * * spin/long/qsymp long 8.0 +pair_coeff * * spin/long long 8.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +#kspace_style pppm/dipole/spin 1.0e-4 +#kspace_style ewald/dipole/spin 1.0e-4 +kspace_style ewald/dipole/spin 1.0e-2 +kspace_modify mesh 32 32 32 + +#fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +fix 3 all nve/spin lattice yes + +timestep 0.0001 + + +compute out_mag all compute/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_style custom step time v_magnorm v_emag temp etotal +thermo 10 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +#run 20000 +run 1 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 372825d587..42d850dcc2 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -161,6 +161,8 @@ void EwaldDipole::init() // zprd used rather than zprd_slab if (!gewaldflag) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); double g_ewald_new = NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; @@ -778,14 +780,12 @@ void EwaldDipole::slabcorr() { // compute local contribution to global dipole moment - //double *q = atom->q; double **x = atom->x; double zprd = domain->zprd; int nlocal = atom->nlocal; double dipole = 0.0; double **mu = atom->mu; - //for (int i = 0; i < nlocal; i++) dipole += q[i]*x[i][2]; for (int i = 0; i < nlocal; i++) dipole += mu[i][2]; // sum local contributions to get global dipole moment @@ -856,7 +856,7 @@ void EwaldDipole::musum_musq() } if (mu2 == 0 && comm->me == 0) - error->all(FLERR,"Using kspace solver PPPMDipole on system with no dipoles"); + error->all(FLERR,"Using kspace solver EwaldDipole on system with no dipoles"); } /* ---------------------------------------------------------------------- diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index f937b2a2c2..0a57f86d00 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -38,9 +38,6 @@ class EwaldDipole : public Ewald { double **tk; // field for torque double **vc; // virial per k - //virtual void allocate(); - //void deallocate(); - void musum_musq(); double rms_dipole(int, double, bigint); virtual void eik_dot_r(); diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp new file mode 100644 index 0000000000..5522b18e03 --- /dev/null +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -0,0 +1,895 @@ +/* ---------------------------------------------------------------------- + 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) + Stan Moore (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include +#include "ewald_dipole_spin.h" +#include "atom.h" +#include "comm.h" +#include "force.h" +#include "pair.h" +#include "domain.h" +#include "math_const.h" +#include "math_special.h" +#include "memory.h" +#include "error.h" +#include "update.h" + +#include "math_const.h" +#include "math_special.h" + +using namespace LAMMPS_NS; +using namespace MathConst; +using namespace MathSpecial; + +#define SMALL 0.00001 + +/* ---------------------------------------------------------------------- */ + +EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp, int narg, char **arg) : + EwaldDipole(lmp, narg, arg) +{ + dipoleflag = 0; + spinflag = 1; + + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0; // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz +} + +/* ---------------------------------------------------------------------- + free all memory +------------------------------------------------------------------------- */ + +EwaldDipoleSpin::~EwaldDipoleSpin() +{ + //memory->destroy(muk); + //memory->destroy(tk); + //memory->destroy(vc); +} + +/* ---------------------------------------------------------------------- + called once before run +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::init() +{ + if (comm->me == 0) { + if (screen) fprintf(screen,"EwaldDipoleSpin initialization ...\n"); + if (logfile) fprintf(logfile,"EwaldDipoleSpin initialization ...\n"); + } + + // error check + + //dipoleflag = atom->mu?1:0; + spinflag = atom->sp?1:0; + //qsum_qsq(0); // q[i] might not be declared ? + + //if (dipoleflag && q2) + // error->all(FLERR,"Cannot (yet) use charges with Kspace style EwaldDipoleSpin"); + + triclinic_check(); + + // no triclinic ewald spin (yet) + + triclinic = domain->triclinic; + if (triclinic) + error->all(FLERR,"Cannot (yet) use EwaldDipoleSpin with triclinic box"); + + if (domain->dimension == 2) + error->all(FLERR,"Cannot use EwaldDipoleSpin with 2d simulation"); + + if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); +//if (!atom->q_flag) error->all(FLERR,"Kspace style requires atom attribute q"); + + if ((spinflag && strcmp(update->unit_style,"metal")) != 0) + error->all(FLERR,"'metal' units have to be used with spins"); + + if (slabflag == 0 && domain->nonperiodic > 0) + error->all(FLERR,"Cannot use nonperiodic boundaries with EwaldDipoleSpin"); + if (slabflag) { + if (domain->xperiodic != 1 || domain->yperiodic != 1 || + domain->boundary[2][0] != 1 || domain->boundary[2][1] != 1) + error->all(FLERR,"Incorrect boundaries with slab EwaldDipoleSpin"); + } + + // extract short-range Coulombic cutoff from pair style + + pair_check(); + + int itmp; + double *p_cutoff = (double *) force->pair->extract("cut_coul",itmp); + if (p_cutoff == NULL) + error->all(FLERR,"KSpace style is incompatible with Pair style"); + double cutoff = *p_cutoff; + + // kspace TIP4P not yet supported + // qdist = offset only for TIP4P fictitious charge + + //qdist = 0.0; + if (tip4pflag) + error->all(FLERR,"Cannot yet use TIP4P with EwaldDipoleSpin"); + + // compute musum & musqsum and warn if no spin + + scale = 1.0; + qqrd2e = force->qqrd2e; + //musum_musq(); + spsum_musq(); + natoms_original = atom->natoms; + + // set accuracy (force units) from accuracy_relative or accuracy_absolute + + if (accuracy_absolute >= 0.0) accuracy = accuracy_absolute; + else accuracy = accuracy_relative * two_charge_force; + + // setup K-space resolution + + bigint natoms = atom->natoms; + + // use xprd,yprd,zprd even if triclinic so grid size is the same + // adjust z dimension for 2d slab EwaldDipoleSpin + // 3d EwaldDipoleSpin just uses zprd since slab_volfactor = 1.0 + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + double zprd_slab = zprd*slab_volfactor; + + // make initial g_ewald estimate + // based on desired accuracy and real space cutoff + // fluid-occupied volume used to estimate real-space error + // zprd used rather than zprd_slab + + if (!gewaldflag) { + if (accuracy <= 0.0) + error->all(FLERR,"KSpace accuracy must be > 0"); + double g_ewald_new = + NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); + if (g_ewald_new > 0.0) g_ewald = g_ewald_new; + else error->warning(FLERR,"Ewald/disp Newton solver failed, " + "using old method to estimate g_ewald"); + } + + // setup EwaldDipoleSpin coefficients so can print stats + + setup(); + + // final RMS accuracy + + double lprx = rms(kxmax_orig,xprd,natoms,q2); + double lpry = rms(kymax_orig,yprd,natoms,q2); + double lprz = rms(kzmax_orig,zprd_slab,natoms,q2); + double lpr = sqrt(lprx*lprx + lpry*lpry + lprz*lprz) / sqrt(3.0); + double q2_over_sqrt = q2 / sqrt(natoms*cutoff*xprd*yprd*zprd_slab); + double spr = 2.0 *q2_over_sqrt * exp(-g_ewald*g_ewald*cutoff*cutoff); + double tpr = estimate_table_accuracy(q2_over_sqrt,spr); + double estimated_accuracy = sqrt(lpr*lpr + spr*spr + tpr*tpr); + + // stats + + if (comm->me == 0) { + if (screen) { + fprintf(screen," G vector (1/distance) = %g\n",g_ewald); + fprintf(screen," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(screen," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(screen," KSpace vectors: actual max1d max3d = %d %d %d\n", + kcount,kmax,kmax3d); + fprintf(screen," kxmax kymax kzmax = %d %d %d\n", + kxmax,kymax,kzmax); + } + if (logfile) { + fprintf(logfile," G vector (1/distance) = %g\n",g_ewald); + fprintf(logfile," estimated absolute RMS force accuracy = %g\n", + estimated_accuracy); + fprintf(logfile," estimated relative force accuracy = %g\n", + estimated_accuracy/two_charge_force); + fprintf(logfile," KSpace vectors: actual max1d max3d = %d %d %d\n", + kcount,kmax,kmax3d); + fprintf(logfile," kxmax kymax kzmax = %d %d %d\n", + kxmax,kymax,kzmax); + } + } +} + +/* ---------------------------------------------------------------------- + adjust EwaldDipoleSpin coeffs, called initially and whenever volume has changed +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::setup() +{ + // volume-dependent factors + + double xprd = domain->xprd; + double yprd = domain->yprd; + double zprd = domain->zprd; + + // adjustment of z dimension for 2d slab EwaldDipoleSpin + // 3d EwaldDipoleSpin just uses zprd since slab_volfactor = 1.0 + + double zprd_slab = zprd*slab_volfactor; + volume = xprd * yprd * zprd_slab; + + unitk[0] = 2.0*MY_PI/xprd; + unitk[1] = 2.0*MY_PI/yprd; + unitk[2] = 2.0*MY_PI/zprd_slab; + + int kmax_old = kmax; + + if (kewaldflag == 0) { + + // determine kmax + // function of current box size, accuracy, G_ewald (short-range cutoff) + + bigint natoms = atom->natoms; + double err; + kxmax = 1; + kymax = 1; + kzmax = 1; + + // set kmax in 3 directions to respect accuracy + + err = rms_dipole(kxmax,xprd,natoms); + while (err > accuracy) { + kxmax++; + err = rms_dipole(kxmax,xprd,natoms); + } + + err = rms_dipole(kymax,yprd,natoms); + while (err > accuracy) { + kymax++; + err = rms_dipole(kymax,yprd,natoms); + } + + err = rms_dipole(kzmax,zprd,natoms); + while (err > accuracy) { + kzmax++; + err = rms_dipole(kzmax,zprd,natoms); + } + + kmax = MAX(kxmax,kymax); + kmax = MAX(kmax,kzmax); + kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + + double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax; + double gsqymx = unitk[1]*unitk[1]*kymax*kymax; + double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax; + gsqmx = MAX(gsqxmx,gsqymx); + gsqmx = MAX(gsqmx,gsqzmx); + + kxmax_orig = kxmax; + kymax_orig = kymax; + kzmax_orig = kzmax; + + } else { + + kxmax = kx_ewald; + kymax = ky_ewald; + kzmax = kz_ewald; + + kxmax_orig = kxmax; + kymax_orig = kymax; + kzmax_orig = kzmax; + + kmax = MAX(kxmax,kymax); + kmax = MAX(kmax,kzmax); + kmax3d = 4*kmax*kmax*kmax + 6*kmax*kmax + 3*kmax; + + double gsqxmx = unitk[0]*unitk[0]*kxmax*kxmax; + double gsqymx = unitk[1]*unitk[1]*kymax*kymax; + double gsqzmx = unitk[2]*unitk[2]*kzmax*kzmax; + gsqmx = MAX(gsqxmx,gsqymx); + gsqmx = MAX(gsqmx,gsqzmx); + } + + gsqmx *= 1.00001; + + // if size has grown, reallocate k-dependent and nlocal-dependent arrays + + if (kmax > kmax_old) { + deallocate(); + allocate(); + group_allocate_flag = 0; + + memory->destroy(ek); + memory->destroy(tk); + memory->destroy(vc); + memory->destroy3d_offset(cs,-kmax_created); + memory->destroy3d_offset(sn,-kmax_created); + memory->destroy(muk); + nmax = atom->nmax; + memory->create(ek,nmax,3,"ewald_dipole_spin:ek"); + memory->create(tk,nmax,3,"ewald_dipole_spin:tk"); + memory->create(vc,kmax3d,6,"ewald_dipole_spin:tk"); + memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole_spin:cs"); + memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole_spin:sn"); + memory->create(muk,kmax3d,nmax,"ewald_dipole_spin:muk"); + kmax_created = kmax; + } + + // pre-compute EwaldDipoleSpin coefficients + + coeffs(); +} + +/* ---------------------------------------------------------------------- + compute dipole RMS accuracy for a dimension +------------------------------------------------------------------------- */ + +//double EwaldDipoleSpin::rms_dipole(int km, double prd, bigint natoms) +//{ +// if (natoms == 0) natoms = 1; // avoid division by zero +// +// // error from eq.(46), Wang et al., JCP 115, 6351 (2001) +// +// double value = 8*MY_PI*mu2*g_ewald/volume * +// sqrt(2*MY_PI*km*km*km/(15.0*natoms)) * +// exp(-MY_PI*MY_PI*km*km/(g_ewald*g_ewald*prd*prd)); +// +// return value; +//} + +/* ---------------------------------------------------------------------- + compute the EwaldDipoleSpin long-range force, energy, virial +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::compute(int eflag, int vflag) +{ + int i,j,k; + const double g3 = g_ewald*g_ewald*g_ewald; + double spx, spy, spz; + + // set energy/virial flags + + if (eflag || vflag) ev_setup(eflag,vflag); + else evflag = evflag_atom = eflag_global = vflag_global = + eflag_atom = vflag_atom = 0; + + // if atom count has changed, update qsum and qsqsum + + if (atom->natoms != natoms_original) { + //musum_musq(); + spsum_musq(); + natoms_original = atom->natoms; + } + + // return if there are no charges + + if (musqsum == 0.0) return; + + // extend size of per-atom arrays if necessary + + if (atom->nmax > nmax) { + memory->destroy(ek); + memory->destroy(tk); + memory->destroy(vc); + memory->destroy3d_offset(cs,-kmax_created); + memory->destroy3d_offset(sn,-kmax_created); + memory->destroy(muk); + nmax = atom->nmax; + memory->create(ek,nmax,3,"ewald_dipole_spin:ek"); + memory->create(tk,nmax,3,"ewald_dipole_spin:tk"); + memory->create(vc,kmax3d,6,"ewald_dipole_spin:tk"); + memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole_spin:cs"); + memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole_spin:sn"); + memory->create(muk,kmax3d,nmax,"ewald_dipole_spin:muk"); + kmax_created = kmax; + } + + // partial structure factors on each processor + // total structure factor by summing over procs + + eik_dot_r(); + + MPI_Allreduce(sfacrl,sfacrl_all,kcount,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(sfacim,sfacim_all,kcount,MPI_DOUBLE,MPI_SUM,world); + + // K-space portion of electric field + // double loop over K-vectors and local atoms + // perform per-atom calculations if needed + + double **f = atom->f; + double **fm_long = atom->fm_long; + double **t = atom->torque; + //double **mu = atom->mu; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + int kx,ky,kz; + double cypz,sypz,exprl,expim; + double partial,partial2,partial_peratom; + double vcik[6]; + + for (i = 0; i < nlocal; i++) { + ek[i][0] = ek[i][1] = ek[i][2] = 0.0; + tk[i][0] = tk[i][1] = tk[i][2] = 0.0; + } + + for (k = 0; k < kcount; k++) { + kx = kxvecs[k]; + ky = kyvecs[k]; + kz = kzvecs[k]; + for (j = 0; j<6; j++) vc[k][j] = 0.0; + + for (i = 0; i < nlocal; i++) { + + vcik[0] = vcik[1] = vcik[2] = 0.0; + vcik[3] = vcik[4] = vcik[5] = 0.0; + + // calculating re and im of exp(i*k*ri) + + cypz = cs[ky][1][i]*cs[kz][2][i] - sn[ky][1][i]*sn[kz][2][i]; + sypz = sn[ky][1][i]*cs[kz][2][i] + cs[ky][1][i]*sn[kz][2][i]; + exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; + expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; + + // taking im of struct_fact x exp(i*k*ri) (for force calc.) + + partial = (muk[k][i])*(expim*sfacrl_all[k] + exprl*sfacim_all[k]); + ek[i][0] += partial*eg[k][0]; + ek[i][1] += partial*eg[k][1]; + ek[i][2] += partial*eg[k][2]; + + // compute field for torque calculation + + partial2 = exprl*sfacrl_all[k] - expim*sfacim_all[k]; + tk[i][0] += partial2*eg[k][0]; + tk[i][1] += partial2*eg[k][1]; + tk[i][2] += partial2*eg[k][2]; + + // total and per-atom virial correction + + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + + vc[k][0] += vcik[0] = partial2 * spx * kx; + vc[k][1] += vcik[1] = partial2 * spy * ky; + vc[k][2] += vcik[2] = partial2 * spz * kz; + vc[k][3] += vcik[3] = partial2 * spx * ky; + vc[k][4] += vcik[4] = partial2 * spx * kz; + vc[k][5] += vcik[5] = partial2 * spy * kz; + + // taking re-part of struct_fact x exp(i*k*ri) + // (for per-atom energy and virial calc.) + + if (evflag_atom) { + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; + if (vflag_atom) + for (j = 0; j < 6; j++) + vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); + } + } + } + + // force and mag. precession vectors calculation + + const double spscale = mub2mu0 * scale; + const double spscale2 = mub2mu0hbinv * scale; + //const double muscale = qqrd2e * scale; + + for (i = 0; i < nlocal; i++) { + f[i][0] += spscale * ek[i][0]; + f[i][1] += spscale * ek[i][1]; + if (slabflag != 2) f[i][2] += spscale * ek[i][2]; + fm_long[i][0] += spscale2 * tk[i][0]; + fm_long[i][1] += spscale2 * tk[i][1]; + if (slabflag != 2) fm_long[i][2] += spscale2 * tk[i][3]; + } + + // sum global energy across Kspace vevs and add in volume-dependent term + // taking the re-part of struct_fact_i x struct_fact_j + // substracting self energy and scaling + + if (eflag_global) { + for (k = 0; k < kcount; k++) { + energy += ug[k] * (sfacrl_all[k]*sfacrl_all[k] + + sfacim_all[k]*sfacim_all[k]); + } + energy -= musqsum*2.0*g3/3.0/MY_PIS; + energy *= spscale; + } + + // global virial + + if (vflag_global) { + double uk, vk; + for (k = 0; k < kcount; k++) { + uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); + for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] + ug[k]*vc[k][j]; + } + for (j = 0; j < 6; j++) virial[j] *= spscale; + } + + // per-atom energy/virial + // energy includes self-energy correction + + if (evflag_atom) { + if (eflag_atom) { + for (i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + eatom[i] -= (spx*spx + spy*spy + spz*spz) + *2.0*g3/3.0/MY_PIS; + eatom[i] *= spscale; + } + } + + if (vflag_atom) + for (i = 0; i < nlocal; i++) + for (j = 0; j < 6; j++) vatom[i][j] *= spscale; + } + + // 2d slab correction + + if (slabflag == 1) slabcorr(); +} + +/* ---------------------------------------------------------------------- + compute the +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::eik_dot_r() +{ + int i,k,l,m,n,ic; + double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; + double sqk,clpm,slpm; + //double mux, muy, muz; + double spx, spy, spz, spi; + + double **x = atom->x; + //double **mu = atom->mu; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + n = 0; + spi = spx = spy = spz = 0.0; + + // loop on different k-directions + // loop on n kpoints and nlocal atoms + // store (n x nlocal) tab. of values of (mu_i dot k) + // store n values of sum_j[ (mu_j dot k) exp(-k dot r_j) ] + + // (k,0,0), (0,l,0), (0,0,m) + + // loop 1: k=1, l=1, m=1 + // define first val. of cos and sin + + for (ic = 0; ic < 3; ic++) { + sqk = unitk[ic]*unitk[ic]; + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + for (i = 0; i < nlocal; i++) { + cs[0][ic][i] = 1.0; + sn[0][ic][i] = 0.0; + cs[1][ic][i] = cos(unitk[ic]*x[i][ic]); + sn[1][ic][i] = sin(unitk[ic]*x[i][ic]); + cs[-1][ic][i] = cs[1][ic][i]; + sn[-1][ic][i] = -sn[1][ic][i]; + spi = sp[i][ic]*sp[i][3]; + //muk[n][i] = (mu[i][ic]*unitk[ic]); + muk[n][i] = (spi*unitk[ic]); + cstr1 += muk[n][i]*cs[1][ic][i]; + sstr1 += muk[n][i]*sn[1][ic][i]; + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + } + } + + // loop 2: k>1, l>1, m>1 + + for (m = 2; m <= kmax; m++) { + for (ic = 0; ic < 3; ic++) { + sqk = m*unitk[ic] * m*unitk[ic]; + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + for (i = 0; i < nlocal; i++) { + cs[m][ic][i] = cs[m-1][ic][i]*cs[1][ic][i] - + sn[m-1][ic][i]*sn[1][ic][i]; + sn[m][ic][i] = sn[m-1][ic][i]*cs[1][ic][i] + + cs[m-1][ic][i]*sn[1][ic][i]; + cs[-m][ic][i] = cs[m][ic][i]; + sn[-m][ic][i] = -sn[m][ic][i]; + spi = sp[i][ic]*sp[i][3]; + muk[n][i] = (spi*m*unitk[ic]); + //muk[n][i] = (mu[i][ic]*m*unitk[ic]); + cstr1 += muk[n][i]*cs[m][ic][i]; + sstr1 += muk[n][i]*sn[m][ic][i]; + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + } + } + } + + // 1 = (k,l,0), 2 = (k,-l,0) + + for (k = 1; k <= kxmax; k++) { + for (l = 1; l <= kymax; l++) { + sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + //mux = mu[i][0]; + //muy = mu[i][1]; + + // dir 1: (k,l,0) + muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1]); + cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); + sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); + + // dir 2: (k,-l,0) + muk[n+1][i] = (spx*k*unitk[0] - spy*l*unitk[1]); + cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); + sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (0,l,m), 2 = (0,l,-m) + + for (l = 1; l <= kymax; l++) { + for (m = 1; m <= kzmax; m++) { + sqk = (l*unitk[1] * l*unitk[1]) + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + //muy = mu[i][1]; + //muz = mu[i][2]; + + // dir 1: (0,l,m) + muk[n][i] = (spy*l*unitk[1] + spz*m*unitk[2]); + cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); + sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); + + // dir 2: (0,l,-m) + muk[n+1][i] = (spy*l*unitk[1] - spz*m*unitk[2]); + cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); + sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (k,0,m), 2 = (k,0,-m) + + for (k = 1; k <= kxmax; k++) { + for (m = 1; m <= kzmax; m++) { + sqk = (k*unitk[0] * k*unitk[0]) + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + for (i = 0; i < nlocal; i++) { + //mux = mu[i][0]; + //muz = mu[i][2]; + spx = sp[i][0]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + + // dir 1: (k,0,m) + muk[n][i] = (spx*k*unitk[0] + spz*m*unitk[2]); + cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); + sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); + + // dir 2: (k,0,-m) + muk[n+1][i] = (spx*k*unitk[0] - spz*m*unitk[2]); + cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); + sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + } + } + } + + // 1 = (k,l,m), 2 = (k,-l,m), 3 = (k,l,-m), 4 = (k,-l,-m) + + for (k = 1; k <= kxmax; k++) { + for (l = 1; l <= kymax; l++) { + for (m = 1; m <= kzmax; m++) { + sqk = (k*unitk[0] * k*unitk[0]) + (l*unitk[1] * l*unitk[1]) + + (m*unitk[2] * m*unitk[2]); + if (sqk <= gsqmx) { + cstr1 = 0.0; + sstr1 = 0.0; + cstr2 = 0.0; + sstr2 = 0.0; + cstr3 = 0.0; + sstr3 = 0.0; + cstr4 = 0.0; + sstr4 = 0.0; + for (i = 0; i < nlocal; i++) { + //mux = mu[i][0]; + //muy = mu[i][1]; + //muz = mu[i][2]; + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + + // dir 1: (k,l,m) + muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1] + spz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; + slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; + cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 2: (k,-l,m) + muk[n+1][i] = (spx*k*unitk[0] - spy*l*unitk[1] + spz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; + slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; + cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 3: (k,l,-m) + muk[n+2][i] = (spx*k*unitk[0] + spy*l*unitk[1] - spz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; + slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; + cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + + // dir 4: (k,-l,-m) + muk[n+3][i] = (spx*k*unitk[0] - spy*l*unitk[1] - spz*m*unitk[2]); + clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; + slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; + cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr4 += muk[n+3][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + } + sfacrl[n] = cstr1; + sfacim[n++] = sstr1; + sfacrl[n] = cstr2; + sfacim[n++] = sstr2; + sfacrl[n] = cstr3; + sfacim[n++] = sstr3; + sfacrl[n] = cstr4; + sfacim[n++] = sstr4; + } + } + } + } +} + +/* ---------------------------------------------------------------------- + Slab-geometry correction term to dampen inter-slab interactions between + periodically repeating slabs. Yields good approximation to 2D EwaldDipoleSpin if + adequate empty space is left between repeating slabs (J. Chem. Phys. + 111, 3155). Slabs defined here to be parallel to the xy plane. Also + extended to non-neutral systems (J. Chem. Phys. 131, 094107). +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::slabcorr() +{ + // compute local contribution to global dipole/spin moment + + double **x = atom->x; + double zprd = domain->zprd; + int nlocal = atom->nlocal; + + double spin = 0.0; + double **sp = atom->sp; + double spx,spy,spz; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + spin += spz; + } + + // sum local contributions to get global spin moment + + double spin_all; + MPI_Allreduce(&spin,&spin_all,1,MPI_DOUBLE,MPI_SUM,world); + + // need to make non-neutral systems and/or + // per-atom energy translationally invariant + + if (eflag_atom || fabs(qsum) > SMALL) { + + error->all(FLERR,"Cannot (yet) use kspace slab correction with " + "long-range spins and non-neutral systems or per-atom energy"); + } + + // compute corrections + + const double e_slabcorr = MY_2PI*(spin_all*spin_all/12.0)/volume; + const double spscale = mub2mu0 * scale; + + if (eflag_global) energy += spscale * e_slabcorr; + + // per-atom energy + + if (eflag_atom) { + double efact = spscale * MY_2PI/volume/12.0; + for (int i = 0; i < nlocal; i++) { + spz = sp[i][2]*sp[i][3]; + eatom[i] += efact * spz * spin_all; + } + } + + // add on mag. force corrections + + double ffact = spscale * (-4.0*MY_PI/volume); + double **fm_long = atom->fm_long; + for (int i = 0; i < nlocal; i++) { + fm_long[i][2] += ffact * spin_all; + } +} + +/* ---------------------------------------------------------------------- + compute musum,musqsum,mu2 for magnetic spins + called initially, when particle count changes, when spins are changed +------------------------------------------------------------------------- */ + +void EwaldDipoleSpin::spsum_musq() +{ + const int nlocal = atom->nlocal; + + musum = musqsum = mu2 = 0.0; + if (atom->sp_flag) { + double** sp = atom->sp; + double spx,spy,spz; + double musum_local(0.0), musqsum_local(0.0); + + for (int i = 0; i < nlocal; i++) { + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + musum_local += spx + spy + spz; + musqsum_local += spx*spx + spy*spy + spz*spz; + } + + MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); + MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); + + mu2 = musqsum * mub2mu0; + } + + if (mu2 == 0 && comm->me == 0) + error->all(FLERR,"Using kspace solver EwaldDipoleSpin on system with no spins"); +} diff --git a/src/KSPACE/ewald_dipole_spin.h b/src/KSPACE/ewald_dipole_spin.h new file mode 100644 index 0000000000..92122525a8 --- /dev/null +++ b/src/KSPACE/ewald_dipole_spin.h @@ -0,0 +1,102 @@ +/* -*- 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 KSPACE_CLASS + +KSpaceStyle(ewald/dipole/spin,EwaldDipoleSpin) + +#else + +#ifndef LMP_EWALD_DIPOLE_SPIN_H +#define LMP_EWALD_DIPOLE_SPIN_H + +#include "ewald_dipole.h" + +namespace LAMMPS_NS { + +class EwaldDipoleSpin : public EwaldDipole { + public: + EwaldDipoleSpin(class LAMMPS *, int, char **); + virtual ~EwaldDipoleSpin(); + void init(); + void setup(); + void compute(int, int); + + protected: + double hbar; // reduced Planck's constant + double mub; // Bohr's magneton + double mu_0; // vacuum permeability + double mub2mu0; // prefactor for mech force + double mub2mu0hbinv; // prefactor for mag force + + void spsum_musq(); + virtual void eik_dot_r(); + void slabcorr(); + +}; + +} + +#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: Cannot use EwaldDipoleSpin with 2d simulation + +The kspace style ewald cannot be used in 2d simulations. You can use +2d EwaldDipoleSpin in a 3d simulation; see the kspace_modify command. + +E: Kspace style requires atom attribute q + +The atom style defined does not have these attributes. + +E: Cannot use nonperiodic boundaries with EwaldDipoleSpin + +For kspace style ewald, all 3 dimensions must have periodic boundaries +unless you use the kspace_modify command to define a 2d slab with a +non-periodic z dimension. + +E: Incorrect boundaries with slab EwaldDipoleSpin + +Must have periodic x,y dimensions and non-periodic z dimension to use +2d slab option with EwaldDipoleSpin. + +E: Cannot (yet) use EwaldDipoleSpin with triclinic box and slab correction + +This feature is not yet supported. + +E: KSpace style is incompatible with Pair style + +Setting a kspace style requires that a pair style with matching +long-range Coulombic or dispersion components be used. + +E: KSpace accuracy must be > 0 + +The kspace accuracy designated in the input must be greater than zero. + +E: Must use 'kspace_modify gewald' for uncharged system + +UNDOCUMENTED + +E: Cannot (yet) use K-space slab correction with compute group/group for triclinic systems + +This option is not yet supported. + +*/ From 6b4303c405b9fa0f39eb69fcd8a1b53e66936618 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 24 Sep 2018 16:40:59 -0600 Subject: [PATCH 0048/1242] Commit2 JT 092418 - initialized g_ewald before Newton solver - mu2 is now adim in ewald_dipole_spin --- examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 2 +- examples/SPIN/pppm_spin/in.spin.ewald_spin | 4 ++-- src/KSPACE/ewald_dipole.cpp | 9 +++++++++ src/KSPACE/ewald_dipole_spin.cpp | 12 +++++++++++- 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole index c2c49e3caf..86ac5198b0 100644 --- a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole +++ b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole @@ -28,7 +28,7 @@ pair_coeff * * 0.0 0.0 #kspace_style pppm/disp 1.0e-4 #kspace_style pppm/dipole 1.0e-4 kspace_style ewald/dipole 1.0e-4 -kspace_modify gewald 0.1 +#kspace_modify gewald 0.1 neighbor 0.3 bin neigh_modify every 2 delay 4 check yes diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin index d9ca46b27a..f2192676c7 100644 --- a/examples/SPIN/pppm_spin/in.spin.ewald_spin +++ b/examples/SPIN/pppm_spin/in.spin.ewald_spin @@ -36,8 +36,8 @@ neigh_modify every 10 check yes delay 20 #kspace_style pppm/dipole/spin 1.0e-4 #kspace_style ewald/dipole/spin 1.0e-4 -kspace_style ewald/dipole/spin 1.0e-2 -kspace_modify mesh 32 32 32 +kspace_style ewald/dipole/spin 1.0e-4 +#kspace_modify mesh 32 32 32 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 42d850dcc2..c3a3818013 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -163,6 +163,15 @@ void EwaldDipole::init() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + + // initial guess with old method + + g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*mu2); + if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; + else g_ewald = sqrt(-log(g_ewald)) / cutoff; + + // try Newton solver + double g_ewald_new = NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 5522b18e03..43b9b32c76 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -164,6 +164,15 @@ void EwaldDipoleSpin::init() if (!gewaldflag) { if (accuracy <= 0.0) error->all(FLERR,"KSpace accuracy must be > 0"); + + // initial guess with old method + + g_ewald = accuracy*sqrt(natoms*cutoff*xprd*yprd*zprd) / (2.0*mu2); + if (g_ewald >= 1.0) g_ewald = (1.35 - 0.15*log(accuracy))/cutoff; + else g_ewald = sqrt(-log(g_ewald)) / cutoff; + + // try Newton solver + double g_ewald_new = NewtonSolve(g_ewald,cutoff,natoms,xprd*yprd*zprd,mu2); if (g_ewald_new > 0.0) g_ewald = g_ewald_new; @@ -887,7 +896,8 @@ void EwaldDipoleSpin::spsum_musq() MPI_Allreduce(&musum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&musqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); - mu2 = musqsum * mub2mu0; + //mu2 = musqsum * mub2mu0; + mu2 = musqsum; } if (mu2 == 0 && comm->me == 0) From 19aaf294e560e1a0b70699428736e0ef3f003fab Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 27 Sep 2018 10:46:52 -0600 Subject: [PATCH 0049/1242] Commit JT 092718 - renamed pair/spin/long functions - started to work on debugging ewald_dipole (force errors) --- examples/SPIN/pppm_spin/in.spin.ewald_spin | 27 ++-- examples/SPIN/pppm_spin/in.spin.pppm_spin | 17 ++- .../SPIN/pppm_spin/in.spin.spin_dipolar_cut | 18 +-- src/KSPACE/ewald_dipole.cpp | 18 ++- src/KSPACE/ewald_dipole_spin.cpp | 16 ++- src/KSPACE/pppm_dipole_spin.cpp | 13 +- src/SPIN/pair_spin_dipolar_cut.cpp | 30 +++-- ...in_long.cpp => pair_spin_dipolar_long.cpp} | 57 ++++----- ...r_spin_long.h => pair_spin_dipolar_long.h} | 12 +- ...p.cpp => pair_spin_dipolar_long_qsymp.cpp} | 119 +++++------------- ...qsymp.h => pair_spin_dipolar_long_qsymp.h} | 12 +- 11 files changed, 153 insertions(+), 186 deletions(-) rename src/SPIN/{pair_spin_long.cpp => pair_spin_dipolar_long.cpp} (91%) rename src/SPIN/{pair_spin_long.h => pair_spin_dipolar_long.h} (90%) rename src/SPIN/{pair_spin_long_qsymp.cpp => pair_spin_dipolar_long_qsymp.cpp} (82%) rename src/SPIN/{pair_spin_long_qsymp.h => pair_spin_dipolar_long_qsymp.h} (89%) diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin index f2192676c7..c0ce74dd77 100644 --- a/examples/SPIN/pppm_spin/in.spin.ewald_spin +++ b/examples/SPIN/pppm_spin/in.spin.ewald_spin @@ -19,30 +19,30 @@ create_atoms 1 box mass 1 58.93 -#set group all spin/random 31 1.72 -set group all spin 1.72 0.0 0.0 1.0 -velocity all create 100 4928459 rot yes dist gaussian +set group all spin/random 31 1.72 +#set group all spin 1.72 0.0 0.0 1.0 +#velocity all create 100 4928459 rot yes dist gaussian -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 #pair_coeff * * spin/long/qsymp long 8.0 -pair_coeff * * spin/long long 8.0 +pair_style spin/dipolar/long 8.0 +pair_coeff * * long 8.0 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 -#kspace_style pppm/dipole/spin 1.0e-4 -#kspace_style ewald/dipole/spin 1.0e-4 -kspace_style ewald/dipole/spin 1.0e-4 -#kspace_modify mesh 32 32 32 +kspace_style ewald/dipole/spin 1.0e-4 +#kspace_modify mesh 32 32 32 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 -fix 3 all nve/spin lattice yes +#fix 3 all nve/spin lattice yes +fix 3 all nve/spin lattice no timestep 0.0001 @@ -57,7 +57,8 @@ variable magnorm equal c_out_mag[4] variable emag equal c_out_mag[5] variable tmag equal c_out_mag[6] -thermo_style custom step time v_magnorm v_emag temp etotal +thermo_style custom step time v_magnorm v_tmag temp v_emag ke pe etotal +#thermo_style custom step time v_magnorm v_emag temp etotal thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin index 9e57797f55..6762fe6fab 100644 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -23,19 +23,18 @@ mass 1 58.93 set group all spin 1.72 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long/qsymp 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long/qsymp 8.0 pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * spin/long/qsymp long 8.0 -#pair_coeff * * spin/long long 8.0 +#pair_coeff * * spin/dipolar/long/qsymp long 8.0 +pair_coeff * * spin/dipolar/long long 8.0 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 -kspace_style pppm/dipole/spin 1.0e-4 -kspace_modify mesh 32 32 32 +kspace_style pppm/dipole/spin 1.0e-4 +#kspace_modify mesh 32 32 32 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 @@ -61,5 +60,5 @@ thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -#run 20000 -run 1 +run 20000 +#run 1 diff --git a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut index 838181e6d8..b265c4413e 100644 --- a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut +++ b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut @@ -19,16 +19,17 @@ create_atoms 1 box mass 1 58.93 -#set group all spin/random 31 1.72 -set group all spin 1.72 0.0 0.0 1.0 -velocity all create 100 4928459 rot yes dist gaussian +set group all spin/random 31 1.72 +#set group all spin 1.72 0.0 0.0 1.0 +#velocity all create 100 4928459 rot yes dist gaussian #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 -pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 +pair_style spin/dipolar/cut 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * spin/dipolar/cut long 8.0 +#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * long 8.0 #pair_coeff * * spin/long long 8.0 neighbor 0.1 bin @@ -37,7 +38,8 @@ neigh_modify every 10 check yes delay 20 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 -fix 3 all nve/spin lattice yes +#fix 3 all nve/spin lattice yes +fix 3 all nve/spin lattice no timestep 0.0001 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index c3a3818013..ea05889f52 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -449,12 +449,19 @@ void EwaldDipole::compute(int eflag, int vflag) exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; + // mu dot k product + + //muik = mu[i][0]*kx + mu[i][1]*ky + mu[i][2]*kz; + + // taking im of struct_fact x exp(i*k*ri) (for force calc.) partial = (muk[k][i])*(expim*sfacrl_all[k] + exprl*sfacim_all[k]); - ek[i][0] += partial*eg[k][0]; - ek[i][1] += partial*eg[k][1]; - ek[i][2] += partial*eg[k][2]; + //partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); + //partial = muik * (expim*sfacrl_all[k] + exprl*sfacim_all[k]); + ek[i][0] += partial * eg[k][0]; + ek[i][1] += partial * eg[k][1]; + ek[i][2] += partial * eg[k][2]; // compute field for torque calculation @@ -493,6 +500,9 @@ void EwaldDipole::compute(int eflag, int vflag) f[i][0] += muscale * ek[i][0]; f[i][1] += muscale * ek[i][1]; if (slabflag != 2) f[i][2] += muscale * ek[i][2]; + //f[i][0] -= muscale * ek[i][0]; + //f[i][1] -= muscale * ek[i][1]; + //if (slabflag != 2) f[i][2] -= muscale * ek[i][2]; t[i][0] += -mu[i][1]*tk[i][2] + mu[i][2]*tk[i][1]; t[i][1] += -mu[i][2]*tk[i][0] + mu[i][0]*tk[i][2]; if (slabflag != 2) t[i][2] += -mu[i][0]*tk[i][1] + mu[i][1]*tk[i][0]; @@ -545,7 +555,7 @@ void EwaldDipole::compute(int eflag, int vflag) } /* ---------------------------------------------------------------------- - compute the + compute the struc. factors and mu dot k products ------------------------------------------------------------------------- */ void EwaldDipole::eik_dot_r() diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 43b9b32c76..9a61d9cbe1 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -50,11 +50,11 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp, int narg, char **arg) : dipoleflag = 0; spinflag = 1; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } /* ---------------------------------------------------------------------- @@ -500,6 +500,9 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) const double spscale2 = mub2mu0hbinv * scale; //const double muscale = qqrd2e * scale; + printf("test ek: %g %g %g \n",ek[0][0],ek[0][1],ek[0][2]); + printf("test tk: %g %g %g \n",tk[0][0],tk[0][1],tk[0][2]); + for (i = 0; i < nlocal; i++) { f[i][0] += spscale * ek[i][0]; f[i][1] += spscale * ek[i][1]; @@ -509,6 +512,9 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) if (slabflag != 2) fm_long[i][2] += spscale2 * tk[i][3]; } + printf("test f_l: %g %g %g \n",f[0][0],f[0][1],f[0][2]); + printf("test fm_l: %g %g %g \n",fm_long[0][0],fm_long[0][1],fm_long[0][2]); + // sum global energy across Kspace vevs and add in volume-dependent term // taking the re-part of struct_fact_i x struct_fact_j // substracting self energy and scaling diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index aa85c5d289..e66ab4903e 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -69,11 +69,11 @@ PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp, int narg, char **arg) : dipoleflag = 0; spinflag = 1; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } /* ---------------------------------------------------------------------- @@ -746,7 +746,8 @@ void PPPMDipoleSpin::spsum_spsq() MPI_Allreduce(&spsum_local,&musum,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&spsqsum_local,&musqsum,1,MPI_DOUBLE,MPI_SUM,world); - mu2 = musqsum * mub2mu0; + //mu2 = musqsum * mub2mu0; + mu2 = musqsum; } if (mu2 == 0 && comm->me == 0) diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp index f686d12926..b2c0a1ab11 100644 --- a/src/SPIN/pair_spin_dipolar_cut.cpp +++ b/src/SPIN/pair_spin_dipolar_cut.cpp @@ -13,7 +13,7 @@ /* ------------------------------------------------------------------------ Contributing authors: Julien Tranchida (SNL) - Aidan Thompson (SNL) + Stan Moore (SNL) Please cite the related publication: Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). @@ -64,11 +64,13 @@ lockfixnvespin(NULL) no_virial_fdotr_compute = 1; lattice_flag = 0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + + //printf("hbar: %g, mub2mu0hbinv: %g \n",hbar,mub2mu0hbinv); } @@ -391,7 +393,9 @@ void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); } } - + + //printf("test fm: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); + //fmi[0] *= mub2mu0hbinv; //fmi[1] *= mub2mu0hbinv; //fmi[2] *= mub2mu0hbinv; @@ -405,15 +409,15 @@ void PairSpinDipolarCut::compute_dipolar(int i, int j, double rij[3], double fmi[3], double spi[4], double spj[4], double r3inv) { double sjdotr; - double gigjri2,pre; + double gigjri3,pre; sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - gigjri2 = (spi[3] * spj[3])*r3inv; - pre = mub2mu0hbinv * gigjri2 / 4.0 / MY_PI; + gigjri3 = (spi[3] * spj[3])*r3inv; + pre = mub2mu0hbinv * gigjri3 / 4.0 / MY_PI; - fmi[0] += pre * gigjri2 * (3.0 * sjdotr *rij[0] - spj[0]); - fmi[1] += pre * gigjri2 * (3.0 * sjdotr *rij[1] - spj[1]); - fmi[2] += pre * gigjri2 * (3.0 * sjdotr *rij[2] - spj[2]); + fmi[0] += pre * gigjri3 * (3.0 * sjdotr *rij[0] - spj[0]); + fmi[1] += pre * gigjri3 * (3.0 * sjdotr *rij[1] - spj[1]); + fmi[2] += pre * gigjri3 * (3.0 * sjdotr *rij[2] - spj[2]); } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/pair_spin_long.cpp b/src/SPIN/pair_spin_dipolar_long.cpp similarity index 91% rename from src/SPIN/pair_spin_long.cpp rename to src/SPIN/pair_spin_dipolar_long.cpp index d7ecdf5edd..c1030c92d7 100644 --- a/src/SPIN/pair_spin_long.cpp +++ b/src/SPIN/pair_spin_dipolar_long.cpp @@ -13,12 +13,7 @@ /* ------------------------------------------------------------------------ Contributing authors: Julien Tranchida (SNL) - Aidan Thompson (SNL) - - Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. Journal of Computational Physics. + Stan Moore (SNL) ------------------------------------------------------------------------- */ #include @@ -26,7 +21,7 @@ #include #include -#include "pair_spin_long.h" +#include "pair_spin_dipolar_long.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -55,7 +50,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairSpinLong::PairSpinLong(LAMMPS *lmp) : PairSpin(lmp), +PairSpinDipolarLong::PairSpinDipolarLong(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; @@ -64,11 +59,11 @@ lockfixnvespin(NULL) no_virial_fdotr_compute = 1; lattice_flag = 0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -76,7 +71,7 @@ lockfixnvespin(NULL) free all arrays ------------------------------------------------------------------------- */ -PairSpinLong::~PairSpinLong() +PairSpinDipolarLong::~PairSpinDipolarLong() { if (allocated) { memory->destroy(setflag); @@ -89,7 +84,7 @@ PairSpinLong::~PairSpinLong() global settings ------------------------------------------------------------------------- */ -void PairSpinLong::settings(int narg, char **arg) +void PairSpinDipolarLong::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR,"Incorrect args in pair_style command"); @@ -118,7 +113,7 @@ void PairSpinLong::settings(int narg, char **arg) set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairSpinLong::coeff(int narg, char **arg) +void PairSpinDipolarLong::coeff(int narg, char **arg) { if (!allocated) allocate(); @@ -151,7 +146,7 @@ void PairSpinLong::coeff(int narg, char **arg) init specific to this pair style ------------------------------------------------------------------------- */ -void PairSpinLong::init_style() +void PairSpinDipolarLong::init_style() { if (!atom->sp_flag) error->all(FLERR,"Pair spin requires atom/spin style"); @@ -194,7 +189,7 @@ void PairSpinLong::init_style() init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairSpinLong::init_one(int i, int j) +double PairSpinDipolarLong::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); @@ -207,7 +202,7 @@ double PairSpinLong::init_one(int i, int j) extract the larger cutoff if "cut" or "cut_coul" ------------------------------------------------------------------------- */ -void *PairSpinLong::extract(const char *str, int &dim) +void *PairSpinDipolarLong::extract(const char *str, int &dim) { if (strcmp(str,"cut") == 0) { dim = 0; @@ -230,7 +225,7 @@ void *PairSpinLong::extract(const char *str, int &dim) /* ---------------------------------------------------------------------- */ -void PairSpinLong::compute(int eflag, int vflag) +void PairSpinDipolarLong::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -357,7 +352,7 @@ void PairSpinLong::compute(int eflag, int vflag) update the pair interaction fmi acting on the spin ii ------------------------------------------------------------------------- */ -void PairSpinLong::compute_single_pair(int ii, double fmi[3]) +void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -436,18 +431,20 @@ void PairSpinLong::compute_single_pair(int ii, double fmi[3]) } // adding the kspace components to fm - + + //printf("test fm before: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); + //printf("test fm_long: %g, %g, %g \n",fm_long[i][0],fm_long[i][1],fm_long[i][2]); fmi[0] += fm_long[i][0]; fmi[1] += fm_long[i][1]; fmi[2] += fm_long[i][2]; - + //printf("test fm after: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); } /* ---------------------------------------------------------------------- compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinLong::compute_long(int i, int j, double rij[3], +void PairSpinDipolarLong::compute_long(int i, int j, double rij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { double sjdotr; @@ -469,7 +466,7 @@ void PairSpinLong::compute_long(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinLong::compute_long_mech(int i, int j, double rij[3], +void PairSpinDipolarLong::compute_long_mech(int i, int j, double rij[3], double bij[4], double fi[3], double spi[3], double spj[3]) { double sdots,sidotr,sjdotr,b2,b3; @@ -499,7 +496,7 @@ void PairSpinLong::compute_long_mech(int i, int j, double rij[3], allocate all arrays ------------------------------------------------------------------------- */ -void PairSpinLong::allocate() +void PairSpinDipolarLong::allocate() { allocated = 1; int n = atom->ntypes; @@ -517,7 +514,7 @@ void PairSpinLong::allocate() proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinLong::write_restart(FILE *fp) +void PairSpinDipolarLong::write_restart(FILE *fp) { write_restart_settings(fp); @@ -536,7 +533,7 @@ void PairSpinLong::write_restart(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinLong::read_restart(FILE *fp) +void PairSpinDipolarLong::read_restart(FILE *fp) { read_restart_settings(fp); @@ -562,7 +559,7 @@ void PairSpinLong::read_restart(FILE *fp) proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinLong::write_restart_settings(FILE *fp) +void PairSpinDipolarLong::write_restart_settings(FILE *fp) { fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); @@ -572,7 +569,7 @@ void PairSpinLong::write_restart_settings(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinLong::read_restart_settings(FILE *fp) +void PairSpinDipolarLong::read_restart_settings(FILE *fp) { if (comm->me == 0) { fread(&cut_spin_long_global,sizeof(double),1,fp); diff --git a/src/SPIN/pair_spin_long.h b/src/SPIN/pair_spin_dipolar_long.h similarity index 90% rename from src/SPIN/pair_spin_long.h rename to src/SPIN/pair_spin_dipolar_long.h index 0cdf6d2b80..191e983328 100644 --- a/src/SPIN/pair_spin_long.h +++ b/src/SPIN/pair_spin_dipolar_long.h @@ -13,24 +13,24 @@ #ifdef PAIR_CLASS -PairStyle(spin/long,PairSpinLong) +PairStyle(spin/dipolar/long,PairSpinDipolarLong) #else -#ifndef LMP_PAIR_SPIN_LONG_H -#define LMP_PAIR_SPIN_LONG_H +#ifndef LMP_PAIR_SPIN_DIPOLAR_LONG_H +#define LMP_PAIR_SPIN_DIPOLAR_LONG_H #include "pair_spin.h" namespace LAMMPS_NS { -class PairSpinLong : public PairSpin { +class PairSpinDipolarLong : public PairSpin { public: double cut_coul; double **sigma; - PairSpinLong(class LAMMPS *); - ~PairSpinLong(); + PairSpinDipolarLong(class LAMMPS *); + ~PairSpinDipolarLong(); void settings(int, char **); void coeff(int, char **); double init_one(int, int); diff --git a/src/SPIN/pair_spin_long_qsymp.cpp b/src/SPIN/pair_spin_dipolar_long_qsymp.cpp similarity index 82% rename from src/SPIN/pair_spin_long_qsymp.cpp rename to src/SPIN/pair_spin_dipolar_long_qsymp.cpp index 3b499d0ef7..63876ba97a 100644 --- a/src/SPIN/pair_spin_long_qsymp.cpp +++ b/src/SPIN/pair_spin_dipolar_long_qsymp.cpp @@ -13,12 +13,7 @@ /* ------------------------------------------------------------------------ Contributing authors: Julien Tranchida (SNL) - Aidan Thompson (SNL) - - Please cite the related publication: - Tranchida, J., Plimpton, S. J., Thibaudeau, P., & Thompson, A. P. (2018). - Massively parallel symplectic algorithm for coupled magnetic spin dynamics - and molecular dynamics. Journal of Computational Physics. + Stan Moore (SNL) ------------------------------------------------------------------------- */ #include @@ -26,7 +21,7 @@ #include #include -#include "pair_spin_long_qsymp.h" +#include "pair_spin_dipolar_long_qsymp.h" #include "atom.h" #include "comm.h" #include "neighbor.h" @@ -55,7 +50,7 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -PairSpinLongQsymp::PairSpinLongQsymp(LAMMPS *lmp) : PairSpin(lmp), +PairSpinDipolarLongQsymp::PairSpinDipolarLongQsymp(LAMMPS *lmp) : PairSpin(lmp), lockfixnvespin(NULL) { single_enable = 0; @@ -64,11 +59,11 @@ lockfixnvespin(NULL) no_virial_fdotr_compute = 1; lattice_flag = 0; - hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0; // in eV - mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz + hbar = force->hplanck/MY_2PI; // eV/(rad.THz) + mub = 5.78901e-5; // in eV/T + mu_0 = 1.2566370614e-6; // in T.m/A + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -76,7 +71,7 @@ lockfixnvespin(NULL) free all arrays ------------------------------------------------------------------------- */ -PairSpinLongQsymp::~PairSpinLongQsymp() +PairSpinDipolarLongQsymp::~PairSpinDipolarLongQsymp() { if (allocated) { memory->destroy(setflag); @@ -89,7 +84,7 @@ PairSpinLongQsymp::~PairSpinLongQsymp() global settings ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::settings(int narg, char **arg) +void PairSpinDipolarLongQsymp::settings(int narg, char **arg) { if (narg < 1 || narg > 2) error->all(FLERR,"Incorrect args in pair_style command"); @@ -118,7 +113,7 @@ void PairSpinLongQsymp::settings(int narg, char **arg) set coeffs for one or more type pairs ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::coeff(int narg, char **arg) +void PairSpinDipolarLongQsymp::coeff(int narg, char **arg) { if (!allocated) allocate(); @@ -151,7 +146,7 @@ void PairSpinLongQsymp::coeff(int narg, char **arg) init specific to this pair style ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::init_style() +void PairSpinDipolarLongQsymp::init_style() { if (!atom->sp_flag) error->all(FLERR,"Pair spin requires atom/spin style"); @@ -194,7 +189,7 @@ void PairSpinLongQsymp::init_style() init for one type pair i,j and corresponding j,i ------------------------------------------------------------------------- */ -double PairSpinLongQsymp::init_one(int i, int j) +double PairSpinDipolarLongQsymp::init_one(int i, int j) { if (setflag[i][j] == 0) error->all(FLERR,"All pair coeffs are not set"); @@ -207,7 +202,7 @@ double PairSpinLongQsymp::init_one(int i, int j) extract the larger cutoff if "cut" or "cut_coul" ------------------------------------------------------------------------- */ -void *PairSpinLongQsymp::extract(const char *str, int &dim) +void *PairSpinDipolarLongQsymp::extract(const char *str, int &dim) { if (strcmp(str,"cut") == 0) { dim = 0; @@ -230,7 +225,7 @@ void *PairSpinLongQsymp::extract(const char *str, int &dim) /* ---------------------------------------------------------------------- */ -void PairSpinLongQsymp::compute(int eflag, int vflag) +void PairSpinDipolarLongQsymp::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; @@ -359,9 +354,9 @@ void PairSpinLongQsymp::compute(int eflag, int vflag) // correction of the fm_kspace - fm_long[i][0] -= mub2mu0hbinv * fmx_erf_s; - fm_long[i][1] -= mub2mu0hbinv * fmy_erf_s; - fm_long[i][2] -= mub2mu0hbinv * fmz_erf_s; + fm_long[i][0] -= (mub2mu0hbinv * fmx_erf_s); + fm_long[i][1] -= (mub2mu0hbinv * fmy_erf_s); + fm_long[i][2] -= (mub2mu0hbinv * fmz_erf_s); if (newton_pair || j < nlocal) { f[j][0] -= fi[0]; @@ -391,21 +386,17 @@ void PairSpinLongQsymp::compute(int eflag, int vflag) removing erf(r)/r (for r in [0,rc]) from the kspace force ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) +void PairSpinDipolarLongQsymp::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; - double r,rinv,r2inv,r3inv,rsq; - double grij,expm2,t,erf; + double rinv,r2inv,r3inv,rsq; double sjdotr,sjdotrr3inv; double b1,b2,gigj; double bij[4],xi[3],rij[3]; double spi[4],spj[4]; double local_cut2; - double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; - //double fmx_erf_s,fmy_erf_s,fmz_erf_s; double fmx_s,fmy_s,fmz_s; - //double fmx_long,fmy_long,fmz_long; double **x = atom->x; double **sp = atom->sp; @@ -416,10 +407,6 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) numneigh = list->numneigh; firstneigh = list->firstneigh; - pre1 = 2.0 * g_ewald / MY_PIS; - pre2 = 4.0 * pow(g_ewald,3.0) / MY_PIS; - pre3 = 8.0 * pow(g_ewald,5.0) / MY_PIS; - // computation of the exchange interaction // loop over neighbors of atom i @@ -427,16 +414,11 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) xi[0] = x[i][0]; xi[1] = x[i][1]; xi[2] = x[i][2]; - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; spi[3] = sp[i][3]; jlist = firstneigh[i]; jnum = numneigh[i]; itype = type[i]; - //fmx_long = fmy_long = fmz_long = 0.0; - //fmx_erf_s = fmy_erf_s = fmz_erf_s = 0.0; fmx_s = fmy_s = fmz_s = 0.0; for (jj = 0; jj < jnum; jj++) { @@ -449,8 +431,6 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) spj[2] = sp[j][2]; spj[3] = sp[j][3]; - bij[0] = bij[1] = bij[2] = bij[3] = 0.0; - rij[0] = x[j][0] - xi[0]; rij[1] = x[j][1] - xi[1]; rij[2] = x[j][2] - xi[2]; @@ -458,58 +438,25 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; + // evaluating full dipolar interaction on [0,rc] + if (rsq < local_cut2) { r2inv = 1.0/rsq; rinv = sqrt(r2inv); r3inv = r2inv*rinv; - - r = sqrt(rsq); - //grij = g_ewald * r; - //expm2 = exp(-grij*grij); - //t = 1.0 / (1.0 + EWALD_P*grij); - - // evaluating erf instead of erfc - - //erf = 1.0 - t * (A1+t*(A2+t*(A3+t*(A4+t*A5)))) * expm2; - - //bij[0] = erf * rinv; - //bij[1] = (bij[0] + pre1*expm2) * r2inv; - //bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; - //bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - - //gigj = spi[3] * spj[3]; - //sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - - //b1 = bij[1]; - //b2 = bij[2]; - - // evaluating short-range correction to the kspace part on [0,rc] - - //fmx_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[0] - b1 * spj[0]); - //fmy_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[1] - b1 * spj[1]); - //fmz_erf_s += mub2mu0hbinv * gigj * (b2 * sjdotr * rij[2] - b1 * spj[2]); - - // evaluating real dipolar interaction on [0,rc] - + + gigj = spi[3] * spj[3]; + sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; sjdotrr3inv = 3.0 * sjdotr * r3inv; + fmx_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[0] - sp[i][0]/r3inv); fmy_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[1] - sp[i][1]/r3inv); fmz_s += mub2mu0hbinv * gigj * (sjdotrr3inv * rij[2] - sp[i][2]/r3inv); - } } - // removing short-range erf function from kspace force - - //fmx_long = fm_long[i][0] - fmx_erf_s; - //fmy_long = fm_long[i][1] - fmy_erf_s; - //fmz_long = fm_long[i][2] - fmz_erf_s; - // adding truncated kspace force and short-range full force - //fmi[0] += fmx_s + fmx_long; - //fmi[1] += fmy_s + fmy_long; - //fmi[2] += fmz_s + fmz_long; fmi[0] += (fmx_s + fm_long[i][0]); fmi[1] += (fmy_s + fm_long[i][1]); fmi[2] += (fmz_s + fm_long[i][2]); @@ -519,7 +466,7 @@ void PairSpinLongQsymp::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::compute_long(int i, int j, double rij[3], +void PairSpinDipolarLongQsymp::compute_long(int i, int j, double rij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { double sjdotr; @@ -541,7 +488,7 @@ void PairSpinLongQsymp::compute_long(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::compute_long_mech(int i, int j, double rij[3], +void PairSpinDipolarLongQsymp::compute_long_mech(int i, int j, double rij[3], double bij[4], double fi[3], double spi[3], double spj[3]) { double sdots,sidotr,sjdotr,b2,b3; @@ -571,7 +518,7 @@ void PairSpinLongQsymp::compute_long_mech(int i, int j, double rij[3], allocate all arrays ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::allocate() +void PairSpinDipolarLongQsymp::allocate() { allocated = 1; int n = atom->ntypes; @@ -589,7 +536,7 @@ void PairSpinLongQsymp::allocate() proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::write_restart(FILE *fp) +void PairSpinDipolarLongQsymp::write_restart(FILE *fp) { write_restart_settings(fp); @@ -608,7 +555,7 @@ void PairSpinLongQsymp::write_restart(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::read_restart(FILE *fp) +void PairSpinDipolarLongQsymp::read_restart(FILE *fp) { read_restart_settings(fp); @@ -634,7 +581,7 @@ void PairSpinLongQsymp::read_restart(FILE *fp) proc 0 writes to restart file ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::write_restart_settings(FILE *fp) +void PairSpinDipolarLongQsymp::write_restart_settings(FILE *fp) { fwrite(&cut_spin_long_global,sizeof(double),1,fp); fwrite(&mix_flag,sizeof(int),1,fp); @@ -644,7 +591,7 @@ void PairSpinLongQsymp::write_restart_settings(FILE *fp) proc 0 reads from restart file, bcasts ------------------------------------------------------------------------- */ -void PairSpinLongQsymp::read_restart_settings(FILE *fp) +void PairSpinDipolarLongQsymp::read_restart_settings(FILE *fp) { if (comm->me == 0) { fread(&cut_spin_long_global,sizeof(double),1,fp); diff --git a/src/SPIN/pair_spin_long_qsymp.h b/src/SPIN/pair_spin_dipolar_long_qsymp.h similarity index 89% rename from src/SPIN/pair_spin_long_qsymp.h rename to src/SPIN/pair_spin_dipolar_long_qsymp.h index ae8c5a3864..28867b5229 100644 --- a/src/SPIN/pair_spin_long_qsymp.h +++ b/src/SPIN/pair_spin_dipolar_long_qsymp.h @@ -13,24 +13,24 @@ #ifdef PAIR_CLASS -PairStyle(spin/long/qsymp,PairSpinLongQsymp) +PairStyle(spin/dipolar/long/qsymp,PairSpinDipolarLongQsymp) #else -#ifndef LMP_PAIR_SPIN_LONG_QSYMP_H -#define LMP_PAIR_SPIN_LONG_QSYMP_H +#ifndef LMP_PAIR_SPIN_DIPOLAR_LONG_QSYMP_H +#define LMP_PAIR_SPIN_DIPOLAR_LONG_QSYMP_H #include "pair_spin.h" namespace LAMMPS_NS { -class PairSpinLongQsymp : public PairSpin { +class PairSpinDipolarLongQsymp : public PairSpin { public: double cut_coul; double **sigma; - PairSpinLongQsymp(class LAMMPS *); - ~PairSpinLongQsymp(); + PairSpinDipolarLongQsymp(class LAMMPS *); + ~PairSpinDipolarLongQsymp(); void settings(int, char **); void coeff(int, char **); double init_one(int, int); From b9d12f0aa0148fa1777527e307facac7893b2de9 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 1 Oct 2018 22:01:12 -0500 Subject: [PATCH 0050/1242] Update function pointer name --- src/KIM/pair_kim.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index e209cb1202..eca3f6f1d7 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -735,7 +735,7 @@ void PairKIM::kim_init() kimerror = pargs->SetCallbackPointer( KIM::COMPUTE_CALLBACK_NAME::GetNeighborList, KIM::LANGUAGE_NAME::cpp, - reinterpret_cast(get_neigh), + reinterpret_cast(get_neigh), reinterpret_cast(this)); if (kimerror) From a745a0aed0846b8deccad6bdeadb263594f06555 Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 3 Oct 2018 10:23:58 -0600 Subject: [PATCH 0051/1242] Commit JT 100318 - correction forces ewald_dipole - correction mag. dipolar energy --- examples/SPIN/pppm_spin/in.spin.ewald_spin | 4 +- src/KSPACE/ewald_dipole.cpp | 12 +--- src/KSPACE/ewald_dipole_spin.cpp | 66 ++++------------------ src/KSPACE/pppm_dipole_spin.cpp | 8 ++- src/SPIN/pair_spin_dipolar_cut.cpp | 8 ++- src/SPIN/pair_spin_dipolar_long.cpp | 9 ++- src/SPIN/pair_spin_dipolar_long_qsymp.cpp | 8 ++- 7 files changed, 37 insertions(+), 78 deletions(-) diff --git a/examples/SPIN/pppm_spin/in.spin.ewald_spin b/examples/SPIN/pppm_spin/in.spin.ewald_spin index c0ce74dd77..889ed086f8 100644 --- a/examples/SPIN/pppm_spin/in.spin.ewald_spin +++ b/examples/SPIN/pppm_spin/in.spin.ewald_spin @@ -44,7 +44,7 @@ fix 2 all langevin/spin 0.0 0.0 21 #fix 3 all nve/spin lattice yes fix 3 all nve/spin lattice no -timestep 0.0001 +timestep 0.001 compute out_mag all compute/spin @@ -65,4 +65,4 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] #run 20000 -run 1 +run 1000 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index ea05889f52..5579ba3840 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -449,16 +449,9 @@ void EwaldDipole::compute(int eflag, int vflag) exprl = cs[kx][0][i]*cypz - sn[kx][0][i]*sypz; expim = sn[kx][0][i]*cypz + cs[kx][0][i]*sypz; - // mu dot k product - - //muik = mu[i][0]*kx + mu[i][1]*ky + mu[i][2]*kz; - - // taking im of struct_fact x exp(i*k*ri) (for force calc.) - partial = (muk[k][i])*(expim*sfacrl_all[k] + exprl*sfacim_all[k]); - //partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); - //partial = muik * (expim*sfacrl_all[k] + exprl*sfacim_all[k]); + partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial * eg[k][0]; ek[i][1] += partial * eg[k][1]; ek[i][2] += partial * eg[k][2]; @@ -500,9 +493,6 @@ void EwaldDipole::compute(int eflag, int vflag) f[i][0] += muscale * ek[i][0]; f[i][1] += muscale * ek[i][1]; if (slabflag != 2) f[i][2] += muscale * ek[i][2]; - //f[i][0] -= muscale * ek[i][0]; - //f[i][1] -= muscale * ek[i][1]; - //if (slabflag != 2) f[i][2] -= muscale * ek[i][2]; t[i][0] += -mu[i][1]*tk[i][2] + mu[i][2]*tk[i][1]; t[i][1] += -mu[i][2]*tk[i][0] + mu[i][0]*tk[i][2]; if (slabflag != 2) t[i][2] += -mu[i][0]*tk[i][1] + mu[i][1]*tk[i][0]; diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 9a61d9cbe1..df1acb337d 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -51,9 +51,12 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp, int narg, char **arg) : spinflag = 1; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } @@ -61,12 +64,7 @@ EwaldDipoleSpin::EwaldDipoleSpin(LAMMPS *lmp, int narg, char **arg) : free all memory ------------------------------------------------------------------------- */ -EwaldDipoleSpin::~EwaldDipoleSpin() -{ - //memory->destroy(muk); - //memory->destroy(tk); - //memory->destroy(vc); -} +EwaldDipoleSpin::~EwaldDipoleSpin() {} /* ---------------------------------------------------------------------- called once before run @@ -81,12 +79,7 @@ void EwaldDipoleSpin::init() // error check - //dipoleflag = atom->mu?1:0; spinflag = atom->sp?1:0; - //qsum_qsq(0); // q[i] might not be declared ? - - //if (dipoleflag && q2) - // error->all(FLERR,"Cannot (yet) use charges with Kspace style EwaldDipoleSpin"); triclinic_check(); @@ -100,7 +93,6 @@ void EwaldDipoleSpin::init() error->all(FLERR,"Cannot use EwaldDipoleSpin with 2d simulation"); if (!atom->sp) error->all(FLERR,"Kspace style requires atom attribute sp"); -//if (!atom->q_flag) error->all(FLERR,"Kspace style requires atom attribute q"); if ((spinflag && strcmp(update->unit_style,"metal")) != 0) error->all(FLERR,"'metal' units have to be used with spins"); @@ -134,7 +126,6 @@ void EwaldDipoleSpin::init() scale = 1.0; qqrd2e = force->qqrd2e; - //musum_musq(); spsum_musq(); natoms_original = atom->natoms; @@ -343,23 +334,6 @@ void EwaldDipoleSpin::setup() coeffs(); } -/* ---------------------------------------------------------------------- - compute dipole RMS accuracy for a dimension -------------------------------------------------------------------------- */ - -//double EwaldDipoleSpin::rms_dipole(int km, double prd, bigint natoms) -//{ -// if (natoms == 0) natoms = 1; // avoid division by zero -// -// // error from eq.(46), Wang et al., JCP 115, 6351 (2001) -// -// double value = 8*MY_PI*mu2*g_ewald/volume * -// sqrt(2*MY_PI*km*km*km/(15.0*natoms)) * -// exp(-MY_PI*MY_PI*km*km/(g_ewald*g_ewald*prd*prd)); -// -// return value; -//} - /* ---------------------------------------------------------------------- compute the EwaldDipoleSpin long-range force, energy, virial ------------------------------------------------------------------------- */ @@ -379,7 +353,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // if atom count has changed, update qsum and qsqsum if (atom->natoms != natoms_original) { - //musum_musq(); spsum_musq(); natoms_original = atom->natoms; } @@ -421,8 +394,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) double **f = atom->f; double **fm_long = atom->fm_long; - double **t = atom->torque; - //double **mu = atom->mu; double **sp = atom->sp; int nlocal = atom->nlocal; @@ -456,7 +427,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // taking im of struct_fact x exp(i*k*ri) (for force calc.) - partial = (muk[k][i])*(expim*sfacrl_all[k] + exprl*sfacim_all[k]); + partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial*eg[k][0]; ek[i][1] += partial*eg[k][1]; ek[i][2] += partial*eg[k][2]; @@ -498,10 +469,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) const double spscale = mub2mu0 * scale; const double spscale2 = mub2mu0hbinv * scale; - //const double muscale = qqrd2e * scale; - - printf("test ek: %g %g %g \n",ek[0][0],ek[0][1],ek[0][2]); - printf("test tk: %g %g %g \n",tk[0][0],tk[0][1],tk[0][2]); for (i = 0; i < nlocal; i++) { f[i][0] += spscale * ek[i][0]; @@ -512,8 +479,8 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) if (slabflag != 2) fm_long[i][2] += spscale2 * tk[i][3]; } - printf("test f_l: %g %g %g \n",f[0][0],f[0][1],f[0][2]); - printf("test fm_l: %g %g %g \n",fm_long[0][0],fm_long[0][1],fm_long[0][2]); + //printf("test f_l: %g %g %g \n",f[0][0],f[0][1],f[0][2]); + //printf("test fm_l: %g %g %g \n",fm_long[0][0],fm_long[0][1],fm_long[0][2]); // sum global energy across Kspace vevs and add in volume-dependent term // taking the re-part of struct_fact_i x struct_fact_j @@ -573,11 +540,9 @@ void EwaldDipoleSpin::eik_dot_r() int i,k,l,m,n,ic; double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; double sqk,clpm,slpm; - //double mux, muy, muz; double spx, spy, spz, spi; double **x = atom->x; - //double **mu = atom->mu; double **sp = atom->sp; int nlocal = atom->nlocal; @@ -607,7 +572,6 @@ void EwaldDipoleSpin::eik_dot_r() cs[-1][ic][i] = cs[1][ic][i]; sn[-1][ic][i] = -sn[1][ic][i]; spi = sp[i][ic]*sp[i][3]; - //muk[n][i] = (mu[i][ic]*unitk[ic]); muk[n][i] = (spi*unitk[ic]); cstr1 += muk[n][i]*cs[1][ic][i]; sstr1 += muk[n][i]*sn[1][ic][i]; @@ -634,7 +598,6 @@ void EwaldDipoleSpin::eik_dot_r() sn[-m][ic][i] = -sn[m][ic][i]; spi = sp[i][ic]*sp[i][3]; muk[n][i] = (spi*m*unitk[ic]); - //muk[n][i] = (mu[i][ic]*m*unitk[ic]); cstr1 += muk[n][i]*cs[m][ic][i]; sstr1 += muk[n][i]*sn[m][ic][i]; } @@ -657,8 +620,6 @@ void EwaldDipoleSpin::eik_dot_r() for (i = 0; i < nlocal; i++) { spx = sp[i][0]*sp[i][3]; spy = sp[i][1]*sp[i][3]; - //mux = mu[i][0]; - //muy = mu[i][1]; // dir 1: (k,l,0) muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1]); @@ -691,8 +652,6 @@ void EwaldDipoleSpin::eik_dot_r() for (i = 0; i < nlocal; i++) { spy = sp[i][1]*sp[i][3]; spz = sp[i][2]*sp[i][3]; - //muy = mu[i][1]; - //muz = mu[i][2]; // dir 1: (0,l,m) muk[n][i] = (spy*l*unitk[1] + spz*m*unitk[2]); @@ -723,8 +682,6 @@ void EwaldDipoleSpin::eik_dot_r() cstr2 = 0.0; sstr2 = 0.0; for (i = 0; i < nlocal; i++) { - //mux = mu[i][0]; - //muz = mu[i][2]; spx = sp[i][0]*sp[i][3]; spz = sp[i][2]*sp[i][3]; @@ -763,9 +720,6 @@ void EwaldDipoleSpin::eik_dot_r() cstr4 = 0.0; sstr4 = 0.0; for (i = 0; i < nlocal; i++) { - //mux = mu[i][0]; - //muy = mu[i][1]; - //muz = mu[i][2]; spx = sp[i][0]*sp[i][3]; spy = sp[i][1]*sp[i][3]; spz = sp[i][2]*sp[i][3]; diff --git a/src/KSPACE/pppm_dipole_spin.cpp b/src/KSPACE/pppm_dipole_spin.cpp index e66ab4903e..be38a460b2 100644 --- a/src/KSPACE/pppm_dipole_spin.cpp +++ b/src/KSPACE/pppm_dipole_spin.cpp @@ -70,8 +70,12 @@ PPPMDipoleSpin::PPPMDipoleSpin(LAMMPS *lmp, int narg, char **arg) : spinflag = 1; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp index b2c0a1ab11..2c44b25fbf 100644 --- a/src/SPIN/pair_spin_dipolar_cut.cpp +++ b/src/SPIN/pair_spin_dipolar_cut.cpp @@ -65,8 +65,12 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz diff --git a/src/SPIN/pair_spin_dipolar_long.cpp b/src/SPIN/pair_spin_dipolar_long.cpp index c1030c92d7..140b92700c 100644 --- a/src/SPIN/pair_spin_dipolar_long.cpp +++ b/src/SPIN/pair_spin_dipolar_long.cpp @@ -60,9 +60,12 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A - mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz } diff --git a/src/SPIN/pair_spin_dipolar_long_qsymp.cpp b/src/SPIN/pair_spin_dipolar_long_qsymp.cpp index 63876ba97a..4b07b540bc 100644 --- a/src/SPIN/pair_spin_dipolar_long_qsymp.cpp +++ b/src/SPIN/pair_spin_dipolar_long_qsymp.cpp @@ -60,8 +60,12 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - mub = 5.78901e-5; // in eV/T - mu_0 = 1.2566370614e-6; // in T.m/A + //mub = 5.78901e-5; // in eV/T + //mu_0 = 1.2566370614e-6; // in T.m/A + mub = 9.274e-4; // in A.Ang^2 + mu_0 = 785.15; // in eV/Ang/A^2 + mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 + //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz From d5fe8857cc75dd1c140883f7005c9f669c084a82 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 5 Oct 2018 14:01:29 -0600 Subject: [PATCH 0052/1242] Commit JT 100518 - correction torque ewald_dipole - idem ewald_dipole_spin to check --- src/KSPACE/ewald_dipole.cpp | 8 ++++---- src/KSPACE/ewald_dipole_spin.cpp | 5 +---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 5579ba3840..f2124deb4f 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -458,7 +458,7 @@ void EwaldDipole::compute(int eflag, int vflag) // compute field for torque calculation - partial2 = exprl*sfacrl_all[k] - expim*sfacim_all[k]; + partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; tk[i][0] += partial2*eg[k][0]; tk[i][1] += partial2*eg[k][1]; tk[i][2] += partial2*eg[k][2]; @@ -493,9 +493,9 @@ void EwaldDipole::compute(int eflag, int vflag) f[i][0] += muscale * ek[i][0]; f[i][1] += muscale * ek[i][1]; if (slabflag != 2) f[i][2] += muscale * ek[i][2]; - t[i][0] += -mu[i][1]*tk[i][2] + mu[i][2]*tk[i][1]; - t[i][1] += -mu[i][2]*tk[i][0] + mu[i][0]*tk[i][2]; - if (slabflag != 2) t[i][2] += -mu[i][0]*tk[i][1] + mu[i][1]*tk[i][0]; + t[i][0] -= muscale * (mu[i][1]*tk[i][2] - mu[i][2]*tk[i][1]); + t[i][1] -= muscale * (mu[i][2]*tk[i][0] - mu[i][0]*tk[i][2]); + if (slabflag != 2) t[i][2] -= muscale * (mu[i][0]*tk[i][1] - mu[i][1]*tk[i][0]); } // sum global energy across Kspace vevs and add in volume-dependent term diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index df1acb337d..3554f66f36 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -434,7 +434,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // compute field for torque calculation - partial2 = exprl*sfacrl_all[k] - expim*sfacim_all[k]; + partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; tk[i][0] += partial2*eg[k][0]; tk[i][1] += partial2*eg[k][1]; tk[i][2] += partial2*eg[k][2]; @@ -478,9 +478,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) fm_long[i][1] += spscale2 * tk[i][1]; if (slabflag != 2) fm_long[i][2] += spscale2 * tk[i][3]; } - - //printf("test f_l: %g %g %g \n",f[0][0],f[0][1],f[0][2]); - //printf("test fm_l: %g %g %g \n",fm_long[0][0],fm_long[0][1],fm_long[0][2]); // sum global energy across Kspace vevs and add in volume-dependent term // taking the re-part of struct_fact_i x struct_fact_j From 762a4b97acce6917fd8335b2593ed66396c7a68f Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Tue, 30 Oct 2018 21:54:59 -0500 Subject: [PATCH 0053/1242] Revert "pair_kim - no need to comm vatom() values" This reverts commit 9962f941e674e3dd18e76dec4ba5017e98832513. --- src/KIM/pair_kim.cpp | 86 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 5 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index eca3f6f1d7..1bd21884eb 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -486,8 +486,8 @@ void PairKIM::init_style() } - // make sure comm_reverse expects (at most) 3 values when newton is off - if (!lmps_using_newton) comm_reverse_off = 3; + // make sure comm_reverse expects (at most) 9 values when newton is off + if (!lmps_using_newton) comm_reverse_off = 9; // request full neighbor for (int i = 0; i < kim_number_of_neighbor_lists; ++i) @@ -553,7 +553,9 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) m = 0; last = first + n; - if (kim_model_support_for_forces != notSupported) + if ((kim_model_support_for_forces != notSupported) && + ((vflag_atom == 0) || + (kim_model_support_for_particleVirial == notSupported))) { for (i = first; i < last; i++) { @@ -563,6 +565,42 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) } return m; } + else if ((kim_model_support_for_forces != notSupported) && + (vflag_atom == 1) && + (kim_model_support_for_particleVirial != notSupported)) + { + double *va=&(vatom[0][0]); + for (i = first; i < last; i++) + { + buf[m++] = fp[3*i+0]; + buf[m++] = fp[3*i+1]; + buf[m++] = fp[3*i+2]; + + buf[m++] = va[6*i+0]; + buf[m++] = va[6*i+1]; + buf[m++] = va[6*i+2]; + buf[m++] = va[6*i+3]; + buf[m++] = va[6*i+4]; + buf[m++] = va[6*i+5]; + } + return m; + } + else if ((kim_model_support_for_forces == notSupported) && + (vflag_atom == 1) && + (kim_model_support_for_particleVirial != notSupported)) + { + double *va=&(vatom[0][0]); + for (i = first; i < last; i++) + { + buf[m++] = va[6*i+0]; + buf[m++] = va[6*i+1]; + buf[m++] = va[6*i+2]; + buf[m++] = va[6*i+3]; + buf[m++] = va[6*i+4]; + buf[m++] = va[6*i+5]; + } + return m; + } else return 0; } @@ -578,7 +616,9 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) fp = &(atom->f[0][0]); m = 0; - if (kim_model_support_for_forces != notSupported) + if ((kim_model_support_for_forces != notSupported) && + ((vflag_atom == 0) || + (kim_model_support_for_particleVirial == notSupported))) { for (i = 0; i < n; i++) { @@ -588,6 +628,42 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) fp[3*j+2]+= buf[m++]; } } + else if ((kim_model_support_for_forces != notSupported) && + (vflag_atom == 1) && + (kim_model_support_for_particleVirial != notSupported)) + { + double *va=&(vatom[0][0]); + for (i = 0; i < n; i++) + { + j = list[i]; + fp[3*j+0]+= buf[m++]; + fp[3*j+1]+= buf[m++]; + fp[3*j+2]+= buf[m++]; + + va[j*6+0]+=buf[m++]; + va[j*6+1]+=buf[m++]; + va[j*6+2]+=buf[m++]; + va[j*6+3]+=buf[m++]; + va[j*6+4]+=buf[m++]; + va[j*6+5]+=buf[m++]; + } + } + else if ((kim_model_support_for_forces == notSupported) && + (vflag_atom == 1) && + (kim_model_support_for_particleVirial != notSupported)) + { + double *va=&(vatom[0][0]); + for (i = 0; i < n; i++) + { + j = list[i]; + va[j*6+0]+=buf[m++]; + va[j*6+1]+=buf[m++]; + va[j*6+2]+=buf[m++]; + va[j*6+3]+=buf[m++]; + va[j*6+4]+=buf[m++]; + va[j*6+5]+=buf[m++]; + } + } else ;// do nothing @@ -809,7 +885,7 @@ void PairKIM::set_argument_pointers() } else if (kim_model_support_for_particleVirial != notSupported) { - kimerror = kimerror || pargs->SetArgumentPointer(partialParticleVirial, + kimerror = kimerror || pargs->SetArgumentPointer(partialParticleEnergy, &(vatom[0][0])); } From 8dd3bce7c5ae65d56a9c1281d55fa94a683a2e47 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Thu, 1 Nov 2018 19:33:52 -0500 Subject: [PATCH 0054/1242] Update to C KIM_API bindings --- src/KIM/pair_kim.cpp | 320 ++++++++++++++++++++++++------------------- src/KIM/pair_kim.h | 28 ++-- 2 files changed, 195 insertions(+), 153 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 1bd21884eb..072c3a6296 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -50,7 +50,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v2.0.0-beta.1 (and newer) package + Designed for use with the kim-api-v2.0.0-beta.2 (and newer) package ------------------------------------------------------------------------- */ #include @@ -82,17 +82,17 @@ PairKIM::PairKIM(LAMMPS *lmp) : lmps_unique_elements(NULL), lmps_num_unique_elements(0), lmps_units(METAL), - lengthUnit(KIM::LENGTH_UNIT::unused), - energyUnit(KIM::ENERGY_UNIT::unused), - chargeUnit(KIM::CHARGE_UNIT::unused), - temperatureUnit(KIM::TEMPERATURE_UNIT::unused), - timeUnit(KIM::TIME_UNIT::unused), + lengthUnit(KIM_LENGTH_UNIT_unused), + energyUnit(KIM_ENERGY_UNIT_unused), + chargeUnit(KIM_CHARGE_UNIT_unused), + temperatureUnit(KIM_TEMPERATURE_UNIT_unused), + timeUnit(KIM_TIME_UNIT_unused), pkim(NULL), pargs(NULL), - kim_model_support_for_energy(KIM::SUPPORT_STATUS::notSupported), - kim_model_support_for_forces(KIM::SUPPORT_STATUS::notSupported), - kim_model_support_for_particleEnergy(KIM::SUPPORT_STATUS::notSupported), - kim_model_support_for_particleVirial(KIM::SUPPORT_STATUS::notSupported), + kim_model_support_for_energy(KIM_SUPPORT_STATUS_notSupported), + kim_model_support_for_forces(KIM_SUPPORT_STATUS_notSupported), + kim_model_support_for_particleEnergy(KIM_SUPPORT_STATUS_notSupported), + kim_model_support_for_particleVirial(KIM_SUPPORT_STATUS_notSupported), lmps_local_tot_num_atoms(0), kim_global_influence_distance(0.0), kim_number_of_neighbor_lists(0), @@ -205,13 +205,14 @@ void PairKIM::compute(int eflag , int vflag) lmps_maxalloc = atom->nmax; memory->create(kim_particleSpecies,lmps_maxalloc, "pair:kim_particleSpecies"); - int kimerror = pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::particleSpeciesCodes, + int kimerror = KIM_ComputeArguments_SetArgumentPointerInteger(pargs, + KIM_COMPUTE_ARGUMENT_NAME_particleSpeciesCodes, kim_particleSpecies); memory->create(kim_particleContributing,lmps_maxalloc, "pair:kim_particleContributing"); - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::particleContributing, + kimerror = kimerror || KIM_ComputeArguments_SetArgumentPointerInteger( + pargs, + KIM_COMPUTE_ARGUMENT_NAME_particleContributing, kim_particleContributing); if (kimerror) error->all( @@ -240,7 +241,7 @@ void PairKIM::compute(int eflag , int vflag) lmps_local_tot_num_atoms = (int) nall; // compute via KIM model - kimerror = pkim->Compute(pargs); + kimerror = KIM_Model_Compute(pkim, pargs); if (kimerror) error->all(FLERR,"KIM Compute returned error"); // compute virial before reverse comm! @@ -256,8 +257,9 @@ void PairKIM::compute(int eflag , int vflag) } if ((vflag_atom) && - (kim_model_support_for_particleVirial != - KIM::SUPPORT_STATUS::notSupported)) + KIM_SupportStatus_NotEqual(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported) + ) { // flip sign and order of virial if KIM is computing it double tmp; for (int i = 0; i < nall; ++i) @@ -438,8 +440,9 @@ void PairKIM::coeff(int narg, char **arg) int kimerror; int supported; int code; - kimerror = pkim->GetSpeciesSupportAndCode( - KIM::SpeciesName(lmps_unique_elements[i]), + kimerror = KIM_Model_GetSpeciesSupportAndCode( + pkim, + KIM_SpeciesName_FromString(lmps_unique_elements[i]), &supported, &code); if (supported) @@ -545,17 +548,18 @@ double PairKIM::init_one(int i, int j) int PairKIM::pack_reverse_comm(int n, int first, double *buf) { - using namespace KIM::SUPPORT_STATUS; - int i,m,last; double *fp; fp = &(atom->f[0][0]); m = 0; last = first + n; - if ((kim_model_support_for_forces != notSupported) && + if (KIM_SupportStatus_NotEqual(kim_model_support_for_forces, + KIM_SUPPORT_STATUS_notSupported) + && ((vflag_atom == 0) || - (kim_model_support_for_particleVirial == notSupported))) + KIM_SupportStatus_Equal(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported))) { for (i = first; i < last; i++) { @@ -565,9 +569,11 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) } return m; } - else if ((kim_model_support_for_forces != notSupported) && + else if (KIM_SupportStatus_NotEqual(kim_model_support_for_forces, + KIM_SUPPORT_STATUS_notSupported) && (vflag_atom == 1) && - (kim_model_support_for_particleVirial != notSupported)) + KIM_SupportStatus_NotEqual(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported)) { double *va=&(vatom[0][0]); for (i = first; i < last; i++) @@ -585,9 +591,12 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) } return m; } - else if ((kim_model_support_for_forces == notSupported) && + else if (KIM_SupportStatus_Equal(kim_model_support_for_forces, + KIM_SUPPORT_STATUS_notSupported) + && (vflag_atom == 1) && - (kim_model_support_for_particleVirial != notSupported)) + KIM_SupportStatus_NotEqual(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported)) { double *va=&(vatom[0][0]); for (i = first; i < last; i++) @@ -609,16 +618,17 @@ int PairKIM::pack_reverse_comm(int n, int first, double *buf) void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) { - using namespace KIM::SUPPORT_STATUS; - int i,j,m; double *fp; fp = &(atom->f[0][0]); m = 0; - if ((kim_model_support_for_forces != notSupported) && + if (KIM_SupportStatus_NotEqual(kim_model_support_for_forces, + KIM_SUPPORT_STATUS_notSupported) + && ((vflag_atom == 0) || - (kim_model_support_for_particleVirial == notSupported))) + KIM_SupportStatus_Equal(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported))) { for (i = 0; i < n; i++) { @@ -628,9 +638,12 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) fp[3*j+2]+= buf[m++]; } } - else if ((kim_model_support_for_forces != notSupported) && + else if (KIM_SupportStatus_NotEqual(kim_model_support_for_forces, + KIM_SUPPORT_STATUS_notSupported) + && (vflag_atom == 1) && - (kim_model_support_for_particleVirial != notSupported)) + KIM_SupportStatus_NotEqual(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported)) { double *va=&(vatom[0][0]); for (i = 0; i < n; i++) @@ -648,9 +661,12 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) va[j*6+5]+=buf[m++]; } } - else if ((kim_model_support_for_forces == notSupported) && + else if (KIM_SupportStatus_Equal(kim_model_support_for_forces, + KIM_SUPPORT_STATUS_notSupported) + && (vflag_atom == 1) && - (kim_model_support_for_particleVirial != notSupported)) + KIM_SupportStatus_NotEqual(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported)) { double *va=&(vatom[0][0]); for (i = 0; i < n; i++) @@ -741,11 +757,11 @@ void PairKIM::kim_free() if (kim_init_ok) { - int kimerror = pkim->ComputeArgumentsDestroy(&pargs); + int kimerror = KIM_Model_ComputeArgumentsDestroy(pkim, &pargs); if (kimerror) error->all(FLERR,"Unable to destroy Compute Arguments Object"); - KIM::Model::Destroy(&pkim); + KIM_Model_Destroy(&pkim); } kim_init_ok = false; @@ -760,8 +776,8 @@ void PairKIM::kim_init() // initialize KIM model int requestedUnitsAccepted; - kimerror = KIM::Model::Create( - KIM::NUMBERING::zeroBased, + kimerror = KIM_Model_Create( + KIM_NUMBERING_zeroBased, lengthUnit, energyUnit, chargeUnit, temperatureUnit, timeUnit, kim_modelname, &requestedUnitsAccepted, @@ -773,10 +789,10 @@ void PairKIM::kim_init() error->all(FLERR,"KIM Model did not accept the requested unit system"); } - kimerror = pkim->ComputeArgumentsCreate(&pargs); + kimerror = KIM_Model_ComputeArgumentsCreate(pkim, &pargs); if (kimerror) { - KIM::Model::Destroy(&pkim); + KIM_Model_Destroy(&pkim); error->all(FLERR,"KIM ComputeArgumentsCreate failed"); } else @@ -788,8 +804,9 @@ void PairKIM::kim_init() // determine KIM Model capabilities (used in this function below) set_kim_model_has_flags(); - pkim->GetInfluenceDistance(&kim_global_influence_distance); - pkim->GetNeighborListPointers( + KIM_Model_GetInfluenceDistance(pkim, &kim_global_influence_distance); + KIM_Model_GetNeighborListPointers( + pkim, &kim_number_of_neighbor_lists, &kim_cutoff_values, &modelWillNotRequestNeighborsOfNoncontributingParticles); @@ -800,18 +817,19 @@ void PairKIM::kim_init() } neighborLists = new NeighList*[kim_number_of_neighbor_lists]; - kimerror = pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::numberOfParticles, + kimerror = KIM_ComputeArguments_SetArgumentPointerInteger(pargs, + KIM_COMPUTE_ARGUMENT_NAME_numberOfParticles, &lmps_local_tot_num_atoms); - if (kim_model_support_for_energy != KIM::SUPPORT_STATUS::notSupported) - kimerror = kimerror || pargs->SetArgumentPointer( - KIM::COMPUTE_ARGUMENT_NAME::partialEnergy, + if (KIM_SupportStatus_NotEqual(kim_model_support_for_energy, + KIM_SUPPORT_STATUS_notSupported)) + kimerror = kimerror || KIM_ComputeArguments_SetArgumentPointerDouble(pargs, + KIM_COMPUTE_ARGUMENT_NAME_partialEnergy, &(eng_vdwl)); - kimerror = pargs->SetCallbackPointer( - KIM::COMPUTE_CALLBACK_NAME::GetNeighborList, - KIM::LANGUAGE_NAME::cpp, - reinterpret_cast(get_neigh), + kimerror = KIM_ComputeArguments_SetCallbackPointer(pargs, + KIM_COMPUTE_CALLBACK_NAME_GetNeighborList, + KIM_LANGUAGE_NAME_cpp, + reinterpret_cast(get_neigh), reinterpret_cast(this)); if (kimerror) @@ -824,14 +842,14 @@ void PairKIM::kim_init() void PairKIM::set_argument_pointers() { - using namespace KIM::COMPUTE_ARGUMENT_NAME; - using namespace KIM::SUPPORT_STATUS; - int kimerror; - kimerror = pargs->SetArgumentPointer(coordinates, &(atom->x[0][0])); + kimerror = KIM_ComputeArguments_SetArgumentPointerDouble( + pargs, KIM_COMPUTE_ARGUMENT_NAME_coordinates, &(atom->x[0][0])); // Set KIM pointer appropriately for particalEnergy - if ((kim_model_support_for_particleEnergy == required) && (eflag_atom != 1)) + if (KIM_SupportStatus_Equal(kim_model_support_for_particleEnergy, + KIM_SUPPORT_STATUS_required) + && (eflag_atom != 1)) { // reallocate per-atom energy array if necessary if (atom->nmax > maxeatom) @@ -841,33 +859,41 @@ void PairKIM::set_argument_pointers() memory->create(eatom,comm->nthreads*maxeatom,"pair:eatom"); } } - if ((kim_model_support_for_particleEnergy == optional) && (eflag_atom != 1)) + if (KIM_SupportStatus_Equal(kim_model_support_for_particleEnergy, + KIM_SUPPORT_STATUS_optional) + && (eflag_atom != 1)) { - kimerror = kimerror || pargs->SetArgumentPointer( - partialParticleEnergy, + kimerror = kimerror || KIM_ComputeArguments_SetArgumentPointerDouble( + pargs, + KIM_COMPUTE_ARGUMENT_NAME_partialParticleEnergy, reinterpret_cast(NULL)); } - else if (kim_model_support_for_particleEnergy != notSupported) + else if (KIM_SupportStatus_NotEqual(kim_model_support_for_particleEnergy, + KIM_SUPPORT_STATUS_notSupported)) { - kimerror = kimerror || pargs->SetArgumentPointer(partialParticleEnergy, - eatom); + kimerror = kimerror || KIM_ComputeArguments_SetArgumentPointerDouble( + pargs, KIM_COMPUTE_ARGUMENT_NAME_partialParticleEnergy, eatom); } // Set KIM pointer appropriately for forces - if (kim_model_support_for_forces == notSupported) + if (KIM_SupportStatus_Equal(kim_model_support_for_forces, + KIM_SUPPORT_STATUS_notSupported)) { - kimerror = kimerror || pargs->SetArgumentPointer( - partialForces, + kimerror = kimerror || KIM_ComputeArguments_SetArgumentPointerDouble( + pargs, + KIM_COMPUTE_ARGUMENT_NAME_partialForces, reinterpret_cast(NULL)); } else { - kimerror = kimerror || pargs->SetArgumentPointer(partialForces, - &(atom->f[0][0])); + kimerror = kimerror || KIM_ComputeArguments_SetArgumentPointerDouble( + pargs, KIM_COMPUTE_ARGUMENT_NAME_partialForces, &(atom->f[0][0])); } // Set KIM pointer appropriately for particleVirial - if ((kim_model_support_for_particleVirial == required) && (vflag_atom != 1)) + if (KIM_SupportStatus_Equal(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_required) + && (vflag_atom != 1)) { // reallocate per-atom virial array if necessary if (atom->nmax > maxeatom) @@ -877,16 +903,20 @@ void PairKIM::set_argument_pointers() memory->create(vatom,comm->nthreads*maxvatom,6,"pair:vatom"); } } - if ((kim_model_support_for_particleVirial == optional) && (vflag_atom != 1)) + if (KIM_SupportStatus_Equal(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_optional) + && (vflag_atom != 1)) { - kimerror = kimerror || pargs->SetArgumentPointer( - partialParticleVirial, + kimerror = kimerror || KIM_ComputeArguments_SetArgumentPointerDouble( + pargs, + KIM_COMPUTE_ARGUMENT_NAME_partialParticleVirial, reinterpret_cast(NULL)); } - else if (kim_model_support_for_particleVirial != notSupported) + else if (KIM_SupportStatus_NotEqual(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported)) { - kimerror = kimerror || pargs->SetArgumentPointer(partialParticleEnergy, - &(vatom[0][0])); + kimerror = kimerror || KIM_ComputeArguments_SetArgumentPointerDouble( + pargs, KIM_COMPUTE_ARGUMENT_NAME_partialParticleEnergy, &(vatom[0][0])); } if (kimerror) @@ -913,39 +943,39 @@ void PairKIM::set_lmps_flags() // determine unit system and set lmps_units flag if ((strcmp(update->unit_style,"real")==0)) { lmps_units = REAL; - lengthUnit = KIM::LENGTH_UNIT::A; - energyUnit = KIM::ENERGY_UNIT::kcal_mol; - chargeUnit = KIM::CHARGE_UNIT::e; - temperatureUnit = KIM::TEMPERATURE_UNIT::K; - timeUnit = KIM::TIME_UNIT::fs; + lengthUnit = KIM_LENGTH_UNIT_A; + energyUnit = KIM_ENERGY_UNIT_kcal_mol; + chargeUnit = KIM_CHARGE_UNIT_e; + temperatureUnit = KIM_TEMPERATURE_UNIT_K; + timeUnit = KIM_TIME_UNIT_fs; } else if ((strcmp(update->unit_style,"metal")==0)) { lmps_units = METAL; - lengthUnit = KIM::LENGTH_UNIT::A; - energyUnit = KIM::ENERGY_UNIT::eV; - chargeUnit = KIM::CHARGE_UNIT::e; - temperatureUnit = KIM::TEMPERATURE_UNIT::K; - timeUnit = KIM::TIME_UNIT::ps; + lengthUnit = KIM_LENGTH_UNIT_A; + energyUnit = KIM_ENERGY_UNIT_eV; + chargeUnit = KIM_CHARGE_UNIT_e; + temperatureUnit = KIM_TEMPERATURE_UNIT_K; + timeUnit = KIM_TIME_UNIT_ps; } else if ((strcmp(update->unit_style,"si")==0)) { lmps_units = SI; - lengthUnit = KIM::LENGTH_UNIT::m; - energyUnit = KIM::ENERGY_UNIT::J; - chargeUnit = KIM::CHARGE_UNIT::C; - temperatureUnit = KIM::TEMPERATURE_UNIT::K; - timeUnit = KIM::TIME_UNIT::s; + lengthUnit = KIM_LENGTH_UNIT_m; + energyUnit = KIM_ENERGY_UNIT_J; + chargeUnit = KIM_CHARGE_UNIT_C; + temperatureUnit = KIM_TEMPERATURE_UNIT_K; + timeUnit = KIM_TIME_UNIT_s; } else if ((strcmp(update->unit_style,"cgs")==0)) { lmps_units = CGS; - lengthUnit = KIM::LENGTH_UNIT::cm; - energyUnit = KIM::ENERGY_UNIT::erg; - chargeUnit = KIM::CHARGE_UNIT::statC; - temperatureUnit = KIM::TEMPERATURE_UNIT::K; - timeUnit = KIM::TIME_UNIT::s; + lengthUnit = KIM_LENGTH_UNIT_cm; + energyUnit = KIM_ENERGY_UNIT_erg; + chargeUnit = KIM_CHARGE_UNIT_statC; + temperatureUnit = KIM_TEMPERATURE_UNIT_K; + timeUnit = KIM_TIME_UNIT_s; } else if ((strcmp(update->unit_style,"electron")==0)) { lmps_units = ELECTRON; - lengthUnit = KIM::LENGTH_UNIT::Bohr; - energyUnit = KIM::ENERGY_UNIT::Hartree; - chargeUnit = KIM::CHARGE_UNIT::e; - temperatureUnit = KIM::TEMPERATURE_UNIT::K; - timeUnit = KIM::TIME_UNIT::fs; + lengthUnit = KIM_LENGTH_UNIT_Bohr; + energyUnit = KIM_ENERGY_UNIT_Hartree; + chargeUnit = KIM_CHARGE_UNIT_e; + temperatureUnit = KIM_TEMPERATURE_UNIT_K; + timeUnit = KIM_TIME_UNIT_fs; } else if ((strcmp(update->unit_style,"lj")==0)) { error->all(FLERR,"LAMMPS unit_style lj not supported by KIM models"); } else { @@ -959,75 +989,85 @@ void PairKIM::set_lmps_flags() void PairKIM::set_kim_model_has_flags() { - { // BEGIN enclosing scope for using directives - using namespace KIM::COMPUTE_ARGUMENT_NAME; - using namespace KIM::SUPPORT_STATUS; - int numberOfComputeArgumentNames; - GetNumberOfComputeArgumentNames(&numberOfComputeArgumentNames); + KIM_COMPUTE_ARGUMENT_NAME_GetNumberOfComputeArgumentNames( + &numberOfComputeArgumentNames); for (int i = 0; i < numberOfComputeArgumentNames; ++i) { - KIM::ComputeArgumentName computeArgumentName; - int kimerror = GetComputeArgumentName(i, &computeArgumentName); - KIM::SupportStatus supportStatus; - kimerror = pargs->GetArgumentSupportStatus(computeArgumentName, - &supportStatus); + KIM_ComputeArgumentName computeArgumentName; + int kimerror = KIM_COMPUTE_ARGUMENT_NAME_GetComputeArgumentName( + i, &computeArgumentName); + KIM_SupportStatus supportStatus; + kimerror = KIM_ComputeArguments_GetArgumentSupportStatus( + pargs, computeArgumentName, &supportStatus); - if (computeArgumentName == partialEnergy) + if (KIM_ComputeArgumentName_Equal(computeArgumentName, + KIM_COMPUTE_ARGUMENT_NAME_partialEnergy) + ) kim_model_support_for_energy = supportStatus; - else if (computeArgumentName == partialForces) + else if (KIM_ComputeArgumentName_Equal( + computeArgumentName, KIM_COMPUTE_ARGUMENT_NAME_partialForces) + ) kim_model_support_for_forces = supportStatus; - else if (computeArgumentName == partialParticleEnergy) + else if + (KIM_ComputeArgumentName_Equal( + computeArgumentName, + KIM_COMPUTE_ARGUMENT_NAME_partialParticleEnergy)\ + ) kim_model_support_for_particleEnergy = supportStatus; - else if (computeArgumentName == partialParticleVirial) + else if + (KIM_ComputeArgumentName_Equal( + computeArgumentName, + KIM_COMPUTE_ARGUMENT_NAME_partialParticleVirial) + ) kim_model_support_for_particleVirial = supportStatus; - else if (supportStatus == required) + else if (KIM_SupportStatus_Equal(supportStatus, KIM_SUPPORT_STATUS_required) + ) { std::stringstream msg; msg << "KIM Model requires unsupported compute argument: " - << computeArgumentName.String(); + << KIM_ComputeArgumentName_ToString(computeArgumentName); error->all(FLERR, msg.str().c_str()); } } - if (kim_model_support_for_energy == notSupported) + if (KIM_SupportStatus_Equal(kim_model_support_for_energy, + KIM_SUPPORT_STATUS_notSupported)) error->warning(FLERR,"KIM Model does not provide `partialEnergy'; " "Potential energy will be zero"); - if (kim_model_support_for_forces == notSupported) + if (KIM_SupportStatus_Equal(kim_model_support_for_forces, + KIM_SUPPORT_STATUS_notSupported)) error->warning(FLERR,"KIM Model does not provide `partialForce'; " "Forces will be zero"); - if (kim_model_support_for_particleEnergy == notSupported) + if (KIM_SupportStatus_Equal(kim_model_support_for_particleEnergy, + KIM_SUPPORT_STATUS_notSupported)) error->warning(FLERR,"KIM Model does not provide `partialParticleEnergy'; " "energy per atom will be zero"); - if (kim_model_support_for_particleVirial == notSupported) + if (KIM_SupportStatus_Equal(kim_model_support_for_particleVirial, + KIM_SUPPORT_STATUS_notSupported)) error->warning(FLERR,"KIM Model does not provide `partialParticleVirial'; " "virial per atom will be zero"); - } // END enclosing scope for using directives + int numberOfComputeCallbackNames; + KIM_COMPUTE_CALLBACK_NAME_GetNumberOfComputeCallbackNames( + &numberOfComputeCallbackNames); + for (int i = 0; i < numberOfComputeCallbackNames; ++i) + { + KIM_ComputeCallbackName computeCallbackName; + int kimerror = KIM_COMPUTE_CALLBACK_NAME_GetComputeCallbackName( + i, &computeCallbackName); + KIM_SupportStatus supportStatus; + kimerror = KIM_ComputeArguments_GetCallbackSupportStatus( + pargs, computeCallbackName, &supportStatus); - { // BEGIN enclosing scope for using directives - using namespace KIM::COMPUTE_CALLBACK_NAME; - using namespace KIM::SUPPORT_STATUS; - - int numberOfComputeCallbackNames; - GetNumberOfComputeCallbackNames(&numberOfComputeCallbackNames); - for (int i = 0; i < numberOfComputeCallbackNames; ++i) + if (KIM_SupportStatus_Equal(supportStatus, KIM_SUPPORT_STATUS_required)) { - KIM::ComputeCallbackName computeCallbackName; - int kimerror = GetComputeCallbackName(i, &computeCallbackName); - KIM::SupportStatus supportStatus; - kimerror = pargs->GetCallbackSupportStatus(computeCallbackName, - &supportStatus); - - if (supportStatus == required) - { - error->all(FLERR,"KIM Model requires unsupported compute callback"); - } + error->all(FLERR,"KIM Model requires unsupported compute callback"); } - } // END enclosing scope for using directives + } - return; + return; } diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index eef6e0345b..1b8051ea1e 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -50,7 +50,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v2.0.0-beta.1 (and newer) package + Designed for use with the kim-api-v2.0.0-beta.2 (and newer) package ------------------------------------------------------------------------- */ #ifdef PAIR_CLASS @@ -65,7 +65,9 @@ PairStyle(kim,PairKIM) // includes from KIM & LAMMPS class KIM_API_model; #include "pair.h" -#include "KIM_SimulatorHeaders.hpp" +extern "C" { +#include "KIM_SimulatorHeaders.h" +} #include @@ -113,20 +115,20 @@ namespace LAMMPS_NS { bool lmps_using_molecular; enum unit_sys {REAL, METAL, SI, CGS, ELECTRON}; unit_sys lmps_units; - KIM::LengthUnit lengthUnit; - KIM::EnergyUnit energyUnit; - KIM::ChargeUnit chargeUnit; - KIM::TemperatureUnit temperatureUnit; - KIM::TimeUnit timeUnit; + KIM_LengthUnit lengthUnit; + KIM_EnergyUnit energyUnit; + KIM_ChargeUnit chargeUnit; + KIM_TemperatureUnit temperatureUnit; + KIM_TimeUnit timeUnit; - KIM::Model * pkim; - KIM::ComputeArguments * pargs; + KIM_Model * pkim; + KIM_ComputeArguments * pargs; // values set in set_kim_model_has_flags(), called by kim_init() - KIM::SupportStatus kim_model_support_for_energy; - KIM::SupportStatus kim_model_support_for_forces; - KIM::SupportStatus kim_model_support_for_particleEnergy; - KIM::SupportStatus kim_model_support_for_particleVirial; + KIM_SupportStatus kim_model_support_for_energy; + KIM_SupportStatus kim_model_support_for_forces; + KIM_SupportStatus kim_model_support_for_particleEnergy; + KIM_SupportStatus kim_model_support_for_particleVirial; // values set in kim_init() bool kim_init_ok; From 9ed6f2fc4395ec962e6c9c849f71f3f329664e56 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sun, 4 Nov 2018 20:10:04 -0600 Subject: [PATCH 0055/1242] Adjust lib/kim install script and settings --- lib/kim/Install.py | 55 ++++++++++++++++------------------------- lib/kim/Makefile.lammps | 17 +++++++++++-- lib/kim/README | 30 +++++++++------------- 3 files changed, 48 insertions(+), 54 deletions(-) diff --git a/lib/kim/Install.py b/lib/kim/Install.py index da0dcd2789..815827b645 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -9,24 +9,24 @@ import sys,os,re,subprocess # help message help = """ -Syntax from src dir: make lib-kim args="-b -v version -a kim-name" +Syntax from src dir: make lib-kim args="-b -v version -a kim-name" or: make lib-kim args="-b -a everything" or: make lib-kim args="-n -a kim-name" - or: make lib-kim args="-p /usr/local/lib/kim-api-v2 -a kim-name" -Syntax from lib dir: python Install.py -b -v version -a kim-name + or: make lib-kim args="-p /home/bob/kim -a kim-name" +Syntax from lib dir: python Install.py -b -v version -a kim-name or: python Install.py -b -a everything or: python Install.py -n -a kim-name - or: python Install.py -p /usr/local/lib/kim-api-v2 -a kim-name + or: python Install.py -p /home/bob/kim -a kim-name specify one or more options, order does not matter -v = version of KIM API library to use - default = kim-api-v2.0.0-beta.1 (current as of July 2018) + default = kim-api-v2.0.0-beta.2 (current as of November 2018) -b = download and build base KIM API library with example Models this will delete any previous installation in the current folder -n = do NOT download and build base KIM API library. Use an existing installation - -p = specify location of KIM API installation (implies -n) + -p = specify install prefix of KIM API installation (implies -n) -a = add single KIM model or model driver with kim-name to existing KIM API lib (see example below). If kim-name = everything, then rebuild KIM API library with @@ -109,7 +109,7 @@ nargs = len(args) if nargs == 0: error() thisdir = os.environ['PWD'] -version = "kim-api-v2.0.0-beta.1" +version = "kim-api-v2.0.0-beta.2" buildflag = False everythingflag = False @@ -160,13 +160,10 @@ if pathflag: error() # configure LAMMPS to use existing kim-api installation - with open("%s/Makefile.KIM_DIR" % thisdir, 'w') as mkfile: - mkfile.write("KIM_INSTALL_DIR=%s\n\n" % kimdir) - mkfile.write(".DUMMY: print_dir\n\n") - mkfile.write("print_dir:\n") - mkfile.write(" @printf $(KIM_INSTALL_DIR)\n") + with open("%s/kim-prefix.txt" % thisdir, 'w') as pffile: + pffile.write("%s" % kimdir) - print("Created %s/Makefile.KIM_DIR\n using %s" % (thisdir,kimdir)) + print("Created %s/kim-prefix.txt\n using %s" % (thisdir,kimdir)) else: kimdir = os.path.join(os.path.abspath(thisdir), "installed-" + version) @@ -182,13 +179,10 @@ if buildflag: # configure LAMMPS to use kim-api to be installed - with open("%s/Makefile.KIM_DIR" % thisdir, 'w') as mkfile: - mkfile.write("KIM_INSTALL_DIR=%s\n\n" % kimdir) - mkfile.write(".DUMMY: print_dir\n\n") - mkfile.write("print_dir:\n") - mkfile.write(" @printf $(KIM_INSTALL_DIR)\n") + with open("%s/kim-prefix.txt" % thisdir, 'w') as pffile: + pffile.write("%s" % kimdir) - print("Created %s/Makefile.KIM_DIR\n using %s" % (thisdir,kimdir)) + print("Created %s/kim-prefix.txt\n using %s" % (thisdir,kimdir)) # download entire kim-api tarball @@ -201,32 +195,25 @@ if buildflag: # configure kim-api print("Configuring kim-api ...") - cmd = 'cd "%s/%s"; ./configure --prefix="%s"' % (thisdir,version,kimdir) - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'cd "%s/%s" && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX="%s" -DCMAKE_BUILD_TYPE=Release' % (thisdir,version,kimdir) + txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + if verboseflag: print(txt.decode("UTF-8")) # build kim-api print("Building kim-api ...") - cmd = 'cd "%s/%s"; make' % (thisdir,version) + cmd = 'cd "%s/%s/build" && make' % (thisdir,version) txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) if verboseflag: print(txt.decode("UTF-8")) # install kim-api print("Installing kim-api ...") - cmd = 'cd "%s/%s"; make install' % (thisdir,version) + cmd = 'cd "%s/%s/build" && make install' % (thisdir,version) txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) if verboseflag: print(txt.decode("UTF-8")) # remove source files - print("Building and installing example Models") - cmd = 'cd "%s/%s/examples"; make model-drivers-all-system' % (thisdir,version) - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - if verboseflag: print (txt.decode("UTF-8")) - cmd = 'cd "%s/%s/examples"; make models-all-system' % (thisdir,version) - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - if verboseflag: print (txt.decode("UTF-8")) - print("Removing kim-api source and build files ...") cmd = 'cd "%s"; rm -rf %s; rm -rf %s.txz' % (thisdir,version,version) subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) @@ -241,9 +228,9 @@ if buildflag: # add single OpenKIM model if addflag: - makefile_path = os.path.join(thisdir, "Makefile.KIM_DIR") - if os.path.isfile(makefile_path): - cmd = 'make --no-print-directory -f %s print_dir' % makefile_path + pf_path = os.path.join(thisdir, "kim-prefix.txt") + if os.path.isfile(pf_path): + cmd = 'cat %s' % pf_path kimdir = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) if not os.path.isdir(kimdir): diff --git a/lib/kim/Makefile.lammps b/lib/kim/Makefile.lammps index 1c2ab417d5..7c9fc7c5f7 100644 --- a/lib/kim/Makefile.lammps +++ b/lib/kim/Makefile.lammps @@ -13,5 +13,18 @@ # Settings that the LAMMPS build will import when this package is installed -kim_SYSINC = $(shell pkg-config --cflags libkim-api-v2) -kim_SYSLIB = $(shell pkg-config --libs libkim-api-v2) + +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)) + +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) + +ifeq ($(strip $(kim_SYSINC)),) + $(error 'pkg-config' could not find an installed KIM API library.) +endif diff --git a/lib/kim/README b/lib/kim/README index 6bcad18ce0..7cf8f9bb7d 100644 --- a/lib/kim/README +++ b/lib/kim/README @@ -3,10 +3,9 @@ is required to use the KIM package and its pair_style kim command in a LAMMPS input script. Information about the KIM project can be found at https://openkim.org. -The KIM project is lead by Ellad Tadmor and Ryan Elliott (U Minn) and -James Sethna (Cornell U). Ryan Elliott is the main developer for the -KIM API and he also maintains the code that implements the pair_style -kim command. +The KIM project is lead by Ellad Tadmor and Ryan Elliott (U Minn). +Ryan Elliott is the main developer for the KIM API and he also +maintains the code that implements the pair_style kim command. You can type "make lib-kim" from the src directory to see help on how to download and build this library via make commands, or you can @@ -21,7 +20,7 @@ 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 "KIM_INSTALL_DIR=${PWD}/installed-kim-api-vX.Y.Z\n" > ./Makefile.KIM_DIR +$ printf "${PWD}/installed-kim-api-vX.Y.Z" > ./kim-prefix.txt 2. Download and unpack the kim-api @@ -30,26 +29,21 @@ $ tar zxvf kim-api-vX.Y.Z.txz # configure the kim-api $ cd kim-api-vX.Y.Z -$ ./configure --prefix=${PWD}/../installed-kim-api-vX.Y.Z +$ mkdir build && cd build +$ cmake .. -DCMAKE_INSTALL_PREFIX=${PWD}/../../installed-kim-api-vX.Y.Z 3. Build and install the kim-api and model $ make $ make install -4. To install the example models shipped with the kim-api - -$ cd examples -$ make model-drivers-all-system -$ make models-all-system -$ cd ../.. - -5. Remove source and build files +4. Remove source and build files +$ cd ../../ $ rm -rf kim-api-vX.Y.Z $ rm -rf kim-api-vX.Y.Z.txz -6. To add items do the following (replace the kim item name with your +5. To add items do the following (replace the kim item name with your desired value) $ source ${PWD}/kim-api-vX.Y.Z/bin/kim-api-vX-activate @@ -65,6 +59,6 @@ $ cd lammpos/src $ make yes-kim $ make g++ (or whatever target you wish) -Note that the Makefile.lammps and Makefile.KIM_DIR files in this directory -are required to allow the LAMMPS build to find the necessary KIM files. -You should not normally need to edit these files. +Note that the Makefile.lammps file in this directory is required to +allow the LAMMPS build to find the necessary KIM files. You should +not normally need to edit these files. From dd61ded311abda89440ee62de0b740684c5acc12 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 5 Nov 2018 09:24:02 -0600 Subject: [PATCH 0056/1242] Update cmake build to work with cmake-based KIM --- cmake/CMakeLists.txt | 46 ++++++++++++------------- cmake/Modules/FindKIM-API-V2.cmake | 55 ++++++++++++++++++++++++++++++ cmake/Modules/FindKIM.cmake | 22 ------------ 3 files changed, 78 insertions(+), 45 deletions(-) create mode 100644 cmake/Modules/FindKIM-API-V2.cmake delete mode 100644 cmake/Modules/FindKIM.cmake diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 418bdd0dba..5402ac1987 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -454,7 +454,7 @@ endif() if(PKG_LATTE) option(DOWNLOAD_LATTE "Download latte (instead of using the system's one)" OFF) if(DOWNLOAD_LATTE) - if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR + if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR message(FATAL_ERROR "For downlading LATTE you need at least cmake-3.7") endif() message(STATUS "LATTE not found - we will build our own") @@ -485,15 +485,15 @@ if(PKG_USER-SCAFACOS) ExternalProject_Add(scafacos_build URL https://github.com/scafacos/scafacos/releases/download/v1.0.1/scafacos-1.0.1.tar.gz URL_MD5 bd46d74e3296bd8a444d731bb10c1738 - CONFIGURE_COMMAND /configure --prefix= - --disable-doc + CONFIGURE_COMMAND /configure --prefix= + --disable-doc --enable-fcs-solvers=fmm,p2nfft,direct,ewald,p3m --with-internal-fftw --with-internal-pfft --with-internal-pnfft - $<$:--with-pic> - FC=${CMAKE_MPI_Fortran_COMPILER} - CXX=${CMAKE_MPI_CXX_COMPILER} + $<$:--with-pic> + FC=${CMAKE_MPI_Fortran_COMPILER} + CXX=${CMAKE_MPI_CXX_COMPILER} CC=${CMAKE_MPI_C_COMPILER} F77= ) @@ -547,7 +547,7 @@ if(PKG_USER-SMD) if(DOWNLOAD_EIGEN3) include(ExternalProject) ExternalProject_Add(Eigen3_build - URL http://bitbucket.org/eigen/eigen/get/3.3.4.tar.gz + URL http://bitbucket.org/eigen/eigen/get/3.3.4.tar.gz URL_MD5 1a47e78efe365a97de0c022d127607c3 CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" ) @@ -588,23 +588,23 @@ if(PKG_KIM) if(DOWNLOAD_KIM) include(ExternalProject) ExternalProject_Add(kim_build - URL https://github.com/openkim/kim-api/archive/v1.9.5.tar.gz - URL_MD5 9f66efc128da33039e30659f36fc6d00 - BUILD_IN_SOURCE 1 - CONFIGURE_COMMAND /configure --prefix= + URL https://s3.openkim.org/kim-api/kim-api-v2.0.0-beta.2.txz + URL_MD5 1fbdbb734059cf0dc9d807e6dd6cc8ea + BINARY_DIR build + CMAKE_ARGS -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_Fortran_COMPILER=gfortran-8 -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Release ) ExternalProject_get_property(kim_build INSTALL_DIR) - set(KIM_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api-v1) - set(KIM_LIBRARIES ${INSTALL_DIR}/lib/libkim-api-v1.so) + set(KIM-API-V2_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api-v2) + set(KIM-API-V2_LIBRARIES ${INSTALL_DIR}/lib/libkim-api-v2.2${CMAKE_SHARED_LIBRARY_SUFFIX}) list(APPEND LAMMPS_DEPS kim_build) else() - find_package(KIM) - if(NOT KIM_FOUND) - message(FATAL_ERROR "KIM not found, help CMake to find it by setting KIM_LIBRARY and KIM_INCLUDE_DIR, or set DOWNLOAD_KIM=ON to download it") + find_package(KIM-API-V2) + if(NOT KIM-API-V2_FOUND) + message(FATAL_ERROR "KIM 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_LIBRARIES}) - include_directories(${KIM_INCLUDE_DIRS}) + list(APPEND LAMMPS_LINK_LIBS ${KIM-API-V3_LIBRARIES}) + include_directories(${KIM-API-V2_INCLUDE_DIRS}) endif() if(PKG_MESSAGE) @@ -645,7 +645,7 @@ if(PKG_MSCG) find_package(GSL REQUIRED) option(DOWNLOAD_MSCG "Download latte (instead of using the system's one)" OFF) if(DOWNLOAD_MSCG) - if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR + if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR message(FATAL_ERROR "For downlading LATTE you need at least cmake-3.7") endif() include(ExternalProject) @@ -1020,7 +1020,7 @@ if(PKG_USER-INTEL) endif() if(PKG_GPU) - if (CMAKE_VERSION VERSION_LESS "3.1") + if (CMAKE_VERSION VERSION_LESS "3.1") message(FATAL_ERROR "For the GPU package you need at least cmake-3.1") endif() set(GPU_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/GPU) @@ -1224,7 +1224,7 @@ if(BUILD_EXE) add_dependencies(lmp ${LAMMPS_DEPS}) endif() endif() - + set_target_properties(lmp PROPERTIES OUTPUT_NAME ${LAMMPS_BINARY}) install(TARGETS lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES ${LAMMPS_DOC_DIR}/lammps.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 RENAME ${LAMMPS_BINARY}.1) @@ -1361,14 +1361,14 @@ message(STATUS "<<< Build configuration >>> get_property(LANGUAGES GLOBAL PROPERTY ENABLED_LANGUAGES) list (FIND LANGUAGES "Fortran" _index) if (${_index} GREATER -1) - message(STATUS "Fortran Compiler ${CMAKE_Fortran_COMPILER} + message(STATUS "Fortran Compiler ${CMAKE_Fortran_COMPILER} Type ${CMAKE_Fortran_COMPILER_ID} Version ${CMAKE_Fortran_COMPILER_VERSION} Fortran Flags ${CMAKE_Fortran_FLAGS} ${CMAKE_Fortran_FLAGS_${BTYPE}}") endif() list (FIND LANGUAGES "C" _index) if (${_index} GREATER -1) - message(STATUS "C Compiler ${CMAKE_C_COMPILER} + message(STATUS "C Compiler ${CMAKE_C_COMPILER} Type ${CMAKE_C_COMPILER_ID} Version ${CMAKE_C_COMPILER_VERSION} C Flags ${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${BTYPE}}") diff --git a/cmake/Modules/FindKIM-API-V2.cmake b/cmake/Modules/FindKIM-API-V2.cmake new file mode 100644 index 0000000000..0cc947e139 --- /dev/null +++ b/cmake/Modules/FindKIM-API-V2.cmake @@ -0,0 +1,55 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the Common Development +# and Distribution License Version 1.0 (the "License"). +# +# You can obtain a copy of the license at +# http://www.opensource.org/licenses/CDDL-1.0. See the License for the +# specific language governing permissions and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each file and +# include the License file in a prominent location with the name LICENSE.CDDL. +# If applicable, add the following below this CDDL HEADER, with the fields +# enclosed by brackets "[]" replaced with your own identifying information: +# +# Portions Copyright (c) [yyyy] [name of copyright owner]. All rights reserved. +# +# CDDL HEADER END +# + +# +# Copyright (c) 2013--2018, Regents of the University of Minnesota. +# All rights reserved. +# +# Contributors: +# Richard Berger +# Christoph Junghans +# Ryan S. Elliott +# + +# +# Release: This file is part of the kim-api.git repository. +# + + +# - Find KIM-API-V2 +# +# 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 +# +find_package(PkgConfig REQUIRED) +include(FindPackageHandleStandardArgs) + +pkg_check_modules(KIM-API-V2 REQUIRED libkim-api-v2>=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) + +# handle the QUIETLY and REQUIRED arguments and set KIM-API-V2_FOUND to TRUE +# if all listed variables are TRUE +find_package_handle_standard_args(KIM-API-V2 REQUIRED_VARS KIM-API-V2_LIBRARIES) diff --git a/cmake/Modules/FindKIM.cmake b/cmake/Modules/FindKIM.cmake deleted file mode 100644 index e29f26e01d..0000000000 --- a/cmake/Modules/FindKIM.cmake +++ /dev/null @@ -1,22 +0,0 @@ -# - Find kim -# Find the native KIM headers and libraries. -# -# KIM_INCLUDE_DIRS - where to find kim.h, etc. -# KIM_LIBRARIES - List of libraries when using kim. -# KIM_FOUND - True if kim found. -# - -find_path(KIM_INCLUDE_DIR KIM_SimulatorHeaders.hpp PATH_SUFFIXES kim-api-v2) - -find_library(KIM_LIBRARY NAMES kim-api-v2) - -set(KIM_LIBRARIES ${KIM_LIBRARY}) -set(KIM_INCLUDE_DIRS ${KIM_INCLUDE_DIR}) - -include(FindPackageHandleStandardArgs) -# handle the QUIETLY and REQUIRED arguments and set KIM_FOUND to TRUE -# if all listed variables are TRUE - -find_package_handle_standard_args(KIM DEFAULT_MSG KIM_LIBRARY KIM_INCLUDE_DIR) - -mark_as_advanced(KIM_INCLUDE_DIR KIM_LIBRARY ) From 29ae88e309fd02a3b4fbb3f882f498258096a794 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 5 Nov 2018 09:37:35 -0600 Subject: [PATCH 0057/1242] Update docs for KIM --- doc/src/Build_extras.txt | 44 ++++++++++++------------- doc/src/Errors_messages.txt | 8 ----- doc/src/Packages_details.txt | 63 +++++++++++++++++------------------- doc/src/pair_kim.txt | 2 +- 4 files changed, 51 insertions(+), 66 deletions(-) diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index d256a1afc8..5f4ad6ee69 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -63,7 +63,7 @@ available on your system. If CMake cannot find the library, you can set these variables: --D ZLIB_INCLUDE_DIR=path # path to zlib.h header file +-D ZLIB_INCLUDE_DIR=path # path to zlib.h header file -D ZLIB_LIBRARIES=path # path to libz.a (.so) file :pre [Traditional make]: @@ -150,7 +150,7 @@ package uses the library settings from the lib/gpu/Makefile.machine used to build the GPU library. :line - + KIM package :h4,link(kim) To build with this package, the KIM library must be downloaded and @@ -176,16 +176,12 @@ package?" page. [CMake build]: --D DOWNLOAD_KIM=value # download OpenKIM API v1 for build, value = no (default) or yes --D KIM_LIBRARY=path # KIM library file (only needed if a custom location) --D KIM_INCLUDE_DIR=path # KIM include directory (only needed if a custom location) :pre +-D DOWNLOAD_KIM=value # download OpenKIM API v1 for build, value = no (default) or yes :pre 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), KIM_LIBRARY is the -filename (plus path) of the KIM library file, not the directory the -library file is in. KIM_INCLUDE_DIR is the directory the KIM include -file is in. +your system (in a location CMake cannot find it), set the PKG_CONFIG_PATH +environment variable so that libkim-api-v2 can be found. [Traditional make]: @@ -199,8 +195,8 @@ make lib-kim args="-b " # (re-)install KIM API lib with only example models make lib-kim args="-b -a Glue_Ercolessi_Adams_Al__MO_324507536345_001" # ditto plus one model make lib-kim args="-b -a everything" # install KIM API lib with all models make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # add one model or model driver -make lib-kim args="-p /usr/local/kim-api" # use an existing KIM API installation at the provided location -make lib-kim args="-p /usr/local/kim-api -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # ditto but add one model or driver :pre +make lib-kim args="-p /usr/local" # use an existing KIM API installation at the provided location +make lib-kim args="-p /usr/local -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # ditto but add one model or driver :pre :line @@ -254,7 +250,7 @@ For NVIDIA GPUs using CUDA, set these 4 variables: -D KOKKOS_ARCH="archCPU;archGPU" # archCPU = CPU from list above that is hosting the GPU # archGPU = GPU from list above -D KOKKOS_ENABLE_CUDA=yes --D KOKKOS_ENABLE_OPENMP=yes +-D KOKKOS_ENABLE_OPENMP=yes -D CMAKE_CXX_COMPILER=wrapper # wrapper = full path to Cuda nvcc wrapper :pre The wrapper value is the Cuda nvcc compiler wrapper provided in the @@ -296,7 +292,7 @@ export OMPI_CXX = $(KOKKOS_ABSOLUTE_PATH)/config/nvcc_wrapper CC = mpicxx :pre :line - + LATTE package :h4,link(latte) To build with this package, you must download and build the LATTE @@ -324,7 +320,7 @@ args: make lib-latte # print help message make lib-latte args="-b" # download and build in lib/latte/LATTE-master make lib-latte args="-p $HOME/latte" # use existing LATTE installation in $HOME/latte -make lib-latte args="-b -m gfortran" # download and build in lib/latte and +make lib-latte args="-b -m gfortran" # download and build in lib/latte and # copy Makefile.lammps.gfortran to Makefile.lammps :pre @@ -335,7 +331,7 @@ also check that the Makefile.lammps file you create is appropriate for the compiler you use on your system to build LATTE. :line - + MEAM package :h4,link(meam) NOTE: the use of the MEAM package is discouraged, as it has been @@ -378,7 +374,7 @@ EXTRAMAKE variable to specify a corresponding Makefile.lammps.machine file. :line - + MESSAGE package :h4,link(message) This package can optionally include support for messaging via sockets, @@ -407,7 +403,7 @@ existing Makefile.lammps.* and has settings to link with the ZeroMQ library if requested in the build. :line - + MSCG package :h4,link(mscg) To build with this package, you must download and build the MS-CG @@ -419,7 +415,7 @@ lib/mscg/README and MSCG/Install files for more details. [CMake build]: -D DOWNLOAD_MSCG=value # download MSCG for build, value = no (default) or yes --D MSCG_LIBRARY=path # MSCG library file (only needed if a custom location) +-D MSCG_LIBRARY=path # MSCG library file (only needed if a custom location) -D MSCG_INCLUDE_DIR=path # MSCG include directory (only needed if a custom location) :pre If DOWNLOAD_MSCG is set, the MSCG library will be downloaded and built @@ -464,7 +460,7 @@ line of your Makefile.machine. See src/MAKE/OPTIONS/Makefile.opt for an example. :line - + POEMS package :h4,link(poems) [CMake build]: @@ -493,7 +489,7 @@ for your system, which should define an EXTRAMAKE variable to specify a corresponding Makefile.lammps.machine file. :line - + PYTHON package :h4,link(python) Building with the PYTHON package requires you have a Python shared @@ -520,7 +516,7 @@ Makefile.lammps.* file (and copy it to Makefile.lammps) if the LAMMPS build fails. :line - + REAX package :h4,link(reax) NOTE: the use of the REAX package and its "pair_style @@ -570,7 +566,7 @@ library"_voro-home. [CMake build]: -D DOWNLOAD_VORO=value # download Voro++ for build, value = no (default) or yes --D VORO_LIBRARY=path # Voro++ library file (only needed if at custom location) +-D VORO_LIBRARY=path # Voro++ library file (only needed if at custom location) -D VORO_INCLUDE_DIR=path # Voro++ include directory (only needed if at custom location) :pre If DOWNLOAD_VORO is set, the Voro++ library will be downloaded and @@ -869,7 +865,7 @@ Quantum ESPRESSO known to work with this QM/MM interface was version [CMake build]: The CMake build system currently does not support building the full -QM/MM-capable hybrid executable of LAMMPS and QE called pwqmmm.x. +QM/MM-capable hybrid executable of LAMMPS and QE called pwqmmm.x. You must use the traditional make build for this package. [Traditional make]: @@ -939,7 +935,7 @@ Coulomb solver library"_scafacos-home [CMake build]: -D DOWNLOAD_SCAFACOS=value # download ScaFaCoS for build, value = no (default) or yes --D SCAFACOS_LIBRARY=path # ScaFaCos library file (only needed if at custom location) +-D SCAFACOS_LIBRARY=path # ScaFaCos library file (only needed if at custom location) -D SCAFACOS_INCLUDE_DIR=path # ScaFaCoS include directory (only needed if at custom location) :pre If DOWNLOAD_SCAFACOS is set, the ScaFaCoS library will be downloaded diff --git a/doc/src/Errors_messages.txt b/doc/src/Errors_messages.txt index 695b949f7e..3dc93044c8 100644 --- a/doc/src/Errors_messages.txt +++ b/doc/src/Errors_messages.txt @@ -6994,12 +6994,6 @@ The atom style defined does not have this attribute. :dd The atom style defined does not have these attributes. :dd -{KIM neighbor iterator exceeded range} :dt - -This should not happen. It likely indicates a bug -in the KIM implementation of the interatomic potential -where it is requesting neighbors incorrectly. :dd - {KOKKOS package does not yet support comm_style tiled} :dt Self-explanatory. :dd @@ -10193,8 +10187,6 @@ Self-explanatory. :dd {Unrecognized virial argument in pair_style command} :dt -Only two options are supported: LAMMPSvirial and KIMvirial :dd - {Unsupported mixing rule in kspace_style ewald/disp} :dt Only geometric mixing is supported. :dd diff --git a/doc/src/Packages_details.txt b/doc/src/Packages_details.txt index 031858e846..7365e986e5 100644 --- a/doc/src/Packages_details.txt +++ b/doc/src/Packages_details.txt @@ -203,7 +203,7 @@ available on your system. [Author:] Axel Kohlmeyer (Temple U). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -284,7 +284,7 @@ also the "KOKKOS"_#PKG-KOKKOS package, which has GPU-enabled styles. [Authors:] Mike Brown (Intel) while at Sandia and ORNL and Trung Nguyen (Northwestern U) while at ORNL. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -345,14 +345,13 @@ system. Information about the KIM project can be found at its website: https://openkim.org. The KIM project is led by Ellad Tadmor and Ryan -Elliott (U Minnesota) and James Sethna (Cornell U). +Elliott (U Minnesota). [Authors:] Ryan Elliott (U Minnesota) is the main developer for the KIM API which the "pair_style kim"_pair_kim.html command uses. He -developed the pair style in collaboration with Valeriu Smirichinski (U -Minnesota). +developed the pair style. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -398,7 +397,7 @@ which was developed by Carter Edwards, Christian Trott, and others at Sandia, and which is included in the LAMMPS distribution in lib/kokkos. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -546,7 +545,7 @@ and user interface. [Author:] Greg Wagner (Northwestern U) while at Sandia. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -679,7 +678,7 @@ system. library was developed by Jacob Wagner in Greg Voth's group at the University of Chicago. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -711,7 +710,7 @@ have styles optimized for CPU performance. [Authors:] James Fischer (High Performance Technologies), David Richie, and Vincent Natoli (Stone Ridge Technolgy). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -768,7 +767,7 @@ connections at hinge points. [Author:] Rudra Mukherjee (JPL) while at RPI. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -800,7 +799,7 @@ shared library available on your system, which needs to be a Python 2 version, 2.6 or later. Python 3 is not yet supported. See the lib/python/README for more details. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -848,7 +847,7 @@ as bonds are created and destroyed. [Author:] Aidan Thompson (Sandia). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1021,7 +1020,7 @@ system. library was written by Chris Rycroft (Harvard U) while at UC Berkeley and LBNL. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1048,7 +1047,7 @@ atomic information to continuum fields. [Authors:] Reese Jones, Jeremy Templeton, Jon Zimmerman (Sandia). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1075,7 +1074,7 @@ model. [Author:] Ilya Valuev (JIHT, Russia). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1098,7 +1097,7 @@ This package provides "fix bocs"_fix_bocs.html, a modified version of "fix npt"_fix_nh.html which includes the pressure correction to the barostat as outlined in: -N. J. H. Dunn and W. G. Noid, "Bottom-up coarse-grained models that +N. J. H. Dunn and W. G. Noid, "Bottom-up coarse-grained models that accurately describe the structure, pressure, and compressibility of molecular liquids," J. Chem. Phys. 143, 243148 (2015). @@ -1183,7 +1182,7 @@ and Jerome Henin (LISM, CNRS, Marseille, France), originally for the NAMD MD code, but with portability in mind. Axel Kohlmeyer (Temple U) provided the interface to LAMMPS. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1363,7 +1362,7 @@ system. [Author:] Pierre de Buyl (KU Leuven) created both the package and the H5MD format. -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1401,7 +1400,7 @@ NOTE: the USER-INTEL package contains styles that require using the [Author:] Mike Brown (Intel). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1571,17 +1570,17 @@ USER-MOFFF package :link(PKG-USER-MOFFF),h4 [Contents:] Pair, angle and improper styles needed to employ the MOF-FF -force field by Schmid and coworkers with LAMMPS. +force field by Schmid and coworkers with LAMMPS. MOF-FF is a first principles derived force field with the primary aim -to simulate MOFs and related porous framework materials, using spherical +to simulate MOFs and related porous framework materials, using spherical Gaussian charges. It is described in S. Bureekaew et al., Phys. Stat. Sol. B 2013, 250, 1128-1141. -For the usage of MOF-FF see the example in the example directory as +For the usage of MOF-FF see the example in the example directory as well as the "MOF+"_MOFplus website. :link(MOFplus,https://www.mofplus.org/content/show/MOF-FF) -[Author:] Hendrik Heenen (Technical U of Munich), +[Author:] Hendrik Heenen (Technical U of Munich), Rochus Schmid (Ruhr-University Bochum). [Supporting info:] @@ -1622,7 +1621,7 @@ at [Author:] Axel Kohlmeyer (Temple U). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1662,7 +1661,7 @@ tools: [Author:] Lars Pastewka (Karlsruhe Institute of Technology). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1706,7 +1705,7 @@ See src/MAKE/OPTIONS/Makefile.omp for an example. Once you have an appropriate Makefile.machine, you can install/un-install the package and build LAMMPS in the usual manner: -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1785,7 +1784,7 @@ without changes to LAMMPS itself. [Author:] Axel Kohlmeyer (Temple U). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1843,7 +1842,7 @@ on your system. [Author:] Albert Bartok (Cambridge University) -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -1937,7 +1936,7 @@ specified as surface geometries from *.STL files. [Author:] Georg Ganzenmuller (Fraunhofer-Institute for High-Speed Dynamics, Ernst Mach Institute, Germany). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -2063,7 +2062,7 @@ system. [Authors:] Richard Berger (JKU) and Daniel Queteschiner (DCS Computing). -[Install:] +[Install:] This package has "specific installation instructions"_Build_extras.html#gpu on the "Build @@ -2075,5 +2074,3 @@ src/USER-VTK: filenames -> commands src/USER-VTK/README lib/vtk/README "dump vtk"_dump_vtk.html :ul - - diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index 8bd6aa9937..0c05913117 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -115,7 +115,7 @@ LAMMPS was built with that package. See the "Build package"_Build_package.html doc page for more info. This current version of pair_style kim is compatible with the -kim-api package version 2.0.0-beta.1 and higher. +kim-api package version 2.0.0-beta.2 and higher. [Related commands:] From 4a4147e0e4983a871bc17c510abd39f0b77e80e3 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 5 Nov 2018 11:15:07 -0600 Subject: [PATCH 0058/1242] Remove hard-coded compiler versions for KIM in CMake --- cmake/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 5402ac1987..670313dadd 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -591,7 +591,7 @@ if(PKG_KIM) URL https://s3.openkim.org/kim-api/kim-api-v2.0.0-beta.2.txz URL_MD5 1fbdbb734059cf0dc9d807e6dd6cc8ea BINARY_DIR build - CMAKE_ARGS -DCMAKE_CXX_COMPILER=g++-8 -DCMAKE_C_COMPILER=gcc-8 -DCMAKE_Fortran_COMPILER=gfortran-8 -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Release + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Release ) ExternalProject_get_property(kim_build INSTALL_DIR) set(KIM-API-V2_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api-v2) From 81e79ec884ae2d88d0e5ee8357d6743b526b3abb Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Mon, 5 Nov 2018 15:39:10 -0600 Subject: [PATCH 0059/1242] Have KIM use LAMMPS specified compilers --- cmake/CMakeLists.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 670313dadd..3e6c57c667 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -586,12 +586,18 @@ endif() if(PKG_KIM) option(DOWNLOAD_KIM "Download kim-api (instead of using the system's one)" OFF) if(DOWNLOAD_KIM) + enable_language(C) + enable_language(Fortran) include(ExternalProject) ExternalProject_Add(kim_build URL https://s3.openkim.org/kim-api/kim-api-v2.0.0-beta.2.txz URL_MD5 1fbdbb734059cf0dc9d807e6dd6cc8ea BINARY_DIR build - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= -DCMAKE_BUILD_TYPE=Release + CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} + -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} + -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} + -DCMAKE_INSTALL_PREFIX= + -DCMAKE_BUILD_TYPE=Release ) ExternalProject_get_property(kim_build INSTALL_DIR) set(KIM-API-V2_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api-v2) @@ -603,7 +609,7 @@ if(PKG_KIM) message(FATAL_ERROR "KIM 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-V3_LIBRARIES}) + list(APPEND LAMMPS_LINK_LIBS ${KIM-API-V2_LIBRARIES}) include_directories(${KIM-API-V2_INCLUDE_DIRS}) endif() From 9727fdc47305b9ce29ec099a6a1d138892e38898 Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 8 Nov 2018 16:17:43 -0700 Subject: [PATCH 0060/1242] Commit JT 110818 - correct bug (match ewald/disp results for vir) - started correct mag. part --- examples/SPIN/pppm_spin/data.2 | 13 ++++ examples/SPIN/pppm_spin/in.spin.2 | 75 +++++++++++++++++++++ examples/SPIN/pppm_spin/in.spin.cut_comp | 72 +++++++++++++++++++++ examples/SPIN/pppm_spin/in.spin.pppm_spin | 10 +-- src/KSPACE/ewald_dipole.cpp | 28 ++++---- src/KSPACE/ewald_dipole_spin.cpp | 30 +++++---- src/SPIN/pair_spin_dipolar_cut.cpp | 79 +++++++++++------------ 7 files changed, 233 insertions(+), 74 deletions(-) create mode 100644 examples/SPIN/pppm_spin/data.2 create mode 100644 examples/SPIN/pppm_spin/in.spin.2 create mode 100644 examples/SPIN/pppm_spin/in.spin.cut_comp diff --git a/examples/SPIN/pppm_spin/data.2 b/examples/SPIN/pppm_spin/data.2 new file mode 100644 index 0000000000..426e3a9cb4 --- /dev/null +++ b/examples/SPIN/pppm_spin/data.2 @@ -0,0 +1,13 @@ +RANDOM INITIALIZATION FOR STOCKMAYER FLUID +2 atoms +1 atom types + + -3.0 3.0 xlo xhi + -3.0 3.0 ylo yhi + -3.0 3.0 zlo zhi + #30.0 30.0 0.0 xy xz yz + +Atoms + +1 1 1.73 0.0 0.0 0.0 0.0 0.0 1.0 +2 1 1.73 0.0 2.5 0.0 0.0 0.0 1.0 diff --git a/examples/SPIN/pppm_spin/in.spin.2 b/examples/SPIN/pppm_spin/in.spin.2 new file mode 100644 index 0000000000..29f3203694 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.2 @@ -0,0 +1,75 @@ +# two magnetic atoms in a 3d box + +clear +units metal +atom_style spin + +dimension 3 +#boundary p p p +atom_modify map array + +read_data ../examples/SPIN/pppm_spin/data.2 + + +mass 1 58.93 +#set group all spin/random 31 1.72 + +#velocity all create 100 4928459 rot yes dist gaussian + +pair_style spin/dipolar/cut 4.0 +pair_coeff * * long 2.6 +#pair_style hybrid/overlay spin/exchange 4.0 spin/dipolar/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 +#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long/qsymp 8.0 +#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +#pair_coeff * * spin/exchange exchange 4.0 0.1 1.135028015e-05 1.064568567 +#pair_coeff * * spin/dipolar/long long 8.0 + +#neighbor 0.1 bin +#neigh_modify every 10 check yes delay 20 +neighbor 0.3 bin +neigh_modify delay 0 +#neigh_modify every 1 delay 10 check yes page 100000000 one 10000000 + +#kspace_style pppm/dipole/spin 1.0e-4 +#kspace_style ewald/dipole/spin 1.0e-4 +#kspace_modify compute yes +#kspace_modify compute yes gewald 0.1 + +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +#fix 3 all nve/spin lattice yes +fix 3 all nve/spin lattice no + +timestep 0.0001 + +thermo_style custom step temp pe ke etotal press +thermo_modify format float %20.16g +thermo 1 + +#compute peratom all pe/atom +#compute pe all reduce sum c_peratom +#thermo_style custom step temp pe c_pe + +#compute peratom2 all stress/atom +#compute peratom2 all stress/atom NULL +#compute p all reduce sum c_peratom2[1] c_peratom2[2] c_peratom2[3] c_peratom2[4] c_peratom2[5] c_peratom2[6] +#variable press equal -(c_p[1]+c_p[2]+c_p[3])/(3*vol) +#variable pxx equal -c_p[1]/vol +#variable pyy equal -c_p[2]/vol +#variable pzz equal -c_p[3]/vol +#variable pxy equal -c_p[4]/vol +#variable pxz equal -c_p[5]/vol +#variable pyz equal -c_p[6]/vol +#thermo_style custom step temp etotal pe c_pe press v_press pxx v_pxx pyy v_pyy pzz v_pzz pxy v_pxy pxz v_pxz pyz v_pyz +#thermo_style custom step etotal pe press v_press v_pxx v_pyy v_pzz v_pxy v_pxz v_pyz +#thermo_style custom step temp etotal press v_press + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 1 all custom 1 dump.equil id type x y z c_outsp[1] c_outsp[2] c_outsp[3] +#c_outsp[5] c_outsp[6] c_outsp[7] +#dump_modify 1 format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g" scale yes + +#pair_modify compute no + +run 1 diff --git a/examples/SPIN/pppm_spin/in.spin.cut_comp b/examples/SPIN/pppm_spin/in.spin.cut_comp new file mode 100644 index 0000000000..3d01c56878 --- /dev/null +++ b/examples/SPIN/pppm_spin/in.spin.cut_comp @@ -0,0 +1,72 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p +atom_modify map array + +lattice bcc 2.8665 +region box block 0.0 5.0 0.0 5.0 0.0 5.0 +create_box 1 box +create_atoms 1 box + +mass 1 58.93 +#set group all spin 2.2 0.0 0.0 1.0 +set group all spin/random 31 2.2 + +#pair_style spin/dipolar/cut 5.0 +#pair_coeff * * long 5.0 +pair_style spin/dipolar/long 4.0 +pair_coeff * * long 4.0 + +#neighbor 0.1 bin +#neigh_modify every 10 check yes delay 20 +neighbor 0.3 bin +neigh_modify delay 0 +#neigh_modify every 1 delay 10 check yes page 100000000 one 10000000 + +#kspace_style pppm/dipole/spin 1.0e-4 +kspace_style ewald/dipole/spin 1.0e-4 +kspace_modify compute yes +#kspace_modify compute yes gewald 0.1 + +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.1 21 +#fix 3 all nve/spin lattice yes +fix 3 all nve/spin lattice no + +timestep 0.0001 + +thermo_style custom step temp pe ke etotal press +thermo_modify format float %20.16g +thermo 50 + +#compute peratom all pe/atom +#compute pe all reduce sum c_peratom +#thermo_style custom step temp pe c_pe + +#compute peratom2 all stress/atom +#compute peratom2 all stress/atom NULL +#compute p all reduce sum c_peratom2[1] c_peratom2[2] c_peratom2[3] c_peratom2[4] c_peratom2[5] c_peratom2[6] +#variable press equal -(c_p[1]+c_p[2]+c_p[3])/(3*vol) +#variable pxx equal -c_p[1]/vol +#variable pyy equal -c_p[2]/vol +#variable pzz equal -c_p[3]/vol +#variable pxy equal -c_p[4]/vol +#variable pxz equal -c_p[5]/vol +#variable pyz equal -c_p[6]/vol +#thermo_style custom step temp etotal pe c_pe press v_press pxx v_pxx pyy v_pyy pzz v_pzz pxy v_pxy pxz v_pxz pyz v_pyz +#thermo_style custom step etotal pe press v_press v_pxx v_pyy v_pzz v_pxy v_pxz v_pyz +#thermo_style custom step temp etotal press v_press + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 50 all custom 1 dump.equil id type x y z c_outsp[1] c_outsp[2] c_outsp[3] +#c_outsp[5] c_outsp[6] c_outsp[7] +#dump_modify 1 format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g" scale yes + +#pair_modify compute no + +run 10000 diff --git a/examples/SPIN/pppm_spin/in.spin.pppm_spin b/examples/SPIN/pppm_spin/in.spin.pppm_spin index 6762fe6fab..78dfbb56a0 100644 --- a/examples/SPIN/pppm_spin/in.spin.pppm_spin +++ b/examples/SPIN/pppm_spin/in.spin.pppm_spin @@ -19,14 +19,15 @@ create_atoms 1 box mass 1 58.93 -#set group all spin/random 31 1.72 -set group all spin 1.72 0.0 0.0 1.0 +set group all spin/random 31 1.72 +#set group all spin 1.72 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long 8.0 #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/long/qsymp 8.0 pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * spin/exchange exchange 4.0 0.0 1.135028015e-05 1.064568567 #pair_coeff * * spin/dipolar/long/qsymp long 8.0 pair_coeff * * spin/dipolar/long long 8.0 @@ -34,7 +35,7 @@ neighbor 0.1 bin neigh_modify every 10 check yes delay 20 kspace_style pppm/dipole/spin 1.0e-4 -#kspace_modify mesh 32 32 32 +kspace_modify compute yes #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 @@ -55,6 +56,7 @@ variable emag equal c_out_mag[5] variable tmag equal c_out_mag[6] thermo_style custom step time v_magnorm v_emag temp etotal +thermo_modify format float %20.16g thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index f2124deb4f..92470eb4a8 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -439,8 +439,7 @@ void EwaldDipole::compute(int eflag, int vflag) for (i = 0; i < nlocal; i++) { - vcik[0] = vcik[1] = vcik[2] = 0.0; - vcik[3] = vcik[4] = vcik[5] = 0.0; + for (j = 0; j<6; j++) vcik[j] = 0.0; // calculating re and im of exp(i*k*ri) @@ -458,29 +457,28 @@ void EwaldDipole::compute(int eflag, int vflag) // compute field for torque calculation - partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; - tk[i][0] += partial2*eg[k][0]; - tk[i][1] += partial2*eg[k][1]; - tk[i][2] += partial2*eg[k][2]; + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + tk[i][0] += partial_peratom * eg[k][0]; + tk[i][1] += partial_peratom * eg[k][1]; + tk[i][2] += partial_peratom * eg[k][2]; // total and per-atom virial correction (dipole only) - vc[k][0] += vcik[0] = partial2 * mu[i][0] * kx; - vc[k][1] += vcik[1] = partial2 * mu[i][1] * ky; - vc[k][2] += vcik[2] = partial2 * mu[i][2] * kz; - vc[k][3] += vcik[3] = partial2 * mu[i][0] * ky; - vc[k][4] += vcik[4] = partial2 * mu[i][0] * kz; - vc[k][5] += vcik[5] = partial2 * mu[i][1] * kz; + vc[k][0] += vcik[0] = -(partial_peratom * mu[i][0] * eg[k][0]); + vc[k][1] += vcik[1] = -(partial_peratom * mu[i][1] * eg[k][1]); + vc[k][2] += vcik[2] = -(partial_peratom * mu[i][2] * eg[k][2]); + vc[k][3] += vcik[3] = -(partial_peratom * mu[i][0] * eg[k][1]); + vc[k][4] += vcik[4] = -(partial_peratom * mu[i][0] * eg[k][2]); + vc[k][5] += vcik[5] = -(partial_peratom * mu[i][1] * eg[k][2]); // taking re-part of struct_fact x exp(i*k*ri) // (for per-atom energy and virial calc.) if (evflag_atom) { - partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) - vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); + vatom[i][j] += (ug[k]*muk[k][i]*vg[k][j]*partial_peratom - vcik[j]); } } } @@ -517,7 +515,7 @@ void EwaldDipole::compute(int eflag, int vflag) double uk, vk; for (k = 0; k < kcount; k++) { uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); - for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] + ug[k]*vc[k][j]; + for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] - vc[k][j]; } for (j = 0; j < 6; j++) virial[j] *= muscale; } diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 3554f66f36..4313f7b57b 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -428,13 +428,14 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // taking im of struct_fact x exp(i*k*ri) (for force calc.) partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); - ek[i][0] += partial*eg[k][0]; - ek[i][1] += partial*eg[k][1]; - ek[i][2] += partial*eg[k][2]; + ek[i][0] += partial * eg[k][0]; + ek[i][1] += partial * eg[k][1]; + ek[i][2] += partial * eg[k][2]; // compute field for torque calculation - partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + //partial2 = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; tk[i][0] += partial2*eg[k][0]; tk[i][1] += partial2*eg[k][1]; tk[i][2] += partial2*eg[k][2]; @@ -445,22 +446,23 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) spy = sp[i][1]*sp[i][3]; spz = sp[i][2]*sp[i][3]; - vc[k][0] += vcik[0] = partial2 * spx * kx; - vc[k][1] += vcik[1] = partial2 * spy * ky; - vc[k][2] += vcik[2] = partial2 * spz * kz; - vc[k][3] += vcik[3] = partial2 * spx * ky; - vc[k][4] += vcik[4] = partial2 * spx * kz; - vc[k][5] += vcik[5] = partial2 * spy * kz; + vc[k][0] += vcik[0] = -(partial_peratom * spx * eg[k][0]); + vc[k][1] += vcik[1] = -(partial_peratom * spy * eg[k][1]); + vc[k][2] += vcik[2] = -(partial_peratom * spz * eg[k][2]); + vc[k][3] += vcik[3] = -(partial_peratom * spx * eg[k][1]); + vc[k][4] += vcik[4] = -(partial_peratom * spx * eg[k][2]); + vc[k][5] += vcik[5] = -(partial_peratom * spy * eg[k][2]); // taking re-part of struct_fact x exp(i*k*ri) // (for per-atom energy and virial calc.) if (evflag_atom) { - partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; + //partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) - vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); + vatom[i][j] += (ug[k]*muk[k][i]*vg[k][j]*partial_peratom - vcik[j]); + //vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); } } } @@ -498,7 +500,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) double uk, vk; for (k = 0; k < kcount; k++) { uk = ug[k] * (sfacrl_all[k]*sfacrl_all[k] + sfacim_all[k]*sfacim_all[k]); - for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] + ug[k]*vc[k][j]; + for (j = 0; j < 6; j++) virial[j] += uk*vg[k][j] - vc[k][j]; } for (j = 0; j < 6; j++) virial[j] *= spscale; } @@ -529,7 +531,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) } /* ---------------------------------------------------------------------- - compute the + compute the struc. factors and mu dot k products ------------------------------------------------------------------------- */ void EwaldDipoleSpin::eik_dot_r() diff --git a/src/SPIN/pair_spin_dipolar_cut.cpp b/src/SPIN/pair_spin_dipolar_cut.cpp index 2c44b25fbf..b8927d62e9 100644 --- a/src/SPIN/pair_spin_dipolar_cut.cpp +++ b/src/SPIN/pair_spin_dipolar_cut.cpp @@ -65,17 +65,12 @@ lockfixnvespin(NULL) lattice_flag = 0; hbar = force->hplanck/MY_2PI; // eV/(rad.THz) - //mub = 5.78901e-5; // in eV/T - //mu_0 = 1.2566370614e-6; // in T.m/A mub = 9.274e-4; // in A.Ang^2 mu_0 = 785.15; // in eV/Ang/A^2 mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV.Ang^3 - //mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0 = mub * mub * mu_0 / (4.0*MY_PI); // in eV mub2mu0hbinv = mub2mu0 / hbar; // in rad.THz - //printf("hbar: %g, mub2mu0hbinv: %g \n",hbar,mub2mu0hbinv); - } /* ---------------------------------------------------------------------- @@ -103,6 +98,9 @@ void PairSpinDipolarCut::settings(int narg, char **arg) if (strcmp(update->unit_style,"metal") != 0) error->all(FLERR,"Spin simulations require metal unit style"); + if (!atom->sp) + error->all(FLERR,"Pair/spin style requires atom attribute sp"); + cut_spin_long_global = force->numeric(FLERR,arg[0]); // reset cutoffs that have been explicitly set @@ -234,7 +232,7 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) int i,j,ii,jj,inum,jnum,itype,jtype; double rinv,r2inv,r3inv,rsq; double evdwl,ecoul; - double xi[3],rij[3]; + double xi[3],rij[3],eij[3]; double spi[4],spj[4],fi[3],fmi[3]; double local_cut2; int *ilist,*jlist,*numneigh,**firstneigh; @@ -282,6 +280,7 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) spj[2] = sp[j][2]; spj[3] = sp[j][3]; + evdwl = 0.0; fi[0] = fi[1] = fi[2] = 0.0; fmi[0] = fmi[1] = fmi[2] = 0.0; @@ -289,16 +288,19 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) 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]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; if (rsq < local_cut2) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); r3inv = r2inv*rinv; - compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); - if (lattice_flag) compute_dipolar_mech(i,j,rij,fmi,spi,spj,r2inv); + compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); + if (lattice_flag) compute_dipolar_mech(i,j,eij,fi,spi,spj,r2inv); } // force accumulation @@ -318,13 +320,11 @@ void PairSpinDipolarCut::compute(int eflag, int vflag) if (eflag) { if (rsq <= local_cut2) { - evdwl -= spi[0]*fmi[0] + spi[1]*fmi[1] + - spi[2]*fmi[2]; + 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],rij[0],rij[1],rij[2]); @@ -342,7 +342,7 @@ void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) { int i,j,jj,jnum,itype,jtype; double rsq,rinv,r2inv,r3inv; - double xi[3],rij[3]; + double xi[3],rij[3],eij[3]; double spi[4],spj[4]; double local_cut2; int *ilist,*jlist,*numneigh,**firstneigh; @@ -384,44 +384,41 @@ void PairSpinDipolarCut::compute_single_pair(int ii, double fmi[3]) 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]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; if (rsq < local_cut2) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); r3inv = r2inv*rinv; // compute dipolar interaction - compute_dipolar(i,j,rij,fmi,spi,spj,r3inv); + compute_dipolar(i,j,eij,fmi,spi,spj,r3inv); } } - - //printf("test fm: %g, %g, %g \n",fmi[0],fmi[1],fmi[2]); - - //fmi[0] *= mub2mu0hbinv; - //fmi[1] *= mub2mu0hbinv; - //fmi[2] *= mub2mu0hbinv; } /* ---------------------------------------------------------------------- compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::compute_dipolar(int i, int j, double rij[3], +void PairSpinDipolarCut::compute_dipolar(int i, int j, double eij[3], double fmi[3], double spi[4], double spj[4], double r3inv) { double sjdotr; - double gigjri3,pre; + double gigjiri3,pre; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; - gigjri3 = (spi[3] * spj[3])*r3inv; - pre = mub2mu0hbinv * gigjri3 / 4.0 / MY_PI; + sjdotr = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; + gigjiri3 = (spi[3] * spj[3])*r3inv; + pre = mub2mu0hbinv * gigjiri3; - fmi[0] += pre * gigjri3 * (3.0 * sjdotr *rij[0] - spj[0]); - fmi[1] += pre * gigjri3 * (3.0 * sjdotr *rij[1] - spj[1]); - fmi[2] += pre * gigjri3 * (3.0 * sjdotr *rij[2] - spj[2]); + fmi[0] += pre * (3.0 * sjdotr *eij[0] - spj[0]); + fmi[1] += pre * (3.0 * sjdotr *eij[1] - spj[1]); + fmi[2] += pre * (3.0 * sjdotr *eij[2] - spj[2]); } /* ---------------------------------------------------------------------- @@ -429,25 +426,25 @@ void PairSpinDipolarCut::compute_dipolar(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double rij[3], +void PairSpinDipolarCut::compute_dipolar_mech(int i, int j, double eij[3], double fi[3], double spi[3], double spj[3], double r2inv) { - double sdots,sidotr,sjdotr,b2,b3; + double sisj,sieij,sjeij; double gigjri4,bij,pre; - gigjri4 = (spi[3] * spj[3])/r2inv/r2inv; - sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; - sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + gigjri4 = (spi[3] * spj[3])*r2inv*r2inv; + sisj = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sieij = spi[0]*eij[0] + spi[1]*eij[1] + spi[2]*eij[2]; + sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; + + bij = sisj - 5.0*sieij*sjeij; + pre = mub2mu0*gigjri4; - bij = sdots - 5.0 * sidotr*sjdotr; - pre = mub2mu0 * bij / 4.0 / MY_PI; - fi[0] += pre * (rij[0] * bij + (sjdotr*spi[0] + sidotr*spj[0])); - fi[1] += pre * (rij[1] * bij + (sjdotr*spi[1] + sidotr*spj[1])); - fi[2] += pre * (rij[2] * bij + (sjdotr*spi[2] + sidotr*spj[2])); + fi[0] += pre * (eij[0] * bij + (sjeij*spi[0] + sieij*spj[0])); + fi[1] += pre * (eij[1] * bij + (sjeij*spi[1] + sieij*spj[1])); + fi[2] += pre * (eij[2] * bij + (sjeij*spi[2] + sieij*spj[2])); } - /* ---------------------------------------------------------------------- allocate all arrays ------------------------------------------------------------------------- */ From d66a1ac054222c06cb95285f364127e6bb9ee815 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 13 Nov 2018 17:03:32 -0700 Subject: [PATCH 0061/1242] Commit JT 111318 - corrections pair/spin/dipolar/long --- examples/SPIN/pppm_spin/in.dipole.pppm_dipole | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole index 86ac5198b0..d029d0a97c 100644 --- a/examples/SPIN/pppm_spin/in.dipole.pppm_dipole +++ b/examples/SPIN/pppm_spin/in.dipole.pppm_dipole @@ -28,7 +28,7 @@ pair_coeff * * 0.0 0.0 #kspace_style pppm/disp 1.0e-4 #kspace_style pppm/dipole 1.0e-4 kspace_style ewald/dipole 1.0e-4 -#kspace_modify gewald 0.1 +#kspace_modify compute yes gewald 0.1 neighbor 0.3 bin neigh_modify every 2 delay 4 check yes From ddd5e61254d0f2b263ae0fe2bd30ab77470d66e8 Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 14 Nov 2018 09:46:16 -0700 Subject: [PATCH 0062/1242] Commit JT 111418 - removed muk table (size kmax3d, mem fault) --- src/KSPACE/ewald_dipole.cpp | 91 +++++++++++++++-------------- src/KSPACE/ewald_dipole.h | 2 +- src/KSPACE/ewald_dipole_spin.cpp | 98 ++++++++++++++++---------------- 3 files changed, 95 insertions(+), 96 deletions(-) diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 92470eb4a8..0cd5c95a9b 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -45,11 +45,10 @@ using namespace MathSpecial; /* ---------------------------------------------------------------------- */ EwaldDipole::EwaldDipole(LAMMPS *lmp, int narg, char **arg) : Ewald(lmp, narg, arg), - muk(NULL), tk(NULL), vc(NULL) + tk(NULL), vc(NULL) { ewaldflag = dipoleflag = 1; group_group_enable = 0; - muk = NULL; tk = NULL; vc = NULL; } @@ -60,7 +59,6 @@ EwaldDipole::EwaldDipole(LAMMPS *lmp, int narg, char **arg) : Ewald(lmp, narg, a EwaldDipole::~EwaldDipole() { - memory->destroy(muk); memory->destroy(tk); memory->destroy(vc); } @@ -326,14 +324,12 @@ void EwaldDipole::setup() memory->destroy(vc); memory->destroy3d_offset(cs,-kmax_created); memory->destroy3d_offset(sn,-kmax_created); - memory->destroy(muk); nmax = atom->nmax; memory->create(ek,nmax,3,"ewald_dipole:ek"); memory->create(tk,nmax,3,"ewald_dipole:tk"); memory->create(vc,kmax3d,6,"ewald_dipole:tk"); memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole:cs"); memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole:sn"); - memory->create(muk,kmax3d,nmax,"ewald_dipole:muk"); kmax_created = kmax; } @@ -393,14 +389,12 @@ void EwaldDipole::compute(int eflag, int vflag) memory->destroy(vc); memory->destroy3d_offset(cs,-kmax_created); memory->destroy3d_offset(sn,-kmax_created); - memory->destroy(muk); nmax = atom->nmax; memory->create(ek,nmax,3,"ewald_dipole:ek"); memory->create(tk,nmax,3,"ewald_dipole:tk"); memory->create(vc,kmax3d,6,"ewald_dipole:tk"); memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole:cs"); memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole:sn"); - memory->create(muk,kmax3d,nmax,"ewald_dipole:muk"); kmax_created = kmax; } @@ -425,6 +419,7 @@ void EwaldDipole::compute(int eflag, int vflag) double cypz,sypz,exprl,expim; double partial,partial2,partial_peratom; double vcik[6]; + double mudotk; for (i = 0; i < nlocal; i++) { ek[i][0] = ek[i][1] = ek[i][2] = 0.0; @@ -440,6 +435,9 @@ void EwaldDipole::compute(int eflag, int vflag) for (i = 0; i < nlocal; i++) { for (j = 0; j<6; j++) vcik[j] = 0.0; + + // re-evaluating mu dot k + mudotk = mu[i][0]*kx*unitk[0] + mu[i][1]*ky*unitk[1] + mu[i][2]*kz*unitk[2]; // calculating re and im of exp(i*k*ri) @@ -450,7 +448,7 @@ void EwaldDipole::compute(int eflag, int vflag) // taking im of struct_fact x exp(i*k*ri) (for force calc.) - partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); + partial = (mudotk)*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial * eg[k][0]; ek[i][1] += partial * eg[k][1]; ek[i][2] += partial * eg[k][2]; @@ -475,10 +473,10 @@ void EwaldDipole::compute(int eflag, int vflag) // (for per-atom energy and virial calc.) if (evflag_atom) { - if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; + if (eflag_atom) eatom[i] += mudotk*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) - vatom[i][j] += (ug[k]*muk[k][i]*vg[k][j]*partial_peratom - vcik[j]); + vatom[i][j] += (ug[k]*mudotk*vg[k][j]*partial_peratom - vcik[j]); } } } @@ -552,6 +550,7 @@ void EwaldDipole::eik_dot_r() double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; double sqk,clpm,slpm; double mux, muy, muz; + double mudotk; double **x = atom->x; double **mu = atom->mu; @@ -582,9 +581,9 @@ void EwaldDipole::eik_dot_r() sn[1][ic][i] = sin(unitk[ic]*x[i][ic]); cs[-1][ic][i] = cs[1][ic][i]; sn[-1][ic][i] = -sn[1][ic][i]; - muk[n][i] = (mu[i][ic]*unitk[ic]); - cstr1 += muk[n][i]*cs[1][ic][i]; - sstr1 += muk[n][i]*sn[1][ic][i]; + mudotk = (mu[i][ic]*unitk[ic]); + cstr1 += mudotk*cs[1][ic][i]; + sstr1 += mudotk*sn[1][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -606,9 +605,9 @@ void EwaldDipole::eik_dot_r() cs[m-1][ic][i]*sn[1][ic][i]; cs[-m][ic][i] = cs[m][ic][i]; sn[-m][ic][i] = -sn[m][ic][i]; - muk[n][i] = (mu[i][ic]*m*unitk[ic]); - cstr1 += muk[n][i]*cs[m][ic][i]; - sstr1 += muk[n][i]*sn[m][ic][i]; + mudotk = (mu[i][ic]*m*unitk[ic]); + cstr1 += mudotk*cs[m][ic][i]; + sstr1 += mudotk*sn[m][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -631,14 +630,14 @@ void EwaldDipole::eik_dot_r() muy = mu[i][1]; // dir 1: (k,l,0) - muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1]); - cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); - sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); + mudotk = (mux*k*unitk[0] + muy*l*unitk[1]); + cstr1 += mudotk*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); + sstr1 += mudotk*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); // dir 2: (k,-l,0) - muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1]); - cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); - sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); + mudotk = (mux*k*unitk[0] - muy*l*unitk[1]); + cstr2 += mudotk*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); + sstr2 += mudotk*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -663,14 +662,14 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (0,l,m) - muk[n][i] = (muy*l*unitk[1] + muz*m*unitk[2]); - cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); - sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); + mudotk = (muy*l*unitk[1] + muz*m*unitk[2]); + cstr1 += mudotk*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); + sstr1 += mudotk*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); // dir 2: (0,l,-m) - muk[n+1][i] = (muy*l*unitk[1] - muz*m*unitk[2]); - cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); - sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); + mudotk = (muy*l*unitk[1] - muz*m*unitk[2]); + cstr2 += mudotk*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); + sstr2 += mudotk*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -695,14 +694,14 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (k,0,m) - muk[n][i] = (mux*k*unitk[0] + muz*m*unitk[2]); - cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); - sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); + mudotk = (mux*k*unitk[0] + muz*m*unitk[2]); + cstr1 += mudotk*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); + sstr1 += mudotk*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); // dir 2: (k,0,-m) - muk[n+1][i] = (mux*k*unitk[0] - muz*m*unitk[2]); - cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); - sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); + mudotk = (mux*k*unitk[0] - muz*m*unitk[2]); + cstr2 += mudotk*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); + sstr2 += mudotk*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -734,32 +733,32 @@ void EwaldDipole::eik_dot_r() muz = mu[i][2]; // dir 1: (k,l,m) - muk[n][i] = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] + muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; - cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr1 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr1 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 2: (k,-l,m) - muk[n+1][i] = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] - muy*l*unitk[1] + muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; - cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr2 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr2 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 3: (k,l,-m) - muk[n+2][i] = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] + muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; - cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr3 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr3 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 4: (k,-l,-m) - muk[n+3][i] = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); + mudotk = (mux*k*unitk[0] - muy*l*unitk[1] - muz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; - cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr4 += muk[n+3][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr4 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr4 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index 0a57f86d00..77c0af11c2 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -34,7 +34,7 @@ class EwaldDipole : public Ewald { protected: double musum,musqsum,mu2; - double **muk; // mu_i dot k + //double **muk; // mu_i dot k double **tk; // field for torque double **vc; // virial per k diff --git a/src/KSPACE/ewald_dipole_spin.cpp b/src/KSPACE/ewald_dipole_spin.cpp index 4313f7b57b..e6cfbfbaa6 100644 --- a/src/KSPACE/ewald_dipole_spin.cpp +++ b/src/KSPACE/ewald_dipole_spin.cpp @@ -318,14 +318,12 @@ void EwaldDipoleSpin::setup() memory->destroy(vc); memory->destroy3d_offset(cs,-kmax_created); memory->destroy3d_offset(sn,-kmax_created); - memory->destroy(muk); nmax = atom->nmax; memory->create(ek,nmax,3,"ewald_dipole_spin:ek"); memory->create(tk,nmax,3,"ewald_dipole_spin:tk"); memory->create(vc,kmax3d,6,"ewald_dipole_spin:tk"); memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole_spin:cs"); memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole_spin:sn"); - memory->create(muk,kmax3d,nmax,"ewald_dipole_spin:muk"); kmax_created = kmax; } @@ -369,14 +367,12 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) memory->destroy(vc); memory->destroy3d_offset(cs,-kmax_created); memory->destroy3d_offset(sn,-kmax_created); - memory->destroy(muk); nmax = atom->nmax; memory->create(ek,nmax,3,"ewald_dipole_spin:ek"); memory->create(tk,nmax,3,"ewald_dipole_spin:tk"); memory->create(vc,kmax3d,6,"ewald_dipole_spin:tk"); memory->create3d_offset(cs,-kmax,kmax,3,nmax,"ewald_dipole_spin:cs"); memory->create3d_offset(sn,-kmax,kmax,3,nmax,"ewald_dipole_spin:sn"); - memory->create(muk,kmax3d,nmax,"ewald_dipole_spin:muk"); kmax_created = kmax; } @@ -401,6 +397,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) double cypz,sypz,exprl,expim; double partial,partial2,partial_peratom; double vcik[6]; + double mudotk; for (i = 0; i < nlocal; i++) { ek[i][0] = ek[i][1] = ek[i][2] = 0.0; @@ -415,8 +412,14 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) for (i = 0; i < nlocal; i++) { - vcik[0] = vcik[1] = vcik[2] = 0.0; - vcik[3] = vcik[4] = vcik[5] = 0.0; + for (j = 0; j<6; j++) vcik[j] = 0.0; + + // re-evaluating sp dot k + + spx = sp[i][0]*sp[i][3]; + spy = sp[i][1]*sp[i][3]; + spz = sp[i][2]*sp[i][3]; + mudotk = spx*kx*unitk[0] + spy*ky*unitk[1] + spz*kz*unitk[2]; // calculating re and im of exp(i*k*ri) @@ -427,7 +430,7 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // taking im of struct_fact x exp(i*k*ri) (for force calc.) - partial = (muk[k][i])*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); + partial = mudotk*(expim*sfacrl_all[k] - exprl*sfacim_all[k]); ek[i][0] += partial * eg[k][0]; ek[i][1] += partial * eg[k][1]; ek[i][2] += partial * eg[k][2]; @@ -442,10 +445,6 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) // total and per-atom virial correction - spx = sp[i][0]*sp[i][3]; - spy = sp[i][1]*sp[i][3]; - spz = sp[i][2]*sp[i][3]; - vc[k][0] += vcik[0] = -(partial_peratom * spx * eg[k][0]); vc[k][1] += vcik[1] = -(partial_peratom * spy * eg[k][1]); vc[k][2] += vcik[2] = -(partial_peratom * spz * eg[k][2]); @@ -458,10 +457,10 @@ void EwaldDipoleSpin::compute(int eflag, int vflag) if (evflag_atom) { //partial_peratom = exprl*sfacrl_all[k] + expim*sfacim_all[k]; - if (eflag_atom) eatom[i] += muk[k][i]*ug[k]*partial_peratom; + if (eflag_atom) eatom[i] += mudotk*ug[k]*partial_peratom; if (vflag_atom) for (j = 0; j < 6; j++) - vatom[i][j] += (ug[k]*muk[k][i]*vg[k][j]*partial_peratom - vcik[j]); + vatom[i][j] += (ug[k]*mudotk*vg[k][j]*partial_peratom - vcik[j]); //vatom[i][j] += ug[k] * (vg[k][j]*partial_peratom - vcik[j]); } } @@ -540,6 +539,7 @@ void EwaldDipoleSpin::eik_dot_r() double cstr1,sstr1,cstr2,sstr2,cstr3,sstr3,cstr4,sstr4; double sqk,clpm,slpm; double spx, spy, spz, spi; + double mudotk; double **x = atom->x; double **sp = atom->sp; @@ -571,9 +571,9 @@ void EwaldDipoleSpin::eik_dot_r() cs[-1][ic][i] = cs[1][ic][i]; sn[-1][ic][i] = -sn[1][ic][i]; spi = sp[i][ic]*sp[i][3]; - muk[n][i] = (spi*unitk[ic]); - cstr1 += muk[n][i]*cs[1][ic][i]; - sstr1 += muk[n][i]*sn[1][ic][i]; + mudotk = (spi*unitk[ic]); + cstr1 += mudotk*cs[1][ic][i]; + sstr1 += mudotk*sn[1][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -596,9 +596,9 @@ void EwaldDipoleSpin::eik_dot_r() cs[-m][ic][i] = cs[m][ic][i]; sn[-m][ic][i] = -sn[m][ic][i]; spi = sp[i][ic]*sp[i][3]; - muk[n][i] = (spi*m*unitk[ic]); - cstr1 += muk[n][i]*cs[m][ic][i]; - sstr1 += muk[n][i]*sn[m][ic][i]; + mudotk = (spi*m*unitk[ic]); + cstr1 += mudotk*cs[m][ic][i]; + sstr1 += mudotk*sn[m][ic][i]; } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -621,14 +621,14 @@ void EwaldDipoleSpin::eik_dot_r() spy = sp[i][1]*sp[i][3]; // dir 1: (k,l,0) - muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1]); - cstr1 += muk[n][i]*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); - sstr1 += muk[n][i]*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); + mudotk = (spx*k*unitk[0] + spy*l*unitk[1]); + cstr1 += mudotk*(cs[k][0][i]*cs[l][1][i]-sn[k][0][i]*sn[l][1][i]); + sstr1 += mudotk*(sn[k][0][i]*cs[l][1][i]+cs[k][0][i]*sn[l][1][i]); // dir 2: (k,-l,0) - muk[n+1][i] = (spx*k*unitk[0] - spy*l*unitk[1]); - cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); - sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); + mudotk = (spx*k*unitk[0] - spy*l*unitk[1]); + cstr2 += mudotk*(cs[k][0][i]*cs[l][1][i]+sn[k][0][i]*sn[l][1][i]); + sstr2 += mudotk*(sn[k][0][i]*cs[l][1][i]-cs[k][0][i]*sn[l][1][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -653,14 +653,14 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (0,l,m) - muk[n][i] = (spy*l*unitk[1] + spz*m*unitk[2]); - cstr1 += muk[n][i]*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); - sstr1 += muk[n][i]*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); + mudotk = (spy*l*unitk[1] + spz*m*unitk[2]); + cstr1 += mudotk*(cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]); + sstr1 += mudotk*(sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]); // dir 2: (0,l,-m) - muk[n+1][i] = (spy*l*unitk[1] - spz*m*unitk[2]); - cstr2 += muk[n+1][i]*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); - sstr2 += muk[n+1][i]*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); + mudotk = (spy*l*unitk[1] - spz*m*unitk[2]); + cstr2 += mudotk*(cs[l][1][i]*cs[m][2][i]+sn[l][1][i]*sn[m][2][i]); + sstr2 += mudotk*(sn[l][1][i]*cs[m][2][i]-cs[l][1][i]*sn[m][2][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -685,14 +685,14 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (k,0,m) - muk[n][i] = (spx*k*unitk[0] + spz*m*unitk[2]); - cstr1 += muk[n][i]*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); - sstr1 += muk[n][i]*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); + mudotk = (spx*k*unitk[0] + spz*m*unitk[2]); + cstr1 += mudotk*(cs[k][0][i]*cs[m][2][i]-sn[k][0][i]*sn[m][2][i]); + sstr1 += mudotk*(sn[k][0][i]*cs[m][2][i]+cs[k][0][i]*sn[m][2][i]); // dir 2: (k,0,-m) - muk[n+1][i] = (spx*k*unitk[0] - spz*m*unitk[2]); - cstr2 += muk[n+1][i]*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); - sstr2 += muk[n+1][i]*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); + mudotk = (spx*k*unitk[0] - spz*m*unitk[2]); + cstr2 += mudotk*(cs[k][0][i]*cs[m][2][i]+sn[k][0][i]*sn[m][2][i]); + sstr2 += mudotk*(sn[k][0][i]*cs[m][2][i]-cs[k][0][i]*sn[m][2][i]); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; @@ -724,32 +724,32 @@ void EwaldDipoleSpin::eik_dot_r() spz = sp[i][2]*sp[i][3]; // dir 1: (k,l,m) - muk[n][i] = (spx*k*unitk[0] + spy*l*unitk[1] + spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] + spy*l*unitk[1] + spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; - cstr1 += muk[n][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr1 += muk[n][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr1 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr1 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 2: (k,-l,m) - muk[n+1][i] = (spx*k*unitk[0] - spy*l*unitk[1] + spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] - spy*l*unitk[1] + spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i]; - cstr2 += muk[n+1][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr2 += muk[n+1][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr2 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr2 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 3: (k,l,-m) - muk[n+2][i] = (spx*k*unitk[0] + spy*l*unitk[1] - spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] + spy*l*unitk[1] - spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] + sn[l][1][i]*sn[m][2][i]; slpm = sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; - cstr3 += muk[n+2][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr3 += muk[n+2][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr3 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr3 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); // dir 4: (k,-l,-m) - muk[n+3][i] = (spx*k*unitk[0] - spy*l*unitk[1] - spz*m*unitk[2]); + mudotk = (spx*k*unitk[0] - spy*l*unitk[1] - spz*m*unitk[2]); clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i]; slpm = -sn[l][1][i]*cs[m][2][i] - cs[l][1][i]*sn[m][2][i]; - cstr4 += muk[n+3][i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); - sstr4 += muk[n+3][i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); + cstr4 += mudotk*(cs[k][0][i]*clpm - sn[k][0][i]*slpm); + sstr4 += mudotk*(sn[k][0][i]*clpm + cs[k][0][i]*slpm); } sfacrl[n] = cstr1; sfacim[n++] = sstr1; From 03b1129abde8d85fe20dd450a43976aca8fe623a Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 14 Nov 2018 13:11:47 -0500 Subject: [PATCH 0063/1242] Update pair_kim to check for ModelRoutine requirements Also fixup cmake settings for PKG_KIM --- cmake/CMakeLists.txt | 2 +- src/KIM/pair_kim.cpp | 51 ++++++++++++++++++++++++++++++++++++++++++++ src/KIM/pair_kim.h | 1 + 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 3e6c57c667..1e0d207a7e 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -609,7 +609,7 @@ if(PKG_KIM) message(FATAL_ERROR "KIM 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_LIBRARIES}) + list(APPEND LAMMPS_LINK_LIBS "${KIM-API-V2_LDFLAGS}") include_directories(${KIM-API-V2_INCLUDE_DIRS}) endif() diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 072c3a6296..6981b028b2 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -789,6 +789,14 @@ void PairKIM::kim_init() error->all(FLERR,"KIM Model did not accept the requested unit system"); } + // check that the model does not require unknown capabilities + kimerror = check_for_routine_compatibility(); + if (kimerror) + { + error->all(FLERR, + "KIM Model requires unknown Routines. Unable to proceed."); + } + kimerror = KIM_Model_ComputeArgumentsCreate(pkim, &pargs); if (kimerror) { @@ -987,6 +995,49 @@ void PairKIM::set_lmps_flags() /* ---------------------------------------------------------------------- */ +int PairKIM::check_for_routine_compatibility() +{ + /* Check that we know about all required routines */ + int numberOfModelRoutineNames; + KIM_MODEL_ROUTINE_NAME_GetNumberOfModelRoutineNames( + &numberOfModelRoutineNames); + for (int i = 0; i < numberOfModelRoutineNames; ++i) + { + KIM_ModelRoutineName modelRoutineName; + KIM_MODEL_ROUTINE_NAME_GetModelRoutineName(i, &modelRoutineName); + + int present; + int required; + int error = KIM_Model_IsRoutinePresent( + pkim, modelRoutineName, &present, &required); + if (error) { return true; } + + if ((present == true) && (required == true)) + { + if (!(KIM_ModelRoutineName_Equal(modelRoutineName, + KIM_MODEL_ROUTINE_NAME_Create) + || KIM_ModelRoutineName_Equal( + modelRoutineName, + KIM_MODEL_ROUTINE_NAME_ComputeArgumentsCreate) + || KIM_ModelRoutineName_Equal(modelRoutineName, + KIM_MODEL_ROUTINE_NAME_Compute) + || KIM_ModelRoutineName_Equal(modelRoutineName, + KIM_MODEL_ROUTINE_NAME_Refresh) + || KIM_ModelRoutineName_Equal( + modelRoutineName, + KIM_MODEL_ROUTINE_NAME_ComputeArgumentsDestroy) + || KIM_ModelRoutineName_Equal(modelRoutineName, + KIM_MODEL_ROUTINE_NAME_Destroy))) + { return true; } + } + } + + /* everything is good */ + return false; +} + +/* ---------------------------------------------------------------------- */ + void PairKIM::set_kim_model_has_flags() { int numberOfComputeArgumentNames; diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index 1b8051ea1e..a23d5cd317 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -158,6 +158,7 @@ namespace LAMMPS_NS { virtual void set_argument_pointers(); virtual void set_lmps_flags(); virtual void set_kim_model_has_flags(); + virtual int check_for_routine_compatibility(); // static methods used as callbacks from KIM static int get_neigh( void const * const dataObject, From c59b3439c682430e063270b42fa58b51e2ec167d Mon Sep 17 00:00:00 2001 From: Cyril Falvo Date: Tue, 3 Jul 2018 16:07:15 +0200 Subject: [PATCH 0064/1242] changes the values of some parameters in REBO in accordance to the original Brenner paper --- potentials/CH.rebo | 37595 +++++++++++++++++++++++++++++++++++ src/MANYBODY/pair_rebo.cpp | 264 +- src/MANYBODY/pair_rebo.h | 1 + 3 files changed, 37855 insertions(+), 5 deletions(-) create mode 100644 potentials/CH.rebo diff --git a/potentials/CH.rebo b/potentials/CH.rebo new file mode 100644 index 0000000000..08b1b19dc2 --- /dev/null +++ b/potentials/CH.rebo @@ -0,0 +1,37595 @@ +# DATE: 2018-7-3 CONTRIBUTOR: Cyril Falvo, cyril.falvo@u-psud.fr +# REBO2 Brenner potential modified from CH.airebo +# Cite as D. W. Brenner, O. A. Shenderova, J. A. Harrison, S. J. Stuart, B. Ni, and S. B. Sinnott, +# "A second- generation reactive empirical bond order (rebo) potential energy expression for hydrocarbons.", +# J. Phys. Cond. Mat., 14:783, 2002. + +1.7 rcmin_CC +1.3 rcmin_CH +1.1 rcmin_HH +2.0 rcmax_CC +1.8 rcmax_CH +1.7 rcmax_HH +2.0 rcmaxp_CC +1.6 rcmaxp_CH +1.7 rcmaxp_HH +0.1 smin +2.0 Nmin +3.0 Nmax +3.2 NCmin +3.7 NCmax +0.3134602960833 Q_CC +0.340775728 Q_CH +0.370471487045 Q_HH +4.7465390606595 alpha_CC +4.10254983 alpha_CH +3.536298648 alpha_HH +10953.544162170 A_CC +149.94098723 A_CH +32.817355747 A_HH +12388.79197798 BIJc_CC1 +17.56740646509 BIJc_CC2 +30.71493208065 BIJc_CC3 +32.3551866587 BIJc_CH1 +0.0 BIJc_CH2 +0.0 BIJc_CH3 +29.632593 BIJc_HH1 +0.0 BIJc_HH2 +0.0 BIJc_HH3 +4.7204523127 Beta_CC1 +1.4332132499 Beta_CC2 +1.3826912506 Beta_CC3 +1.434458059249837 Beta_CH1 +0.0 Beta_CH2 +0.0 Beta_CH3 +1.71589217 Beta_HH1 +1.0 Beta_HH2 +1.0 Beta_HH3 +0.0 rho_CC +1.09 rho_CH +0.7415887 rho_HH +3.4 rcLJmin_CC +3.025 rcLJmin_CH +2.65 rcLJmin_HH +3.816370964 rcLJmax_CC +3.395447696 rcLJmax_CH +2.974524428 rcLJmax_HH +0.77 bLJmin_CC +0.75 bLJmin_CH +0.32 bLJmin_HH +0.81 bLJmax_CC +0.9 bLJmax_CH +0.42 bLJmax_HH +0.002843732471143 epsilon_CC +0.002064935027177 epsilon_CH +0.001499422575693 epsilon_HH +3.4 sigma_CC +3.025 sigma_CH +2.65 sigma_HH +0.3078851086 epsilonT_CCCC +0.1786600912 epsilonT_CCCH +0.1249753356 epsilonT_HCCH + +# gC1 and gC2 + +5 +-1.0 +-0.6666666667 +-0.5 +-0.3333333333 +1.0 + + 0.2816950000 + 1.0627430000 + 2.1363075000 + 2.5334145000 + 1.5544035000 + 0.3862485000 + 0.2827390000 + 1.0718770000 + 2.1681365000 + 2.5885710000 + 1.6019100000 + 0.4025160000 + 0.6900250000 + 5.4601600000 + 23.0108000000 + 54.9086400000 + 68.6124000000 + 34.7051520000 + 0.2718560918 + 0.4892740137 + -0.4328177539 + -0.5616817383 + 1.2708702246 + -0.0375008379 + + 0.2816950000 + 1.0627430000 + 2.1363075000 + 2.5334145000 + 1.5544035000 + 0.3862485000 + 0.2827390000 + 1.0718770000 + 2.1681365000 + 2.5885710000 + 1.6019100000 + 0.4025160000 + 0.6900250000 + 5.4601600000 + 23.0108000000 + 54.9086400000 + 68.6124000000 + 34.7051520000 + 0.3754514434 + 1.4072691309 + 2.2551320117 + 2.0288747461 + 1.4269207324 + 0.5063519355 + +# gH + +4 +-1.0 +-0.8333333333 +-0.5 +1.0 + + 270.4568000026 + 1549.6358000143 + 3781.7719000316 + 4582.1544000348 + 2721.4308000191 + 630.6336000042 + 16.9534406250 + -21.0823875000 + -102.4683000000 + -210.6432299999 + -229.8471299999 + -94.9946400000 + 19.0650249321 + 2.0177562840 + -2.5664219198 + 3.2913322346 + -2.6535615062 + 0.8376699753 + +# pCC + +4 +0.0 +4.0 +0.0 +4.0 + + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0986400000 + 0.0657600000 + 0.0000000000 + 0.0000000000 + 0.0657600000 + -0.0438400000 + -0.0025000000 + 0.0060000000 + -0.0045000000 + 0.0010000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2339100000 + -0.6402960000 + 0.4802220000 + -0.1067160000 + -0.1559400000 + 0.4268640000 + -0.3201480000 + 0.0711440000 + 0.4650000000 + -0.5985000000 + 0.2493750000 + -0.0332500000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.9074060000 + 2.4787080000 + -1.0327950000 + 0.1377060000 + 1.2716040000 + -1.6524720000 + 0.6885300000 + -0.0918040000 + -1.2900000000 + 1.1610000000 + -0.3386250000 + 0.0322500000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.8700000000 + -3.4830000000 + 1.0158750000 + -0.0967500000 + -2.5800000000 + 2.3220000000 + -0.6772500000 + 0.0645000000 + -0.1380150000 + 0.0000000000 + 0.5932650000 + -0.3955100000 + 0.3312360000 + 0.0000000000 + -1.5027480000 + 1.0018320000 + -0.2484270000 + 0.0000000000 + 1.1270610000 + -0.7513740000 + 0.0552060000 + 0.0000000000 + -0.2504580000 + 0.1669720000 + -0.3654800000 + 1.0205280000 + -0.7653960000 + 0.1700880000 + 1.0582800000 + -2.9471040000 + 2.2103280000 + -0.4911840000 + -0.7937100000 + 2.2103280000 + -1.6577460000 + 0.3683880000 + 0.1763800000 + -0.4911840000 + 0.3683880000 + -0.0818640000 + 0.6832080000 + -0.9109440000 + 0.3795600000 + -0.0506080000 + -2.0496240000 + 2.7328320000 + -1.1386800000 + 0.1518240000 + 1.5372180000 + -2.0496240000 + 0.8540100000 + -0.1138680000 + -0.3416040000 + 0.4554720000 + -0.1897800000 + 0.0253040000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.7452810000 + 0.0000000000 + -2.4934230000 + 1.6622820000 + -0.9937080000 + 0.0000000000 + 3.3245640000 + -2.2163760000 + 0.4140450000 + 0.0000000000 + -1.3852350000 + 0.9234900000 + -0.0552060000 + 0.0000000000 + 0.1846980000 + -0.1231320000 + 0.3434400000 + -1.0303200000 + 0.7727400000 + -0.1717200000 + -0.4579200000 + 1.3737600000 + -1.0303200000 + 0.2289600000 + 0.1908000000 + -0.5724000000 + 0.4293000000 + -0.0954000000 + -0.0254400000 + 0.0763200000 + -0.0572400000 + 0.0127200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + +# pCH + +4 +0.0 +4.0 +0.0 +4.0 + + 0.0000000000 + 0.0000000000 + 0.6280110000 + -0.4186740000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0300000000 + 0.0000000000 + -3.1001400000 + 2.0667600000 + -0.0200000000 + 0.0000000000 + 2.0667600000 + -1.3778400000 + -1.1595980000 + 3.2854440000 + -2.4640830000 + 0.5475740000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4966950000 + -3.6001800000 + 2.7001350000 + -0.6000300000 + -0.3311300000 + 2.4001200000 + -1.8000900000 + 0.4000200000 + -6.7698340000 + 8.6212080000 + -3.5921700000 + 0.4789560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 44.5208070000 + -58.1453640000 + 24.2272350000 + -3.2302980000 + -29.6805380000 + 38.7635760000 + -16.1514900000 + 2.1535320000 + 24.3142400000 + -21.8828160000 + 6.3824880000 + -0.6078560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -72.9427200000 + 65.6484480000 + -19.1474640000 + 1.8235680000 + 48.6284800000 + -43.7656320000 + 12.7649760000 + -1.2157120000 + -0.6502100000 + 0.0000000000 + -1.0558290000 + 0.7038860000 + 1.5845040000 + 0.0000000000 + 1.5611040000 + -1.0407360000 + -1.1883780000 + 0.0000000000 + -1.1708280000 + 0.7805520000 + 0.2640840000 + 0.0000000000 + 0.2601840000 + -0.1734560000 + 9.9867120000 + -26.3732760000 + 19.7799570000 + -4.3955460000 + -26.3537880000 + 68.3007840000 + -51.2255880000 + 11.3834640000 + 19.7653410000 + -51.2255880000 + 38.4191910000 + -8.5375980000 + -4.3922980000 + 11.3834640000 + -8.5375980000 + 1.8972440000 + -32.2817400000 + 43.0423200000 + -17.9343000000 + 2.3912400000 + 96.8452200000 + -129.1269600000 + 53.8029000000 + -7.1737200000 + -72.6339150000 + 96.8452200000 + -40.3521750000 + 5.3802900000 + 16.1408700000 + -21.5211600000 + 8.9671500000 + -1.1956200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -5.3172460000 + 0.0000000000 + 40.2945870000 + -26.8630580000 + 6.6795480000 + 0.0000000000 + -52.4957760000 + 34.9971840000 + -2.7831450000 + 0.0000000000 + 21.8732400000 + -14.5821600000 + 0.3710860000 + 0.0000000000 + -2.9164320000 + 1.9442880000 + -32.4571320000 + 97.3713960000 + -73.0285470000 + 16.2285660000 + 43.2761760000 + -129.8285280000 + 97.3713960000 + -21.6380880000 + -18.0317400000 + 54.0952200000 + -40.5714150000 + 9.0158700000 + 2.4042320000 + -7.2126960000 + 5.4095220000 + -1.2021160000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 24.6068000000 + 0.0000000000 + -73.8204000000 + 49.2136000000 + -22.1461200000 + 0.0000000000 + 66.4383600000 + -44.2922400000 + 6.4592850000 + 0.0000000000 + -19.3778550000 + 12.9185700000 + -0.6151700000 + 0.0000000000 + 1.8455100000 + -1.2303400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + +# piCC + +6 +0.0 +4.0 +0.0 +4.0 +0.0 +9.0 + + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1952414550000000 + -0.1301609700000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1301609700000000 + 0.0867739800000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1952414550000000 + -0.1301609700000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2460512699999999 + -0.1640341799999999 + 0.0000000000000000 + 0.0000000000000000 + -0.1640341799999999 + 0.1093561200000001 + 0.0000000000000000 + 0.0000000000000000 + -0.1301609700000000 + 0.0867739800000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1640341799999999 + 0.1093561200000001 + 0.0000000000000000 + 0.0000000000000000 + 0.1093561200000001 + -0.0729040800000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1859428215000000 + 0.6024559355999999 + -0.4518419517000000 + 0.1004093226000000 + 0.1239618810000000 + -0.4016372904000000 + 0.3012279677999999 + -0.0669395484000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1859428215000000 + 0.6024559355999999 + -0.4518419517000000 + 0.1004093226000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3234498210000000 + 0.9186318863999997 + -0.6208630397999997 + 0.1076980643999998 + 0.2156332139999999 + -0.6124212575999999 + 0.4139086932000001 + -0.0717987096000001 + 0.1239618810000000 + -0.4016372904000000 + 0.3012279677999999 + -0.0669395484000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2156332139999999 + -0.6124212575999999 + 0.4139086932000001 + -0.0717987096000001 + -0.1437554760000001 + 0.4082808384000002 + -0.2759391288000001 + 0.0478658064000000 + 0.1388410212000000 + -0.1785098844000000 + 0.0743791185000000 + -0.0099172158000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4016472399000000 + 0.5355296532000000 + -0.2231373555000000 + 0.0297516474000000 + 0.2677648266000000 + -0.3570197688000000 + 0.1487582370000000 + -0.0198344316000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4016472399000000 + 0.5355296532000000 + -0.2231373555000000 + 0.0297516474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 4.5450778986000007 + -5.3987902596000001 + 2.0451633165000001 + -0.2545255422000000 + -3.0300519324000001 + 3.5991935063999998 + -1.3634422110000000 + 0.1696836948000000 + 0.2677648266000000 + -0.3570197688000000 + 0.1487582370000000 + -0.0198344316000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0300519324000001 + 3.5991935063999998 + -1.3634422110000000 + 0.1696836948000000 + 2.0200346216000002 + -2.3994623376000002 + 0.9089614740000000 + -0.1131224632000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1170126711000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0520056316000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1170126711000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0520056316000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1170126711000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0520056316000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1170126711000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0520056316000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1170126711000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0520056316000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1170126711000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0780084474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0520056316000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1101605377500000 + -0.0734403585000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1081921266000000 + 0.0721280844000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0811440949500000 + -0.0540960633000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0180320211000000 + 0.0120213474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.5308662927499996 + 1.0205775285000001 + 0.0000000000000000 + 0.0000000000000000 + 4.2922496105999990 + -2.8614997404000002 + 0.0000000000000000 + 0.0000000000000000 + -3.1601247079499992 + 2.1067498053000002 + 0.0000000000000000 + 0.0000000000000000 + 0.6759999350999999 + -0.4506666234000001 + 0.0000000000000000 + 0.0000000000000000 + 1.0205775285000001 + -0.6803850190000000 + 0.0000000000000000 + 0.0000000000000000 + -2.8614997404000002 + 1.9076664936000003 + 0.0000000000000000 + 0.0000000000000000 + 2.1067498053000002 + -1.4044998702000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4506666234000001 + 0.3004444156000000 + -0.3953362375000001 + 1.0369354002000000 + -0.7777015501500000 + 0.1728225667000000 + 0.8000527127999999 + -2.0066802120000000 + 1.5050101590000000 + -0.3344467020000000 + -0.6000395345999999 + 1.5050101590000000 + -1.1287576192500000 + 0.2508350265000000 + 0.1333421188000000 + -0.3344467020000000 + 0.2508350265000000 + -0.0557411170000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.3103306184999992 + -9.0968349185999990 + 6.7318116889499997 + -1.4555961530999999 + -8.5868161127999993 + 23.8242035591999937 + -17.5957091693999956 + 3.7890715931999996 + 6.3613620845999996 + -17.6319026693999987 + 13.0195943770499980 + -2.8024286948999997 + -1.3786360187999998 + 3.8132005931999995 + -2.8144931948999998 + 0.6052619321999999 + -2.2068870789999999 + 6.0645566123999997 + -4.4878744592999995 + 0.9703974353999998 + 5.7245440751999999 + -15.8828023728000005 + 11.7304727795999995 + -2.5260477287999996 + -4.2409080563999995 + 11.7546017795999980 + -8.6797295846999987 + 1.8682857965999997 + 0.9190906791999999 + -2.5421337287999997 + 1.8763287965999997 + -0.4035079547999999 + 1.4805008319000001 + -1.9673896319999999 + 0.8197456799999999 + -0.1092994240000000 + -3.5413013375999998 + 4.7217351167999997 + -1.9673896319999997 + 0.2623186176000000 + 2.6559760031999997 + -3.5413013375999993 + 1.4755422239999998 + -0.1967389632000000 + -0.5902168896000000 + 0.7869558527999999 + -0.3278982720000000 + 0.0437197696000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -19.2295206957000033 + 24.4584372960000032 + -9.9185720400000008 + 1.2982590720000002 + 48.8229586128000079 + -61.7340105504000007 + 24.9051738960000009 + -3.2480382528000007 + -36.6172189596000024 + 46.3005079128000006 + -18.6788804219999989 + 2.4360286896000005 + 8.1371597688000001 + -10.2890017584000013 + 4.1508623160000004 + -0.5413397088000000 + 12.8196804638000010 + -16.3056248640000021 + 6.6123813600000005 + -0.8655060480000000 + -32.5486390752000005 + 41.1560070336000052 + -16.6034492640000018 + 2.1653588352000002 + 24.4114793064000004 + -30.8670052752000004 + 12.4525869480000004 + -1.6240191264000001 + -5.4247731792000007 + 6.8593345056000006 + -2.7672415440000000 + 0.3608931392000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.2914572557999993 + -3.1368362039999997 + 0.9712843094999998 + -0.0996618390000000 + -7.9931075507999978 + 7.5284068895999994 + -2.3310823427999994 + 0.2391884136000000 + 5.9948306630999983 + -5.6463051671999986 + 1.7483117570999998 + -0.1793913102000000 + -1.3321845917999997 + 1.2547344815999997 + -0.3885137237999999 + 0.0398647356000000 + -2.1943048371999994 + 2.0912241359999992 + -0.6475228729999998 + 0.0664412260000000 + 5.3287383671999988 + -5.0189379263999987 + 1.5540548951999997 + -0.1594589424000000 + -3.9965537753999993 + 3.7642034447999992 + -1.1655411713999997 + 0.1195942068000000 + 0.8881230611999998 + -0.8364896543999999 + 0.2590091492000000 + -0.0265764904000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 51.2174335277999973 + -34.7252003400000007 + 7.7793458265000002 + -0.5762478390000000 + -125.8865034036000026 + 85.2980168160000147 + -19.1108755836000022 + 1.4156204136000001 + 98.0036935526999997 + -66.4204326120000133 + 14.8837136877000020 + -1.1024973102000000 + -23.3736279005999990 + 15.8476161360000010 + -3.5521839306000000 + 0.2631247356000000 + -34.1449556852000029 + 23.1501335600000040 + -5.1862305510000013 + 0.3841652260000000 + 83.9243356024000065 + -56.8653445440000098 + 12.7405837224000020 + -0.9437469424000001 + -65.3357957018000093 + 44.2802884080000041 + -9.9224757918000019 + 0.7349982068000001 + 15.5824186004000005 + -10.5650774240000018 + 2.3681226204000003 + -0.1754164904000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 18.8699219402999923 + -9.8715457799999946 + 1.7195853929999991 + -0.0996618419999999 + -45.3977355935999753 + 23.6917098719999899 + -4.1270049431999976 + 0.2391884207999999 + 34.0686926951999851 + -17.7687824039999924 + 3.0952537073999986 + -0.1793913155999999 + -7.5798832655999968 + 3.9486183119999980 + -0.6878341571999995 + 0.0398647368000000 + -12.5799479601999984 + 6.5810305199999988 + -1.1463902619999997 + 0.0664412280000000 + 30.2651570623999930 + -15.7944732479999974 + 2.7513366287999990 + -0.1594589472000000 + -22.7124617967999924 + 11.8458549359999967 + -2.0635024715999997 + 0.1195942104000000 + 5.0532555103999988 + -2.6324122079999994 + 0.4585561047999999 + -0.0265764912000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0187635363000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1549554239999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1366075680000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0394199040000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0125090242000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1033036160000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0910717120000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0262799360000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0187635363000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1549554239999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1366075680000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0394199040000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0125090242000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1033036160000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0910717120000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0262799360000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0187635363000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1549554239999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1366075680000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0394199040000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0125090242000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1033036160000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0910717120000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0262799360000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.0321606498499998 + 4.6881070998999999 + 0.0000000000000000 + 0.0000000000000000 + 9.1366163297999989 + -6.0910775531999999 + 0.0000000000000000 + 0.0000000000000000 + -3.8069234707500001 + 2.5379489805000000 + 0.0000000000000000 + 0.0000000000000000 + 0.5075897961000000 + -0.3383931974000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 24.1765592188500023 + -16.1177061459000015 + 0.0000000000000000 + 0.0000000000000000 + -30.8078686818000023 + 20.5385791212000015 + 0.0000000000000000 + 0.0000000000000000 + 12.6594244507500004 + -8.4396163005000009 + 0.0000000000000000 + 0.0000000000000000 + -1.6721732601000001 + 1.1147821734000001 + 0.0000000000000000 + 0.0000000000000000 + -16.1177061459000015 + 10.7451374305999998 + 0.0000000000000000 + 0.0000000000000000 + 20.5385791212000015 + -13.6923860807999986 + 0.0000000000000000 + 0.0000000000000000 + -8.4396163005000009 + 5.6264108669999997 + 0.0000000000000000 + 0.0000000000000000 + 1.1147821734000001 + -0.7431881155999999 + 1.7964189073000001 + -9.9371338973999990 + 7.4528504230499992 + -1.6561889829000001 + -2.4750911663999995 + 13.2495118631999986 + -9.9371338973999990 + 2.2082519771999998 + 1.0312879859999999 + -5.5206299429999994 + 4.1404724572499996 + -0.9201049905000001 + -0.1375050648000000 + 0.7360839924000000 + -0.5520629942999999 + 0.1226806654000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -44.4148786822999924 + 125.9369562125999806 + -94.4527171594499890 + 20.9894927020999980 + 57.1409193383999963 + -161.7845013575999928 + 121.3383760181999946 + -26.9640835595999988 + -23.5724663909999990 + 66.7014588990000021 + -50.0260941742499909 + 11.1169098164999998 + 3.1219955187999995 + -8.8305278531999996 + 6.6228958898999997 + -1.4717546421999999 + 30.4859639041999984 + -86.0604782867999916 + 64.5453587151000079 + -14.3434130477999986 + -39.2202895175999942 + 110.5595581391999929 + -82.9196686044000018 + 18.4265930231999988 + 16.1842872989999975 + -45.5939825580000004 + 34.1954869185000021 + -7.5989970929999995 + -2.1439049731999997 + 6.0371976743999998 + -4.5278982558000003 + 1.0061996123999999 + 41.0697356006999996 + -54.7530359903999937 + 22.8137649960000033 + -3.0418353327999998 + -52.4181452760000042 + 69.8908603680000056 + -29.1211918200000000 + 3.8828255760000001 + 21.8408938650000017 + -29.1211918200000000 + 12.1338299250000006 + -1.6178439899999999 + -2.9121191820000001 + 3.8828255760000001 + -1.6178439899999999 + 0.2157125320000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -58.7754249068999997 + 72.4365406656000062 + -30.1818919440000002 + 4.0242522591999998 + 71.7688591056000007 + -88.1435659967999925 + 36.7264858320000016 + -4.8968647776000003 + -29.9036912940000015 + 36.7264858320000016 + -15.3027024300000001 + 2.0403603240000003 + 3.9871588392000001 + -4.8968647776000003 + 2.0403603240000003 + -0.2720480432000001 + 34.4529747782000015 + -41.9835046752000025 + 17.4931269480000005 + -2.3324169264000001 + -41.7636522936000034 + 50.6527056287999997 + -21.1052940120000017 + 2.8140392016000000 + 17.4015217890000002 + -21.1052940120000017 + 8.7938725049999995 + -1.1725163339999998 + -2.3202029051999999 + 2.8140392016000000 + -1.1725163339999998 + 0.1563355111999999 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -22.5910445969999856 + 16.9389155015999862 + -5.2449352712999966 + 0.5381739305999996 + 29.8518848603999807 + -22.5852206687999839 + 6.9932470283999955 + -0.7175652407999995 + -12.4382853584999911 + 9.4105086119999921 + -2.9138529284999981 + 0.2989855169999998 + 1.6584380477999987 + -1.2547344815999988 + 0.3885137237999997 + -0.0398647356000000 + 15.0606963979999851 + -11.2926103343999884 + 3.4966235141999964 + -0.3587826203999996 + -19.9012565735999800 + 15.0568137791999828 + -4.6621646855999952 + 0.4783768271999995 + 8.2921902389999929 + -6.2736724079999924 + 1.9425686189999980 + -0.1993236779999998 + -1.1056253651999990 + 0.8364896543999990 + -0.2590091491999997 + 0.0265764904000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 132.0402867341999809 + -94.3691021639999832 + 21.4156989368999930 + -1.5863480693999996 + -133.2574315811999668 + 96.4624295519999748 + -21.9475812491999918 + 1.6257467591999992 + 44.7574818254999798 + -32.8519189799999864 + 7.4931545204999956 + -0.5550484829999996 + -5.0106466433999977 + 3.7277438639999976 + -0.8522720693999993 + 0.0631312643999999 + -88.0268578227999967 + 62.9127347760000006 + -14.2771326246000001 + 1.0575653796000002 + 88.8382877207999968 + -64.3082863680000116 + 14.6317208328000028 + -1.0838311728000001 + -29.8383212170000043 + 21.9012793200000040 + -4.9954363470000018 + 0.3700323220000001 + 3.3404310956000010 + -2.4851625760000013 + 0.5681813796000004 + -0.0420875096000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -104.3657106932998886 + 53.3063472119999489 + -9.2857611221999896 + 0.5381739467999993 + 139.1294649887998673 + -71.0751296159999271 + 12.3810148295999856 + -0.7175652623999991 + -58.0317834119999389 + 29.6146373399999696 + -5.1587561789999938 + 0.2989855259999996 + 7.7430087215999910 + -3.9486183119999954 + 0.6878341571999992 + -0.0398647367999999 + 69.5771404621999920 + -35.5375648079999991 + 6.1905074148000008 + -0.3587826312000001 + -92.7529766592000016 + 47.3834197440000082 + -8.2540098864000022 + 0.4783768416000003 + 38.6878556080000138 + -19.7430915600000105 + 3.4391707860000027 + -0.1993236840000002 + -5.1620058144000041 + 2.6324122080000025 + -0.4585561048000005 + 0.0265764912000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5694553116999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.4011244799999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.4783081999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2025453600000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.7129702077999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.2674163199999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9855388000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1350302400000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5694553116999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.4011244799999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.4783081999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2025453600000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.7129702077999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.2674163199999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9855388000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1350302400000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5694553116999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.4011244799999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.4783081999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2025453600000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.7129702077999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.2674163199999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9855388000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1350302400000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1796984025000000 + 0.1197989350000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.5390952075000000 + -0.3593968050000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3593968050000000 + 0.2395978700000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0598994675000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.7523780425000002 + -15.7744311360000005 + 11.8308233519999995 + -2.6290718559999999 + -6.7580597519999994 + 16.2193434048000000 + -12.1645075536000000 + 2.7032239007999999 + 1.9711007609999998 + -4.7306418263999994 + 3.5479813698000000 + -0.7884403043999999 + -0.1877238820000000 + 0.4505373168000000 + -0.3379029876000000 + 0.0750895528000000 + -7.0045704549999996 + 16.5234516479999982 + -12.3925887360000004 + 2.7539086080000001 + 6.7580597519999994 + -16.2193434048000000 + 12.1645075536000000 + -2.7032239007999999 + -1.9711007609999998 + 4.7306418263999994 + -3.5479813698000000 + 0.7884403043999999 + 0.1877238820000000 + -0.4505373168000000 + 0.3379029876000000 + -0.0750895528000000 + 1.7561266437000007 + -2.3348907144000020 + 0.9728711310000014 + -0.1297161508000003 + -0.0000000000000012 + 0.0000000000000029 + -0.0000000000000020 + 0.0000000000000004 + 0.0000000000000005 + -0.0000000000000012 + 0.0000000000000008 + -0.0000000000000002 + -0.0000000000000001 + 0.0000000000000002 + -0.0000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -46.0039935710999970 + 61.0691501591999995 + -25.4454792330000004 + 3.3927305643999999 + 36.4935226607999965 + -48.6580302144000001 + 20.2741792560000000 + -2.7032239007999999 + -10.6439441093999996 + 14.1919254792000000 + -5.9133022830000002 + 0.7884403043999999 + 1.0137089628000000 + -1.3516119503999999 + 0.5631716460000000 + -0.0750895528000000 + 44.1854485514000146 + -58.7342594448000099 + 24.4726081020000059 + -3.2630144136000014 + -36.4935226608000107 + 48.6580302144000143 + -20.2741792560000071 + 2.7032239008000012 + 10.6439441094000031 + -14.1919254792000071 + 5.9133022830000037 + -0.7884403044000006 + -1.0137089628000004 + 1.3516119504000006 + -0.5631716460000002 + 0.0750895528000001 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1101605377500000 + -0.0734403585000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.5308662927499996 + 1.0205775285000001 + 0.0000000000000000 + 0.0000000000000000 + 1.0205775285000001 + -0.6803850190000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1081921266000000 + 0.0721280844000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 4.2922496105999990 + -2.8614997404000002 + 0.0000000000000000 + 0.0000000000000000 + -2.8614997404000002 + 1.9076664936000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0811440949500000 + -0.0540960633000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.1601247079499992 + 2.1067498053000002 + 0.0000000000000000 + 0.0000000000000000 + 2.1067498053000002 + -1.4044998702000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0180320211000000 + 0.0120213474000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6759999350999999 + -0.4506666234000001 + 0.0000000000000000 + 0.0000000000000000 + -0.4506666234000001 + 0.3004444156000000 + -0.3953362375000001 + 1.0369354002000000 + -0.7777015501500000 + 0.1728225667000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.3103306184999992 + -9.0968349185999990 + 6.7318116889499997 + -1.4555961531000001 + -2.2068870789999999 + 6.0645566123999997 + -4.4878744593000004 + 0.9703974354000000 + 0.8000527127999999 + -2.0066802120000000 + 1.5050101590000000 + -0.3344467020000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.5868161127999993 + 23.8242035591999972 + -17.5957091693999992 + 3.7890715932000001 + 5.7245440751999999 + -15.8828023728000005 + 11.7304727795999995 + -2.5260477288000001 + -0.6000395345999999 + 1.5050101590000000 + -1.1287576192500000 + 0.2508350265000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.3613620845999996 + -17.6319026693999987 + 13.0195943770500016 + -2.8024286949000006 + -4.2409080564000003 + 11.7546017796000015 + -8.6797295847000004 + 1.8682857965999999 + 0.1333421188000000 + -0.3344467020000000 + 0.2508350265000000 + -0.0557411170000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.3786360188000000 + 3.8132005932000004 + -2.8144931949000003 + 0.6052619322000001 + 0.9190906792000001 + -2.5421337288000001 + 1.8763287966000000 + -0.4035079547999999 + 1.4805008319000001 + -1.9673896319999999 + 0.8197456799999999 + -0.1092994240000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -19.2295206957000033 + 24.4584372960000032 + -9.9185720400000008 + 1.2982590720000002 + 12.8196804638000010 + -16.3056248640000021 + 6.6123813600000005 + -0.8655060480000000 + -3.5413013375999998 + 4.7217351167999997 + -1.9673896319999997 + 0.2623186176000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 48.8229586128000079 + -61.7340105504000007 + 24.9051738960000009 + -3.2480382528000007 + -32.5486390752000005 + 41.1560070336000052 + -16.6034492640000018 + 2.1653588352000002 + 2.6559760031999997 + -3.5413013375999993 + 1.4755422239999998 + -0.1967389632000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -36.6172189596000024 + 46.3005079128000006 + -18.6788804219999989 + 2.4360286896000005 + 24.4114793064000004 + -30.8670052752000004 + 12.4525869480000004 + -1.6240191264000001 + -0.5902168896000000 + 0.7869558527999999 + -0.3278982720000000 + 0.0437197696000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 8.1371597688000001 + -10.2890017584000013 + 4.1508623160000004 + -0.5413397088000000 + -5.4247731792000007 + 6.8593345056000006 + -2.7672415440000000 + 0.3608931392000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.2914572557999993 + -3.1368362039999997 + 0.9712843094999998 + -0.0996618390000000 + -2.1943048371999994 + 2.0912241359999992 + -0.6475228729999998 + 0.0664412260000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.9931075507999978 + 7.5284068895999994 + -2.3310823427999994 + 0.2391884136000000 + 5.3287383671999988 + -5.0189379263999987 + 1.5540548951999997 + -0.1594589424000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.9948306630999983 + -5.6463051671999986 + 1.7483117570999998 + -0.1793913102000000 + -3.9965537753999993 + 3.7642034447999992 + -1.1655411713999997 + 0.1195942068000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.3321845917999997 + 1.2547344815999997 + -0.3885137237999999 + 0.0398647356000000 + 0.8881230611999998 + -0.8364896543999999 + 0.2590091492000000 + -0.0265764904000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 51.2174335277999973 + -34.7252003400000007 + 7.7793458265000002 + -0.5762478390000000 + -34.1449556852000029 + 23.1501335600000040 + -5.1862305510000013 + 0.3841652260000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -125.8865034036000026 + 85.2980168160000147 + -19.1108755836000022 + 1.4156204136000001 + 83.9243356024000065 + -56.8653445440000098 + 12.7405837224000020 + -0.9437469424000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 98.0036935526999997 + -66.4204326120000133 + 14.8837136877000020 + -1.1024973102000000 + -65.3357957018000093 + 44.2802884080000041 + -9.9224757918000019 + 0.7349982068000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -23.3736279005999990 + 15.8476161360000010 + -3.5521839306000000 + 0.2631247356000000 + 15.5824186004000005 + -10.5650774240000018 + 2.3681226204000003 + -0.1754164904000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 18.8699219402999923 + -9.8715457799999946 + 1.7195853929999991 + -0.0996618419999999 + -12.5799479601999984 + 6.5810305199999988 + -1.1463902619999997 + 0.0664412280000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -45.3977355935999753 + 23.6917098719999899 + -4.1270049431999976 + 0.2391884207999999 + 30.2651570623999930 + -15.7944732479999974 + 2.7513366287999990 + -0.1594589472000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 34.0686926951999851 + -17.7687824039999924 + 3.0952537073999986 + -0.1793913155999999 + -22.7124617967999924 + 11.8458549359999967 + -2.0635024715999997 + 0.1195942104000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5798832655999968 + 3.9486183119999980 + -0.6878341571999995 + 0.0398647368000000 + 5.0532555103999988 + -2.6324122079999994 + 0.4585561047999999 + -0.0265764912000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0187635363000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0125090242000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1549554239999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1033036160000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1366075680000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0910717120000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0394199040000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0262799360000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0187635363000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0125090242000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1549554239999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1033036160000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1366075680000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0910717120000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0394199040000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0262799360000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0187635363000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0125090242000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1549554239999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1033036160000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1366075680000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0910717120000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0394199040000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0262799360000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 4.2228846869999987 + -2.8152564579999999 + 0.0000000000000000 + 0.0000000000000000 + -11.0322309923999988 + 7.3548206615999998 + 0.0000000000000000 + 0.0000000000000000 + 8.1954232442999988 + -5.4636154962000010 + 0.0000000000000000 + 0.0000000000000000 + -1.7862051654000000 + 1.1908034436000001 + 0.0000000000000000 + 0.0000000000000000 + -11.0322309923999988 + 7.3548206615999998 + 0.0000000000000000 + 0.0000000000000000 + 29.4624929663999993 + -19.6416619776000019 + 0.0000000000000000 + 0.0000000000000000 + -21.8606197247999994 + 14.5737464832000008 + 0.0000000000000000 + 0.0000000000000000 + 4.7529154943999998 + -3.1686103296000003 + 0.0000000000000000 + 0.0000000000000000 + 8.1954232442999988 + -5.4636154962000010 + 0.0000000000000000 + 0.0000000000000000 + -21.8606197247999994 + 14.5737464832000008 + 0.0000000000000000 + 0.0000000000000000 + 16.2182772935999999 + -10.8121848624000023 + 0.0000000000000000 + 0.0000000000000000 + -3.5253116208000002 + 2.3502077472000003 + 0.0000000000000000 + 0.0000000000000000 + -1.7862051654000000 + 1.1908034436000001 + 0.0000000000000000 + 0.0000000000000000 + 4.7529154943999998 + -3.1686103296000003 + 0.0000000000000000 + 0.0000000000000000 + -3.5253116208000002 + 2.3502077472000003 + 0.0000000000000000 + 0.0000000000000000 + 0.7659025824000001 + -0.5106017216000001 + -6.4539249160000001 + 18.7708587479999949 + -13.9570580609999997 + 3.0477524580000002 + 17.1048773232000002 + -49.5868839695999952 + 36.8269049772000017 + -8.0223086616000003 + -12.7236579923999980 + 36.8751629771999987 + -27.3839287329000030 + 5.9642314962000009 + 2.7808128872000002 + -8.0544806615999995 + 5.9803174962000005 + -1.3020514436000004 + 17.1048773232000002 + -49.5868839695999952 + 36.8269049772000017 + -8.0223086616000003 + -45.7490319551999889 + 132.4958518656000024 + -98.2821148992000104 + 21.3561259776000014 + 33.9967739664000064 + -98.4268888992000086 + 73.0028361744000023 + -15.8595944832000022 + -7.4148386592000008 + 21.4526419776000026 + -15.9078524832000010 + 3.4543543296000006 + -12.7236579923999997 + 36.8751629771999987 + -27.3839287329000030 + 5.9642314962000009 + 33.9967739663999993 + -98.4268888992000086 + 73.0028361744000165 + -15.8595944832000004 + -25.2613304747999976 + 73.1114166744000045 + -54.2205646307999984 + 11.7765708624000016 + 5.5086289944000004 + -15.9319814832000013 + 11.8127643624000012 + -2.5645157472000006 + 2.7808128872000002 + -8.0544806615999995 + 5.9803174962000005 + -1.3020514436000004 + -7.4148386592000008 + 21.4526419776000026 + -15.9078524832000010 + 3.4543543296000006 + 5.5086289944000004 + -15.9319814832000013 + 11.8127643624000012 + -2.5645157472000006 + -1.2008064432000003 + 3.4704403296000006 + -2.5725587472000004 + 0.5582257216000001 + 39.8894121000000013 + -50.7093326999999903 + 20.7656306250000000 + -2.7364611499999998 + -107.5650035999999830 + 136.5474131999999940 + -55.8049815000000038 + 7.3437953999999994 + 80.6737526999999801 + -102.4105598999999955 + 41.8537361250000046 + -5.5078465500000000 + -17.9275005999999983 + 22.7579021999999966 + -9.3008302500000006 + 1.2239659000000001 + -107.5650035999999972 + 136.5474131999999940 + -55.8049815000000038 + 7.3437953999999994 + 288.7152523199999905 + -365.7688358399999515 + 149.1343596000000105 + -19.5939748799999975 + -216.5364392399999645 + 274.3266268799999921 + -111.8507697000000007 + 14.6954811599999999 + 48.1192087200000032 + -60.9614726399999967 + 24.8557266000000006 + -3.2656624800000000 + 80.6737526999999943 + -102.4105598999999955 + 41.8537361250000046 + -5.5078465500000000 + -216.5364392400000213 + 274.3266268799999921 + -111.8507697000000007 + 14.6954811599999999 + 162.4023294299999804 + -205.7449701599999798 + 83.8880772750000006 + -11.0216108699999999 + -36.0894065399999988 + 45.7211044800000010 + -18.6417949500000013 + 2.4492468600000001 + -17.9275005999999983 + 22.7579021999999966 + -9.3008302500000006 + 1.2239659000000001 + 48.1192087200000032 + -60.9614726399999967 + 24.8557266000000006 + -3.2656624800000000 + -36.0894065399999988 + 45.7211044800000010 + -18.6417949500000013 + 2.4492468600000001 + 8.0198681199999999 + -10.1602454400000006 + 4.1426211000000004 + -0.5442770800000001 + -11.9141455994999941 + 11.5908520439999947 + -3.4999733044999992 + 0.3484810289999999 + 31.2390159023999878 + -30.3275138687999863 + 9.1769633783999964 + -0.9160839407999998 + -23.4292619267999918 + 22.7456354015999942 + -6.8827225337999982 + 0.6870629555999997 + 5.2065026503999983 + -5.0545856447999986 + 1.5294938963999996 + -0.1526806568000000 + 31.2390159023999843 + -30.3275138687999899 + 9.1769633783999964 + -0.9160839407999998 + -81.3681242063999548 + 78.8087587967999639 + -23.8895779823999916 + 2.3899521887999993 + 61.0260931547999803 + -59.1065690975999729 + 17.9171834867999920 + -1.7924641415999993 + -13.5613540343999954 + 13.1347931327999969 + -3.9815963303999986 + 0.3983253647999999 + -23.4292619267999882 + 22.7456354015999906 + -6.8827225337999982 + 0.6870629555999997 + 61.0260931547999803 + -59.1065690975999729 + 17.9171834867999955 + -1.7924641415999993 + -45.7695698660999852 + 44.3299268231999832 + -13.4378876150999957 + 1.3443481061999996 + 10.1710155257999979 + -9.8510948495999990 + 2.9861972477999990 + -0.2987440236000000 + 5.2065026503999983 + -5.0545856447999986 + 1.5294938963999996 + -0.1526806568000000 + -13.5613540343999954 + 13.1347931327999969 + -3.9815963303999986 + 0.3983253647999999 + 10.1710155257999979 + -9.8510948495999990 + 2.9861972477999990 + -0.2987440236000000 + -2.2602256723999994 + 2.1891321887999995 + -0.6635993883999999 + 0.0663875608000000 + -135.7455229915000245 + 92.5172767399999998 + -20.7448023915000022 + 1.5366520290000003 + 370.6031730607999748 + -252.4316724479999721 + 56.5982632008000053 + -4.1924639408000006 + -282.7374677955999687 + 192.5863143359999867 + -43.1827734005999986 + 3.1987239556000002 + 64.9572541768000065 + -44.2469854080000005 + 9.9224278667999997 + -0.7349946568000001 + 370.6031730607999748 + -252.4316724480000289 + 56.5982632008000053 + -4.1924639408000006 + -1001.6410292688001391 + 681.9045713280002019 + -152.8863145488000157 + 11.3249121888000026 + 765.5860359516002518 + -521.2161084960000608 + 116.8669639116000099 + -8.6568121415999997 + -176.5103475448000268 + 120.1758818880000064 + -26.9492044248000013 + 1.9962373648000000 + -282.7374677955999687 + 192.5863143359999867 + -43.1827734005999986 + 3.1987239556000002 + 765.5860359516000244 + -521.2161084960000608 + 116.8669639116000099 + -8.6568121415999997 + -584.9559749637001005 + 398.2528413720000344 + -89.3018939337000006 + 6.6149551062000000 + 134.7753046586000210 + -91.7631914159999980 + 20.5789413186000019 + -1.5243660235999998 + 64.9572541768000065 + -44.2469854080000005 + 9.9224278667999997 + -0.7349946568000001 + -176.5103475448000268 + 120.1758818880000064 + -26.9492044248000013 + 1.9962373648000000 + 134.7753046586000210 + -91.7631914159999980 + 20.5789413186000019 + -1.5243660235999998 + -31.0134205908000027 + 21.1168336479999965 + -4.7362260707999999 + 0.3508315608000000 + -49.4848264664999746 + 26.2405983299999868 + -4.5854146104999991 + 0.2657560369999998 + 133.8931721307999396 + -70.8746726159999696 + 12.3806633795999943 + -0.7175439623999997 + -100.4470670980999500 + 53.1560044619999772 + -9.2854975346999957 + 0.5381579717999998 + 22.3336540217999939 + -11.8124454359999937 + 2.0634438965999995 + -0.1195906604000000 + 133.8931721307999396 + -70.8746726159999696 + 12.3806633795999943 + -0.7175439623999997 + -357.7270527887998810 + 189.0525821759999303 + -33.0151960655999872 + 1.9134562463999991 + 268.3768535915999109 + -141.7894366319999335 + 24.7613970491999922 + -1.4350921847999993 + -59.6755514647999803 + 31.5087636959999884 + -5.5025326775999988 + 0.3189093743999999 + -100.4470670980999643 + 53.1560044619999914 + -9.2854975346999957 + 0.5381579717999998 + 268.3768535915999109 + -141.7894366319999335 + 24.7613970491999922 + -1.4350921847999993 + -201.3438131936999298 + 106.3420774739999501 + -18.5710477868999924 + 1.0763191385999997 + 44.7702575985999829 + -23.6315727719999913 + 4.1268995081999993 + -0.2391820307999999 + 22.3336540217999939 + -11.8124454359999937 + 2.0634438965999995 + -0.1195906604000000 + -59.6755514647999803 + 31.5087636959999884 + -5.5025326775999988 + 0.3189093743999999 + 44.7702575985999829 + -23.6315727719999913 + 4.1268995081999993 + -0.2391820307999999 + -9.9549879107999981 + 5.2514606159999992 + -0.9170887795999998 + 0.0531515624000000 + 0.7858877775000047 + -0.0838432500000021 + 0.0001730625000003 + -0.0000088750000000 + -1.8374687780000103 + 0.2012238000000045 + -0.0004153500000007 + 0.0000213000000000 + 1.3509135835000063 + -0.1509178500000028 + 0.0003115125000004 + -0.0000159750000000 + -0.2881194630000009 + 0.0335373000000004 + -0.0000692250000000 + 0.0000035500000000 + -1.8374687780000101 + 0.2012238000000045 + -0.0004153500000007 + 0.0000213000000000 + 4.2207095280000200 + -0.4829371200000090 + 0.0009968400000013 + -0.0000511200000001 + -3.0839681460000103 + 0.3622028400000043 + -0.0007476300000006 + 0.0000383400000000 + 0.6490755880000003 + -0.0804895199999999 + 0.0001661399999999 + -0.0000085200000000 + 1.3509135835000063 + -0.1509178500000028 + 0.0003115125000004 + -0.0000159750000000 + -3.0839681460000108 + 0.3622028400000043 + -0.0007476300000006 + 0.0000383400000000 + 2.2518031095000022 + -0.2716521300000003 + 0.0005607224999999 + -0.0000287550000000 + -0.4732126909999979 + 0.0603671399999987 + -0.0001246049999998 + 0.0000063900000000 + -0.2881194630000009 + 0.0335373000000004 + -0.0000692250000000 + 0.0000035500000000 + 0.6490755880000003 + -0.0804895199999999 + 0.0001661399999999 + -0.0000085200000000 + -0.4732126909999979 + 0.0603671399999987 + -0.0001246049999998 + 0.0000063900000000 + 0.0991165979999985 + -0.0134149199999992 + 0.0000276899999999 + -0.0000014200000000 + 0.7871924025000062 + -0.0842160000000026 + 0.0001996875000003 + -0.0000088750000000 + -1.8405998780000177 + 0.2021184000000074 + -0.0004792500000010 + 0.0000213000000000 + 1.3532619085000168 + -0.1515888000000072 + 0.0003594375000010 + -0.0000159750000000 + -0.2886413130000054 + 0.0336864000000023 + -0.0000798750000003 + 0.0000035500000000 + -1.8405998780000132 + 0.2021184000000054 + -0.0004792500000007 + 0.0000213000000000 + 4.2282241680000388 + -0.4850841600000161 + 0.0011502000000022 + -0.0000511200000001 + -3.0896041260000380 + 0.3638131200000160 + -0.0008626500000022 + 0.0000383400000001 + 0.6503280280000123 + -0.0808473600000053 + 0.0001917000000008 + -0.0000085200000000 + 1.3532619085000075 + -0.1515888000000030 + 0.0003594375000004 + -0.0000159750000000 + -3.0896041260000238 + 0.3638131200000099 + -0.0008626500000014 + 0.0000383400000001 + 2.2560300945000247 + -0.2728598400000106 + 0.0006469875000015 + -0.0000287550000001 + -0.4741520210000086 + 0.0606355200000037 + -0.0001437750000005 + 0.0000063900000000 + -0.2886413130000007 + 0.0336864000000003 + -0.0000798750000000 + 0.0000035500000000 + 0.6503280280000028 + -0.0808473600000012 + 0.0001917000000002 + -0.0000085200000000 + -0.4741520210000038 + 0.0606355200000017 + -0.0001437750000003 + 0.0000063900000000 + 0.0993253380000016 + -0.0134745600000007 + 0.0000319500000001 + -0.0000014200000000 + -46.8607035974999846 + 17.1221579999999953 + -2.0678986874999996 + 0.0827161250000000 + 112.5143505220000009 + -41.0931791999999874 + 4.9629568499999985 + -0.1985187000000000 + -84.4129508914999889 + 30.8198843999999923 + -3.7222176374999982 + 0.1488890250000000 + 18.7705170869999911 + -6.8488631999999967 + 0.8271594749999995 + -0.0330864500000000 + 112.5143505219999867 + -41.0931791999999945 + 4.9629568499999994 + -0.1985187000000000 + -270.2236567919999288 + 98.6236300799999697 + -11.9110964399999943 + 0.4764448799999998 + 202.7493065939999042 + -73.9677225599999701 + 8.9333223299999958 + -0.3573336599999999 + -45.0916521319999788 + 16.4372716799999949 + -1.9851827399999988 + 0.0794074800000000 + -84.4129508914999889 + 30.8198843999999923 + -3.7222176374999991 + 0.1488890250000000 + 202.7493065939999610 + -73.9677225599999844 + 8.9333223299999975 + -0.3573336599999999 + -152.1231529454999531 + 55.4757919199999776 + -6.6999917474999968 + 0.2680002449999999 + 33.8323330989999818 + -12.3279537599999927 + 1.4888870549999993 + -0.0595556100000000 + 18.7705170869999982 + -6.8488631999999985 + 0.8271594750000000 + -0.0330864500000000 + -45.0916521319999930 + 16.4372716799999985 + -1.9851827399999995 + 0.0794074800000000 + 33.8323330989999960 + -12.3279537599999962 + 1.4888870549999995 + -0.0595556100000000 + -7.5243380219999976 + 2.7395452799999989 + -0.3308637899999998 + 0.0132345800000000 + 0.0000000000000000 + 0.0000000000000000 + -32.6217780473999994 + 21.7478520315999972 + 0.0000000000000000 + 0.0000000000000000 + 42.1036102331999942 + -28.0690734888000009 + 0.0000000000000000 + 0.0000000000000000 + -17.3069209304999987 + 11.5379472869999997 + 0.0000000000000000 + 0.0000000000000000 + 2.2865894573999999 + -1.5243929716000000 + 0.0000000000000000 + 0.0000000000000000 + 80.7563291291999974 + -53.8375527528000006 + 0.0000000000000000 + 0.0000000000000000 + -103.7670803135999904 + 69.1780535423999936 + 0.0000000000000000 + 0.0000000000000000 + 42.5275334640000011 + -28.3516889759999984 + 0.0000000000000000 + 0.0000000000000000 + -5.6073377951999994 + 3.7382251968000002 + 0.0000000000000000 + 0.0000000000000000 + -60.5672468468999909 + 40.3781645645999987 + 0.0000000000000000 + 0.0000000000000000 + 77.8253102351999928 + -51.8835401567999952 + 0.0000000000000000 + 0.0000000000000000 + -31.8956500979999973 + 21.2637667320000006 + 0.0000000000000000 + 0.0000000000000000 + 4.2055033464000005 + -2.8036688975999997 + 0.0000000000000000 + 0.0000000000000000 + 13.4593881881999984 + -8.9729254587999989 + 0.0000000000000000 + 0.0000000000000000 + -17.2945133855999984 + 11.5296755904000001 + 0.0000000000000000 + 0.0000000000000000 + 7.0879222439999996 + -4.7252814960000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9345562992000001 + 0.6230375328000000 + 44.2256531812000020 + -132.2389900727999930 + 99.1792425546000089 + -22.0398316788000024 + -57.1087958436000065 + 170.7439982111999939 + -128.0579986584000096 + 28.4573330352000013 + 23.4803316015000050 + -70.1983325880000137 + 52.6487494410000068 + -11.6997220980000023 + -3.1027108802000005 + 9.2757776784000008 + -6.9568332588000015 + 1.5459629464000002 + -138.5907206816000041 + 397.2227929391999623 + -297.9170947044000286 + 66.2037988232000032 + 178.4133265968000046 + -511.2056480831998897 + 383.4042360623999457 + -85.2009413472000006 + -73.3938860820000087 + 210.1673533679999650 + -157.6255150260000164 + 35.0278922279999989 + 9.7018514776000000 + -27.7703137824000024 + 20.8277353368000036 + -4.6283856304000004 + 105.4788598592000142 + -301.6030611396000722 + 226.2022958546999973 + -50.2671768566000026 + -135.7846198235999964 + 388.1433357647999856 + -291.1075018236000460 + 64.6905559607999976 + 55.8681749264999965 + -159.6001399019999667 + 119.7001049265000034 + -26.6000233170000016 + -7.3860899902000003 + 21.0910186536000026 + -15.8182639902000002 + 3.5151697756000004 + -23.2462882296000011 + 66.5586023016000041 + -49.9189517261999995 + 11.0931003835999995 + 29.9256277248000018 + -85.6571172480000058 + 64.2428379360000008 + -14.2761862080000022 + -12.3115115519999989 + 35.2179655199999999 + -26.4134741400000017 + 5.8696609200000003 + 1.6275348736000002 + -4.6537287359999997 + 3.4902965520000002 + -0.7756214560000001 + -50.0478950811999894 + 64.5349948775999991 + -26.8895811989999984 + 3.5852774931999991 + 69.5343934043999923 + -89.6509583711999767 + 37.3545659879999903 + -4.9806087983999987 + -28.9726639184999897 + 37.3545659879999903 + -15.5644024949999960 + 2.0752536659999996 + 3.8630218557999996 + -4.9806087983999987 + 2.0752536659999996 + -0.2767004887999999 + 183.1902844943999753 + -243.4800953951999531 + 101.4500397479999805 + -13.5266719663999986 + -250.0931194127999788 + 331.8487242623999691 + -138.2703017759999966 + 18.4360402367999967 + 104.2054664220000006 + -138.2703017759999966 + 57.6126257399999915 + -7.6816834319999989 + -13.8940621895999961 + 18.4360402367999967 + -7.6816834319999989 + 1.0242244575999997 + -151.8031018499999618 + 201.5326388519999909 + -83.9719328549999915 + 11.1962577139999979 + 206.0974818899999832 + -273.2155583040000124 + 113.8398159599999957 + -15.1786421279999963 + -85.8739507874999930 + 113.8398159599999815 + -47.4332566499999970 + 6.3244342199999988 + 11.4498601049999991 + -15.1786421279999963 + 6.3244342199999988 + -0.8432578959999998 + 35.4079979087999988 + -46.8875383343999914 + 19.5364743059999952 + -2.6048632407999994 + -47.9516943455999893 + 63.4177924127999972 + -26.4240801719999965 + 3.5232106895999991 + 19.9798726439999967 + -26.4240801719999965 + 11.0100334049999979 + -1.4680044539999997 + -2.6639830191999998 + 3.5232106895999991 + -1.4680044539999997 + 0.1957339271999999 + 42.6442853668999575 + -40.0053803687999618 + 11.9066088158999897 + -1.1642323157999992 + -56.7584044271999559 + 53.3405071583999586 + -15.8754784211999898 + 1.5523097543999986 + 23.6493351779999799 + -22.2252113159999816 + 6.6147826754999954 + -0.6467957309999994 + -3.1532446903999967 + 2.9633615087999976 + -0.8819710233999991 + 0.0862394307999999 + -120.2324494991998876 + 109.5640452863999030 + -32.7718093751999717 + 3.2246967023999971 + 159.8769737135998525 + -146.0853937151998707 + 43.6957458335999576 + -4.2995956031999967 + -66.6154057139999480 + 60.8689140479999509 + -18.2065607639999811 + 1.7914981679999984 + 8.8820540951999920 + -8.1158552063999920 + 2.4275414351999975 + -0.2388664223999998 + 89.9558741243999265 + -82.1730339647999273 + 24.5788570313999770 + -2.4185225267999977 + -119.6268492851999099 + 109.5640452863999030 + -32.7718093751999717 + 3.2246967023999975 + 49.8445205354999530 + -45.6516855359999596 + 13.6549205729999876 + -1.3436236259999990 + -6.6459360713999933 + 6.0868914047999940 + -1.8206560763999984 + 0.1791498167999998 + -19.8930995831999802 + 18.2606742143999838 + -5.4619682291999947 + 0.5374494503999995 + 26.4589082855999749 + -24.3475656191999761 + 7.2826243055999935 + -0.7165992671999993 + -11.0245451189999901 + 10.1448190079999918 + -3.0344267939999972 + 0.2985830279999998 + 1.4699393491999986 + -1.3526425343999988 + 0.4045902391999996 + -0.0398110704000000 + -184.9754434746999721 + 126.2750600519999864 + -28.5549122366999981 + 2.1151786841999995 + 189.3135113616000069 + -129.2160267359999750 + 29.2643043155999933 + -2.1677262455999999 + -64.5253657339999904 + 44.0523311399999926 + -9.9912321314999986 + 0.7400912689999999 + 7.3273586311999983 + -5.0036281519999983 + 1.1364106841999997 + -0.0841785692000000 + 549.7599647855997773 + -378.5554258559998857 + 85.6643485175999899 + -6.3455072976000002 + -561.1830773327999395 + 387.2884078079999881 + -87.7923953568000002 + 6.5031403967999992 + 190.7604902219999872 + -132.0071299200000112 + 29.9734807320000023 + -2.2202578319999997 + -21.6066616295999978 + 14.9909026559999994 + -3.4092032976000000 + 0.2525335776000000 + -412.5384365891999892 + 283.9165693919999285 + -64.2482613882000066 + 4.7591304731999999 + 421.1681889995999200 + -290.4663058559999627 + 65.8442965176000001 + -4.8773552975999994 + -143.1874014164999949 + 99.0053474399999942 + -22.4801105490000026 + 1.6651933740000002 + 16.2206007222000004 + -11.2431769920000004 + 2.5569024732000005 + -0.1894001832000000 + 91.7723027975999912 + -63.0925709760000046 + 14.2773914196000007 + -1.0575845496000000 + -93.7177668888000142 + 64.5480679679999980 + -14.6320658928000018 + 1.0838567328000002 + 31.8714375370000056 + -22.0011883200000042 + 4.9955801220000016 + -0.3700429720000001 + -3.6115132716000011 + 2.4984837760000009 + -0.5682005496000003 + 0.0420889296000000 + 130.2289587202998575 + -70.6241013659999197 + 12.3802240670999844 + -0.7175173373999989 + -173.8642248983998115 + 94.1654684879999024 + -16.5069654227999791 + 0.9566897831999988 + 72.5249910409999359 + -39.2356118699999570 + 6.8779022594999919 + -0.3986207429999995 + -9.6772489387999912 + 5.2314149159999950 + -0.9170536345999990 + 0.0531494323999999 + -395.8553984243995956 + 212.1429210479998346 + -37.1411466587999683 + 2.1525807671999981 + 528.3530069471995603 + -282.8572280639997985 + 49.5215288783999625 + -2.8701076895999975 + -220.3917782279998789 + 117.8571783599999208 + -20.6339703659999856 + 1.1958782039999993 + 29.4073208303999856 + -15.7142904479999928 + 2.7511960487999989 + -0.1594504272000000 + 296.6730858182997963 + -159.1071907859998760 + 27.8558599940999869 + -1.6144355753999990 + -395.9838742103997902 + 212.1429210479998915 + -37.1411466587999826 + 2.1525807671999990 + 165.1767999209999402 + -88.3928837699999690 + 15.4754777744999963 + -0.8969086529999999 + -22.0398861227999987 + 11.7857178359999999 + -2.0633970366000001 + 0.1195878204000000 + -65.8302577373999753 + 35.3571535079999890 + -6.1901911097999989 + 0.3587634612000000 + 87.8715804911999783 + -47.1428713439999996 + 8.2535881464000003 + -0.4783512816000001 + -36.6539405380000005 + 19.6428630600000034 + -3.4389950610000017 + 0.1993130340000001 + 4.8908171384000028 + -2.6190484080000020 + 0.4585326748000005 + -0.0265750712000000 + -5.5045576885001175 + 0.4527535500000591 + -0.0009345375000100 + 0.0000479250000006 + 7.1137969800001573 + -0.6036714000000785 + 0.0012460500000132 + -0.0000639000000007 + -2.8825180750000672 + 0.2515297500000336 + -0.0005191875000056 + 0.0000266250000003 + 0.3770856100000094 + -0.0335373000000047 + 0.0000692250000008 + -0.0000035500000000 + 11.3420452620003189 + -1.0866085200001598 + 0.0022428900000267 + -0.0001150200000015 + -14.5769179680004157 + 1.4488113600002079 + -0.0029905200000346 + 0.0001533600000019 + 5.8290238200001756 + -0.6036714000000871 + 0.0012460500000144 + -0.0000639000000008 + -0.7554527760000237 + 0.0804895200000117 + -0.0001661400000019 + 0.0000085200000001 + -8.7249969465002888 + 0.8149563900001421 + -0.0016821675000234 + 0.0000862650000013 + 11.2135694760003659 + -1.0866085200001803 + 0.0022428900000296 + -0.0001150200000016 + -4.4888016150001500 + 0.4527535500000732 + -0.0009345375000119 + 0.0000479250000006 + 0.5821940820000193 + -0.0603671400000094 + 0.0001246050000015 + -0.0000063900000001 + 2.0359828770000856 + -0.1811014200000415 + 0.0003738150000067 + -0.0000191700000004 + -2.6167403280001054 + 0.2414685600000509 + -0.0004984200000082 + 0.0000255600000004 + 1.0495264700000413 + -0.1006119000000198 + 0.0002076750000032 + -0.0000106500000002 + -0.1363117960000050 + 0.0134149200000024 + -0.0000276900000004 + 0.0000014200000000 + -5.5116026635001862 + 0.4547664000000811 + -0.0010783125000117 + 0.0000479250000006 + 7.1231902800002480 + -0.6063552000001071 + 0.0014377500000154 + -0.0000639000000007 + -2.8864319500001070 + 0.2526480000000459 + -0.0005990625000066 + 0.0000266250000003 + 0.3776074600000149 + -0.0336864000000064 + 0.0000798750000009 + -0.0000035500000000 + 11.3589532020005066 + -1.0914393600002181 + 0.0025879500000312 + -0.0001150200000015 + -14.5994618880006595 + 1.4552524800002826 + -0.0034506000000403 + 0.0001533600000019 + 5.8384171200002770 + -0.6063552000001183 + 0.0014377500000168 + -0.0000639000000008 + -0.7567052160000375 + 0.0808473600000159 + -0.0001917000000022 + 0.0000085200000001 + -8.7376779015004544 + 0.8185795200001927 + -0.0019409625000273 + 0.0000862650000013 + 11.2304774160005767 + -1.0914393600002443 + 0.0025879500000344 + -0.0001150200000016 + -4.4958465900002356 + 0.4547664000000990 + -0.0010783125000139 + 0.0000479250000006 + 0.5831334120000303 + -0.0606355200000127 + 0.0001437750000018 + -0.0000063900000001 + 2.0388008670001336 + -0.1819065600000558 + 0.0004313250000078 + -0.0000191700000004 + -2.6204976480001649 + 0.2425420800000685 + -0.0005751000000095 + 0.0000255600000004 + 1.0510920200000642 + -0.1010592000000266 + 0.0002396250000037 + -0.0000106500000002 + -0.1365205360000077 + 0.0134745600000031 + -0.0000319500000004 + 0.0000014200000000 + 251.7870357364997460 + -92.4596531999998916 + 11.1666529124999840 + -0.4466670749999995 + -335.9416609199996060 + 123.2795375999998271 + -14.8888705499999823 + 0.5955560999999993 + 140.0572560499998076 + -51.3664739999999256 + 6.2036960624999917 + -0.2481483749999996 + -18.6815509399999762 + 6.8488631999999914 + -0.8271594749999989 + 0.0330864500000000 + -606.1577789579991986 + 221.9031676799996831 + -26.7999669899999589 + 1.0720009799999985 + 808.7561809919991447 + -295.8708902399996532 + 35.7332893199999475 + -1.4293346399999980 + -337.2264340799995921 + 123.2795375999998413 + -14.8888705499999787 + 0.5955560999999991 + 44.9852749439999400 + -16.4372716799999807 + 1.9851827399999973 + -0.0794074799999999 + 454.3998712184992428 + -166.4273757599997339 + 20.0999752424999656 + -0.8040007349999987 + -606.2862547439991658 + 221.9031676799996831 + -26.7999669899999589 + 1.0720009799999983 + 252.8027918099996327 + -92.4596531999998632 + 11.1666529124999840 + -0.4466670749999994 + -33.7233517079999530 + 12.3279537599999820 + -1.4888870549999980 + 0.0595556099999999 + -100.8806544929998097 + 36.9838612799999282 + -4.4666611649999908 + 0.1786668299999996 + 134.6054428319997385 + -49.3118150399999138 + 5.9555482199999883 + -0.2382224399999995 + -56.1263831799999053 + 20.5465895999999653 + -2.4814784249999957 + 0.0992593499999998 + 7.4871428239999887 + -2.7395452799999958 + 0.3308637899999995 + -0.0132345800000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3353203725000000 + 0.2235469150000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.8047688940000000 + -0.5365125960000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6035766705000000 + 0.4023844470000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1341281490000000 + -0.0894187660000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 56.1396151825000089 + -135.0033327360000044 + 101.2524995520000033 + -22.5005554560000007 + -49.5027190080000068 + 118.8065256192000163 + -89.1048942144000051 + 19.8010876031999992 + 14.4382930439999981 + -34.6519033056000012 + 25.9889274792000009 + -5.7753172175999996 + -1.3750755280000000 + 3.3001812671999997 + -2.4751359503999999 + 0.5500302112000000 + -125.9664885020000042 + 302.9633875199999693 + -227.2225406400000054 + 50.4938979200000020 + 110.2406780160000039 + -264.5776272383999412 + 198.4332204287999843 + -44.0962712064000044 + -32.1535310880000011 + 77.1684746111999971 + -57.8763559583999978 + 12.8614124351999983 + 3.0622410560000000 + -7.3493785343999996 + 5.5120339008000006 + -1.2248964224000001 + 90.0868110965000000 + -216.6912079679999863 + 162.5184059759999968 + -36.1152013279999977 + -78.7312587600000029 + 188.9550210239999899 + -141.7162657679999995 + 31.4925035040000019 + 22.9632838050000032 + -55.1118811320000077 + 41.3339108490000058 + -9.1853135219999995 + -2.1869794100000002 + 5.2487505839999997 + -3.9365629379999998 + 0.8747917640000000 + -20.5720296569999981 + 49.4801736959999943 + -37.1101302719999921 + 8.2466956160000002 + 17.9932997519999986 + -43.1839194047999939 + 32.3879395535999990 + -7.1973199008000002 + -5.2480457610000002 + 12.5953098263999994 + -9.4464823697999982 + 2.0992183043999999 + 0.4998138820000000 + -1.1995533167999999 + 0.8996649876000000 + -0.1999255528000000 + -157.0620940015000429 + 216.2579120640000099 + -90.1074633599999970 + 12.0143284479999988 + 141.4799946432000013 + -194.6321208576000004 + 81.0967170240000002 + -10.8128956031999994 + -41.2649984375999992 + 56.7677019167999930 + -23.6532091320000006 + 3.1537612175999996 + 3.9299998511999998 + -5.4064478016000006 + 2.2526865840000001 + -0.3003582112000000 + 311.4225038820000009 + -432.5158241280000198 + 180.2149267199999656 + -24.0286568960000011 + -280.7129412863999391 + 389.2642417152000007 + -162.1934340479999719 + 21.6257912063999989 + 81.8746078751999846 + -113.5354038336000144 + 47.3064182640000013 + -6.3075224351999992 + -7.7975817024000005 + 10.8128956032000012 + -4.5053731680000002 + 0.6007164224000000 + -192.3943393994999838 + 270.3223900799999342 + -112.6343291999999963 + 15.0179105600000007 + 173.4794213039999988 + -243.2901510719999578 + 101.3708962799999824 + -13.5161195039999988 + -50.5981645469999961 + 70.9596273960000019 + -29.5665114150000008 + 3.9422015220000004 + 4.8188728140000006 + -6.7580597520000003 + 2.8158582299999999 + -0.3754477640000000 + 37.9715111430000007 + -54.0644780160000025 + 22.5268658399999993 + -3.0035821120000001 + -34.2464746608000041 + 48.6580302144000001 + -20.2741792560000036 + 2.7032239008000003 + 9.9885551094000000 + -14.1919254791999983 + 5.9133022830000002 + -0.7884403044000000 + -0.9512909627999999 + 1.3516119504000002 + -0.5631716460000000 + 0.0750895528000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352400000000010 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769450000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215560000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473690000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352400000000010 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769450000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215560000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473690000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352400000000010 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769450000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215560000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473690000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352400000000010 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769450000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215560000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473690000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352400000000010 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769450000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215560000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473690000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352400000000010 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769450000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215560000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473690000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.0321606498499998 + 4.6881070998999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 24.1765592188499987 + -16.1177061459000015 + 0.0000000000000000 + 0.0000000000000000 + -16.1177061459000015 + 10.7451374305999998 + 0.0000000000000000 + 0.0000000000000000 + 9.1366163297999989 + -6.0910775531999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -30.8078686817999952 + 20.5385791212000015 + 0.0000000000000000 + 0.0000000000000000 + 20.5385791212000015 + -13.6923860808000022 + 0.0000000000000000 + 0.0000000000000000 + -3.8069234707500001 + 2.5379489805000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 12.6594244507499987 + -8.4396163005000009 + 0.0000000000000000 + 0.0000000000000000 + -8.4396163005000009 + 5.6264108670000006 + 0.0000000000000000 + 0.0000000000000000 + 0.5075897961000000 + -0.3383931974000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.6721732600999999 + 1.1147821734000001 + 0.0000000000000000 + 0.0000000000000000 + 1.1147821734000001 + -0.7431881156000000 + 1.7964189073000001 + -9.9371338973999990 + 7.4528504230499992 + -1.6561889829000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -44.4148786822999995 + 125.9369562125999948 + -94.4527171594500032 + 20.9894927021000015 + 30.4859639041999984 + -86.0604782868000200 + 64.5453587151000079 + -14.3434130477999986 + -2.4750911663999995 + 13.2495118631999986 + -9.9371338973999990 + 2.2082519771999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 57.1409193383999963 + -161.7845013575999928 + 121.3383760181999946 + -26.9640835595999988 + -39.2202895176000013 + 110.5595581392000071 + -82.9196686044000160 + 18.4265930231999988 + 1.0312879859999999 + -5.5206299429999994 + 4.1404724572499996 + -0.9201049905000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -23.5724663909999990 + 66.7014588990000021 + -50.0260941742499980 + 11.1169098164999998 + 16.1842872989999975 + -45.5939825580000075 + 34.1954869185000021 + -7.5989970929999995 + -0.1375050648000000 + 0.7360839924000000 + -0.5520629942999999 + 0.1226806654000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1219955187999999 + -8.8305278531999996 + 6.6228958898999997 + -1.4717546422000001 + -2.1439049731999997 + 6.0371976743999998 + -4.5278982558000003 + 1.0061996123999999 + 41.0697356006999996 + -54.7530359903999937 + 22.8137649960000033 + -3.0418353327999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -58.7754249068999925 + 72.4365406655999919 + -30.1818919439999931 + 4.0242522591999990 + 34.4529747782000015 + -41.9835046751999954 + 17.4931269480000005 + -2.3324169264000001 + -52.4181452760000042 + 69.8908603680000056 + -29.1211918200000000 + 3.8828255760000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 71.7688591055999865 + -88.1435659967999783 + 36.7264858319999945 + -4.8968647775999994 + -41.7636522935999963 + 50.6527056287999997 + -21.1052940120000017 + 2.8140392016000000 + 21.8408938650000017 + -29.1211918200000000 + 12.1338299250000006 + -1.6178439899999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -29.9036912939999979 + 36.7264858319999945 + -15.3027024299999965 + 2.0403603239999999 + 17.4015217890000002 + -21.1052940120000017 + 8.7938725049999995 + -1.1725163340000000 + -2.9121191820000001 + 3.8828255760000001 + -1.6178439899999999 + 0.2157125320000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.9871588391999992 + -4.8968647775999994 + 2.0403603239999999 + -0.2720480432000000 + -2.3202029051999999 + 2.8140392016000000 + -1.1725163340000000 + 0.1563355112000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -22.5910445969999856 + 16.9389155015999862 + -5.2449352712999966 + 0.5381739305999996 + 15.0606963979999851 + -11.2926103343999884 + 3.4966235141999964 + -0.3587826203999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 29.8518848603999807 + -22.5852206687999839 + 6.9932470283999955 + -0.7175652407999995 + -19.9012565735999800 + 15.0568137791999828 + -4.6621646855999952 + 0.4783768271999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.4382853584999911 + 9.4105086119999921 + -2.9138529284999981 + 0.2989855169999998 + 8.2921902389999929 + -6.2736724079999924 + 1.9425686189999980 + -0.1993236779999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.6584380477999987 + -1.2547344815999988 + 0.3885137237999997 + -0.0398647356000000 + -1.1056253651999990 + 0.8364896543999990 + -0.2590091491999997 + 0.0265764904000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 132.0402867341999809 + -94.3691021639999832 + 21.4156989368999930 + -1.5863480693999996 + -88.0268578227999967 + 62.9127347760000006 + -14.2771326246000001 + 1.0575653796000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -133.2574315811999668 + 96.4624295519999748 + -21.9475812491999918 + 1.6257467591999992 + 88.8382877207999968 + -64.3082863680000116 + 14.6317208328000028 + -1.0838311728000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 44.7574818254999798 + -32.8519189799999864 + 7.4931545204999956 + -0.5550484829999996 + -29.8383212170000043 + 21.9012793200000040 + -4.9954363470000018 + 0.3700323220000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.0106466433999977 + 3.7277438639999976 + -0.8522720693999993 + 0.0631312643999999 + 3.3404310956000010 + -2.4851625760000013 + 0.5681813796000004 + -0.0420875096000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -104.3657106932998886 + 53.3063472119999489 + -9.2857611221999896 + 0.5381739467999993 + 69.5771404621999920 + -35.5375648079999991 + 6.1905074148000008 + -0.3587826312000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 139.1294649887998673 + -71.0751296159999271 + 12.3810148295999856 + -0.7175652623999991 + -92.7529766592000016 + 47.3834197440000082 + -8.2540098864000022 + 0.4783768416000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -58.0317834119999389 + 29.6146373399999696 + -5.1587561789999938 + 0.2989855259999996 + 38.6878556080000138 + -19.7430915600000105 + 3.4391707860000027 + -0.1993236840000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.7430087215999910 + -3.9486183119999954 + 0.6878341571999992 + -0.0398647367999999 + -5.1620058144000041 + 2.6324122080000025 + -0.4585561048000005 + 0.0265764912000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5694553116999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.7129702077999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.4011244799999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.2674163199999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.4783081999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9855388000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2025453600000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1350302400000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5694553116999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.7129702077999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.4011244799999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.2674163199999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.4783081999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9855388000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2025453600000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1350302400000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5694553116999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.7129702077999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.4011244799999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.2674163199999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.4783081999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9855388000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2025453600000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1350302400000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.6217780473999994 + 21.7478520315999972 + 0.0000000000000000 + 0.0000000000000000 + 80.7563291291999974 + -53.8375527528000006 + 0.0000000000000000 + 0.0000000000000000 + -60.5672468468999909 + 40.3781645645999987 + 0.0000000000000000 + 0.0000000000000000 + 13.4593881881999984 + -8.9729254587999989 + 0.0000000000000000 + 0.0000000000000000 + 42.1036102331999942 + -28.0690734887999973 + 0.0000000000000000 + 0.0000000000000000 + -103.7670803135999904 + 69.1780535423999936 + 0.0000000000000000 + 0.0000000000000000 + 77.8253102351999928 + -51.8835401567999952 + 0.0000000000000000 + 0.0000000000000000 + -17.2945133855999984 + 11.5296755904000001 + 0.0000000000000000 + 0.0000000000000000 + -17.3069209304999987 + 11.5379472869999997 + 0.0000000000000000 + 0.0000000000000000 + 42.5275334640000011 + -28.3516889759999984 + 0.0000000000000000 + 0.0000000000000000 + -31.8956500979999973 + 21.2637667320000006 + 0.0000000000000000 + 0.0000000000000000 + 7.0879222439999996 + -4.7252814960000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2865894573999999 + -1.5243929716000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6073377951999994 + 3.7382251968000002 + 0.0000000000000000 + 0.0000000000000000 + 4.2055033464000005 + -2.8036688975999997 + 0.0000000000000000 + 0.0000000000000000 + -0.9345562992000001 + 0.6230375328000000 + 44.2256531812000020 + -132.2389900727999930 + 99.1792425546000089 + -22.0398316788000024 + -138.5907206816000041 + 397.2227929391999623 + -297.9170947044000286 + 66.2037988232000032 + 105.4788598592000000 + -301.6030611396000722 + 226.2022958547000258 + -50.2671768566000026 + -23.2462882296000011 + 66.5586023016000041 + -49.9189517262000066 + 11.0931003835999995 + -57.1087958435999994 + 170.7439982111999939 + -128.0579986583999812 + 28.4573330352000013 + 178.4133265968000046 + -511.2056480832000034 + 383.4042360624000594 + -85.2009413472000006 + -135.7846198235999964 + 388.1433357647999856 + -291.1075018236000460 + 64.6905559607999976 + 29.9256277248000018 + -85.6571172480000058 + 64.2428379360000008 + -14.2761862080000022 + 23.4803316015000014 + -70.1983325879999995 + 52.6487494410000068 + -11.6997220980000023 + -73.3938860819999945 + 210.1673533680000219 + -157.6255150260000164 + 35.0278922279999989 + 55.8681749265000036 + -159.6001399020000235 + 119.7001049265000034 + -26.6000233170000016 + -12.3115115520000007 + 35.2179655199999999 + -26.4134741400000017 + 5.8696609200000003 + -3.1027108802000001 + 9.2757776784000008 + -6.9568332588000015 + 1.5459629464000002 + 9.7018514776000000 + -27.7703137823999988 + 20.8277353368000000 + -4.6283856304000004 + -7.3860899902000003 + 21.0910186535999991 + -15.8182639902000002 + 3.5151697756000004 + 1.6275348736000002 + -4.6537287359999997 + 3.4902965520000002 + -0.7756214560000001 + -50.0478950811999823 + 64.5349948775999849 + -26.8895811989999878 + 3.5852774931999987 + 183.1902844943999753 + -243.4800953951999247 + 101.4500397479999805 + -13.5266719663999968 + -151.8031018499999618 + 201.5326388519999625 + -83.9719328549999773 + 11.1962577139999979 + 35.4079979087999988 + -46.8875383343999914 + 19.5364743059999952 + -2.6048632407999994 + 69.5343934043999639 + -89.6509583711999625 + 37.3545659879999832 + -4.9806087983999978 + -250.0931194127999504 + 331.8487242623999123 + -138.2703017759999398 + 18.4360402367999932 + 206.0974818899999548 + -273.2155583039999556 + 113.8398159599999815 + -15.1786421279999963 + -47.9516943455999893 + 63.4177924127999830 + -26.4240801719999965 + 3.5232106895999991 + -28.9726639184999897 + 37.3545659879999832 + -15.5644024949999924 + 2.0752536659999992 + 104.2054664219999722 + -138.2703017759999682 + 57.6126257399999844 + -7.6816834319999980 + -85.8739507874999788 + 113.8398159599999815 + -47.4332566499999899 + 6.3244342199999988 + 19.9798726439999967 + -26.4240801719999965 + 11.0100334049999979 + -1.4680044539999997 + 3.8630218557999982 + -4.9806087983999978 + 2.0752536659999992 + -0.2767004887999999 + -13.8940621895999961 + 18.4360402367999932 + -7.6816834319999980 + 1.0242244575999997 + 11.4498601049999973 + -15.1786421279999963 + 6.3244342199999988 + -0.8432578959999998 + -2.6639830191999998 + 3.5232106895999991 + -1.4680044539999997 + 0.1957339272000000 + 42.6442853668999931 + -40.0053803687999974 + 11.9066088159000003 + -1.1642323158000001 + -120.2324494991999728 + 109.5640452863999741 + -32.7718093751999930 + 3.2246967023999997 + 89.9558741243999833 + -82.1730339647999841 + 24.5788570313999983 + -2.4185225267999999 + -19.8930995831999979 + 18.2606742143999980 + -5.4619682291999991 + 0.5374494503999999 + -56.7584044271999986 + 53.3405071583999941 + -15.8754784212000004 + 1.5523097544000002 + 159.8769737135999662 + -146.0853937151999560 + 43.6957458335999860 + -4.2995956031999993 + -119.6268492851999810 + 109.5640452863999741 + -32.7718093751999930 + 3.2246967023999993 + 26.4589082855999962 + -24.3475656191999974 + 7.2826243055999988 + -0.7165992671999999 + 23.6493351779999976 + -22.2252113159999993 + 6.6147826754999990 + -0.6467957310000000 + -66.6154057139999907 + 60.8689140479999864 + -18.2065607639999953 + 1.7914981679999997 + 49.8445205354999885 + -45.6516855359999880 + 13.6549205729999983 + -1.3436236259999998 + -11.0245451189999990 + 10.1448190079999989 + -3.0344267939999998 + 0.2985830280000000 + -3.1532446904000002 + 2.9633615088000003 + -0.8819710234000000 + 0.0862394308000000 + 8.8820540951999991 + -8.1158552063999991 + 2.4275414351999998 + -0.2388664223999999 + -6.6459360713999995 + 6.0868914047999993 + -1.8206560763999997 + 0.1791498168000000 + 1.4699393491999997 + -1.3526425343999997 + 0.4045902391999999 + -0.0398110704000000 + -184.9754434747000289 + 126.2750600520000148 + -28.5549122367000052 + 2.1151786842000004 + 549.7599647856001184 + -378.5554258559999994 + 85.6643485176000183 + -6.3455072976000011 + -412.5384365892000460 + 283.9165693920000422 + -64.2482613882000066 + 4.7591304732000008 + 91.7723027976000196 + -63.0925709760000046 + 14.2773914196000042 + -1.0575845496000000 + 189.3135113616000353 + -129.2160267360000034 + 29.2643043156000076 + -2.1677262455999999 + -561.1830773328000532 + 387.2884078080000450 + -87.7923953568000144 + 6.5031403968000010 + 421.1681889996000336 + -290.4663058560000763 + 65.8442965176000143 + -4.8773552976000012 + -93.7177668888000142 + 64.5480679680000122 + -14.6320658928000036 + 1.0838567328000002 + -64.5253657340000046 + 44.0523311400000068 + -9.9912321315000003 + 0.7400912690000001 + 190.7604902220000156 + -132.0071299200000112 + 29.9734807320000058 + -2.2202578320000006 + -143.1874014165000233 + 99.0053474400000084 + -22.4801105490000026 + 1.6651933740000002 + 31.8714375370000056 + -22.0011883200000042 + 4.9955801220000016 + -0.3700429720000001 + 7.3273586312000010 + -5.0036281520000010 + 1.1364106842000001 + -0.0841785692000000 + -21.6066616296000049 + 14.9909026560000029 + -3.4092032976000008 + 0.2525335776000001 + 16.2206007222000039 + -11.2431769920000022 + 2.5569024732000005 + -0.1894001832000000 + -3.6115132716000002 + 2.4984837760000005 + -0.5682005496000001 + 0.0420889296000000 + 130.2289587202999428 + -70.6241013659999624 + 12.3802240670999915 + -0.7175173373999993 + -395.8553984243998229 + 212.1429210479999199 + -37.1411466587999826 + 2.1525807671999990 + 296.6730858182999100 + -159.1071907859999612 + 27.8558599940999905 + -1.6144355753999995 + -65.8302577373999895 + 35.3571535079999961 + -6.1901911097999989 + 0.3587634612000000 + -173.8642248983998968 + 94.1654684879999451 + -16.5069654227999898 + 0.9566897831999992 + 528.3530069471997876 + -282.8572280639999121 + 49.5215288783999910 + -2.8701076895999988 + -395.9838742103999607 + 212.1429210479999483 + -37.1411466587999897 + 2.1525807671999995 + 87.8715804911999925 + -47.1428713439999996 + 8.2535881464000003 + -0.4783512816000000 + 72.5249910409999643 + -39.2356118699999783 + 6.8779022594999955 + -0.3986207429999997 + -220.3917782279999642 + 117.8571783599999776 + -20.6339703659999927 + 1.1958782039999996 + 165.1767999209999687 + -88.3928837699999974 + 15.4754777744999981 + -0.8969086529999999 + -36.6539405380000005 + 19.6428630599999998 + -3.4389950610000004 + 0.1993130340000000 + -9.6772489387999947 + 5.2314149159999976 + -0.9170536345999994 + 0.0531494324000000 + 29.4073208303999962 + -15.7142904479999963 + 2.7511960487999998 + -0.1594504272000000 + -22.0398861227999987 + 11.7857178359999999 + -2.0633970366000001 + 0.1195878204000000 + 4.8908171384000010 + -2.6190484080000003 + 0.4585326748000001 + -0.0265750712000000 + -5.5045576884998377 + 0.4527535499999218 + -0.0009345374999876 + 0.0000479249999993 + 11.3420452619995764 + -1.0866085199997961 + 0.0022428899999674 + -0.0001150199999983 + -8.7249969464996404 + 0.8149563899998263 + -0.0016821674999721 + 0.0000862649999985 + 2.0359828769999018 + -0.1811014199999522 + 0.0003738149999923 + -0.0000191699999996 + 7.1137969799997833 + -0.6036713999998966 + 0.0012460499999836 + -0.0000638999999991 + -14.5769179679994441 + 1.4488113599997343 + -0.0029905199999576 + 0.0001533599999978 + 11.2135694759995364 + -1.0866085199997786 + 0.0022428899999646 + -0.0001150199999981 + -2.6167403279998775 + 0.2414685599999410 + -0.0004984199999905 + 0.0000255599999995 + -2.8825180749999051 + 0.2515297499999547 + -0.0005191874999928 + 0.0000266249999996 + 5.8290238199997608 + -0.6036713999998863 + 0.0012460499999820 + -0.0000638999999990 + -4.4888016149998080 + 0.4527535499999084 + -0.0009345374999855 + 0.0000479249999992 + 1.0495264699999514 + -0.1006118999999768 + 0.0002076749999963 + -0.0000106499999998 + 0.3770856099999864 + -0.0335372999999935 + 0.0000692249999990 + -0.0000035499999999 + -0.7554527759999667 + 0.0804895199999842 + -0.0001661399999975 + 0.0000085199999999 + 0.5821940819999744 + -0.0603671399999879 + 0.0001246049999981 + -0.0000063899999999 + -0.1363117959999940 + 0.0134149199999972 + -0.0000276899999996 + 0.0000014200000000 + -5.5116026634997457 + 0.4547663999998953 + -0.0010783124999857 + 0.0000479249999993 + 11.3589532019993378 + -1.0914393599997261 + 0.0025879499999623 + -0.0001150199999983 + -8.7376779014994366 + 0.8185795199997661 + -0.0019409624999676 + 0.0000862649999985 + 2.0388008669998454 + -0.1819065599999353 + 0.0004313249999910 + -0.0000191699999996 + 7.1231902799996636 + -0.6063551999998610 + 0.0014377499999810 + -0.0000638999999991 + -14.5994618879991389 + 1.4552524799996427 + -0.0034505999999509 + 0.0001533599999978 + 11.2304774159992817 + -1.0914393599997021 + 0.0025879499999590 + -0.0001150199999981 + -2.6204976479998088 + 0.2425420799999205 + -0.0005750999999890 + 0.0000255599999995 + -2.8864319499998530 + 0.2526479999999392 + -0.0005990624999917 + 0.0000266249999996 + 5.8384171199996304 + -0.6063551999998473 + 0.0014377499999791 + -0.0000638999999990 + -4.4958465899997018 + 0.4547663999998769 + -0.0010783124999832 + 0.0000479249999992 + 1.0510920199999245 + -0.1010591999999689 + 0.0002396249999957 + -0.0000106499999998 + 0.3776074599999789 + -0.0336863999999913 + 0.0000798749999988 + -0.0000035499999999 + -0.7567052159999486 + 0.0808473599999789 + -0.0001916999999971 + 0.0000085199999999 + 0.5831334119999604 + -0.0606355199999838 + 0.0001437749999978 + -0.0000063899999999 + -0.1365205359999907 + 0.0134745599999963 + -0.0000319499999995 + 0.0000014200000000 + 251.7870357365003713 + -92.4596532000001332 + 11.1666529125000178 + -0.4466670750000007 + -606.1577789580009039 + 221.9031676800003083 + -26.7999669900000406 + 1.0720009800000017 + 454.3998712185007207 + -166.4273757600003023 + 20.0999752425000366 + -0.8040007350000014 + -100.8806544930002360 + 36.9838612800000845 + -4.4666611650000103 + 0.1786668300000004 + -335.9416609200004586 + 123.2795376000001681 + -14.8888705500000214 + 0.5955561000000008 + 808.7561809920013047 + -295.8708902400004490 + 35.7332893200000541 + -1.4293346400000022 + -606.2862547440010985 + 221.9031676800003652 + -26.7999669900000441 + 1.0720009800000017 + 134.6054428320002785 + -49.3118150400000985 + 5.9555482200000114 + -0.2382224400000005 + 140.0572560500002055 + -51.3664740000000748 + 6.2036960625000095 + -0.2481483750000004 + -337.2264340800005584 + 123.2795376000001966 + -14.8888705500000231 + 0.5955561000000009 + 252.8027918100004001 + -92.4596532000001616 + 11.1666529125000178 + -0.4466670750000007 + -56.1263831800001043 + 20.5465896000000399 + -2.4814784250000046 + 0.0992593500000002 + -18.6815509400000295 + 6.8488632000000109 + -0.8271594750000013 + 0.0330864500000001 + 44.9852749440000750 + -16.4372716800000234 + 1.9851827400000031 + -0.0794074800000001 + -33.7233517080000524 + 12.3279537600000193 + -1.4888870550000024 + 0.0595556100000001 + 7.4871428240000135 + -2.7395452800000046 + 0.3308637900000005 + -0.0132345800000000 + 0.0000000000000000 + 0.0000000000000000 + 204.6814854389999709 + -136.4543236259999901 + 0.0000000000000000 + 0.0000000000000000 + -270.4943405699999630 + 180.3295603799999753 + 0.0000000000000000 + 0.0000000000000000 + 112.7059752374999988 + -75.1373168249999992 + 0.0000000000000000 + 0.0000000000000000 + -15.0274633649999991 + 10.0183089100000000 + 0.0000000000000000 + 0.0000000000000000 + -270.4943405699999630 + 180.3295603799999753 + 0.0000000000000000 + 0.0000000000000000 + 357.4400451840000414 + -238.2933634559999803 + 0.0000000000000000 + 0.0000000000000000 + -148.9333521599999983 + 99.2889014399999894 + 0.0000000000000000 + 0.0000000000000000 + 19.8577802880000007 + -13.2385201919999993 + 0.0000000000000000 + 0.0000000000000000 + 112.7059752374999988 + -75.1373168249999992 + 0.0000000000000000 + 0.0000000000000000 + -148.9333521599999983 + 99.2889014399999894 + 0.0000000000000000 + 0.0000000000000000 + 62.0555634000000040 + -41.3703755999999956 + 0.0000000000000000 + 0.0000000000000000 + -8.2740751199999991 + 5.5160500800000003 + 0.0000000000000000 + 0.0000000000000000 + -15.0274633649999991 + 10.0183089100000000 + 0.0000000000000000 + 0.0000000000000000 + 19.8577802880000007 + -13.2385201919999993 + 0.0000000000000000 + 0.0000000000000000 + -8.2740751199999991 + 5.5160500800000003 + 0.0000000000000000 + 0.0000000000000000 + 1.1032100160000000 + -0.7354733440000000 + -221.1055395120000071 + 694.3984831799999711 + -520.7988623850000067 + 115.7330805300000094 + 278.7592949099999373 + -885.4177802399999564 + 664.0633351800000810 + -147.5696300400000212 + -112.8727612125000093 + 361.0594071000000440 + -270.7945553250000330 + 60.1765678499999979 + 14.7584174950000016 + -47.4421726800000059 + 35.5816295099999991 + -7.9070287800000010 + 278.7592949099999942 + -885.4177802400001838 + 664.0633351800000810 + -147.5696300400000212 + -351.5299650720000955 + 1129.6239523200001713 + -847.2179642400000148 + 188.2706587200000001 + 142.2576037800000108 + -460.5649308000000133 + 345.4236981000000242 + -76.7608218000000022 + -18.5931725040000018 + 60.5098382400000006 + -45.3823786800000022 + 10.0849730400000013 + -112.8727612125000093 + 361.0594071000000440 + -270.7945553250000330 + 60.1765678499999979 + 142.2576037800000108 + -460.5649308000000133 + 345.4236981000000242 + -76.7608218000000022 + -57.5184953249999964 + 187.6888395000000003 + -140.7666296250000073 + 31.2814732499999977 + 7.5130877100000006 + -24.6506705999999980 + 18.4880029500000020 + -4.1084451000000000 + 14.7584174950000016 + -47.4421726800000059 + 35.5816295099999991 + -7.9070287800000001 + -18.5931725040000018 + 60.5098382400000006 + -45.3823786800000022 + 10.0849730399999995 + 7.5130877100000006 + -24.6506705999999980 + 18.4880029499999985 + -4.1084451000000000 + -0.9809390280000001 + 3.2368216800000003 + -2.4276162599999997 + 0.5394702800000000 + 191.0667307679999567 + -232.3364261399999577 + 96.8068442249999919 + -12.9075792299999978 + -257.3214441299999748 + 309.7819015199999626 + -129.0757922999999892 + 17.2101056399999948 + 107.8726573874999985 + -129.0757922999999892 + 53.7815801249999978 + -7.1708773499999996 + -14.4412777849999969 + 17.2101056399999983 + -7.1708773499999996 + 0.9561169799999999 + -257.3214441299999748 + 309.7819015199999058 + -129.0757922999999892 + 17.2101056399999948 + 346.2666576479999776 + -413.0425353599999312 + 172.1010563999999761 + -22.9468075199999966 + -145.1204170199999908 + 172.1010564000000045 + -71.7087734999999924 + 9.5611698000000001 + 19.4242905360000009 + -22.9468075200000001 + 9.5611698000000001 + -1.2748226400000000 + 107.8726573874999701 + -129.0757922999999892 + 53.7815801249999907 + -7.1708773499999987 + -145.1204170199999908 + 172.1010563999999761 + -71.7087734999999924 + 9.5611697999999983 + 60.8179416749999930 + -71.7087734999999924 + 29.8786556250000004 + -3.9838207499999996 + -8.1402678900000005 + 9.5611698000000001 + -3.9838207500000000 + 0.5311760999999999 + -14.4412777849999969 + 17.2101056399999948 + -7.1708773499999987 + 0.9561169799999998 + 19.4242905359999973 + -22.9468075199999966 + 9.5611697999999983 + -1.2748226399999998 + -8.1402678900000005 + 9.5611697999999983 + -3.9838207499999996 + 0.5311760999999999 + 1.0895302519999999 + -1.2748226400000000 + 0.5311760999999999 + -0.0708234800000000 + -91.7268526394999384 + 94.0688623799999277 + -26.5321536524999857 + 2.4120022049999981 + 119.7366670799999042 + -125.4251498399999036 + 35.3762048699999738 + -3.2160029399999974 + -49.2348889499999558 + 52.2604790999999622 + -14.7400853624999861 + 1.3400012249999991 + 6.5063950599999956 + -6.9680638799999954 + 1.9653447149999987 + -0.1786668299999999 + 119.7366670799999042 + -125.4251498399999036 + 35.3762048699999738 + -3.2160029399999974 + -156.4774906319998422 + 167.2335331199998905 + -47.1682731599999627 + 4.2880039199999960 + 64.3563114299999484 + -69.6806387999999401 + 19.6534471499999839 + -1.7866682999999985 + -8.5059399239999927 + 9.2907518399999933 + -2.6204596199999983 + 0.2382224399999998 + -49.2348889499999558 + 52.2604790999999622 + -14.7400853624999897 + 1.3400012249999991 + 64.3563114299999484 + -69.6806387999999401 + 19.6534471499999839 + -1.7866682999999985 + -26.4640285124999792 + 29.0335994999999798 + -8.1889363124999939 + 0.7444451249999995 + 3.4973281349999974 + -3.8711465999999977 + 1.0918581749999994 + -0.0992593499999999 + 6.5063950599999956 + -6.9680638799999954 + 1.9653447149999987 + -0.1786668299999999 + -8.5059399239999927 + 9.2907518399999933 + -2.6204596199999983 + 0.2382224399999998 + 3.4973281349999974 + -3.8711465999999977 + 1.0918581749999994 + -0.0992593499999999 + -0.4621492179999996 + 0.5161528799999997 + -0.1455810899999999 + 0.0132345800000000 + 24.0740975205001106 + -2.4277887000000864 + 0.0034937325000216 + -0.0002587950000018 + -34.6645998000001612 + 3.2370516000001230 + -0.0046583100000299 + 0.0003450600000024 + 15.0989722500000738 + -1.3487715000000551 + 0.0019409625000130 + -0.0001437750000010 + -2.0714531000000118 + 0.1798362000000081 + -0.0002587950000018 + 0.0000191700000001 + -34.6645998000001612 + 3.2370516000001235 + -0.0046583100000299 + 0.0003450600000024 + 49.3908652080002355 + -4.3160688000001688 + 0.0062110800000399 + -0.0004600800000031 + -21.4221701700001006 + 1.7983620000000724 + -0.0025879500000166 + 0.0001917000000013 + 2.9311909560000142 + -0.2397816000000101 + 0.0003450600000022 + -0.0000255600000002 + 15.0989722500000720 + -1.3487715000000551 + 0.0019409625000130 + -0.0001437750000010 + -21.4221701700001006 + 1.7983620000000724 + -0.0025879500000166 + 0.0001917000000013 + 9.2770054875000412 + -0.7493175000000296 + 0.0010783125000066 + -0.0000798750000005 + -1.2681430650000054 + 0.0999090000000038 + -0.0001437750000008 + 0.0000106500000001 + -2.0714531000000118 + 0.1798362000000081 + -0.0002587950000018 + 0.0000191700000001 + 2.9311909560000142 + -0.2397816000000101 + 0.0003450600000022 + -0.0000255600000002 + -1.2681430650000054 + 0.0999090000000038 + -0.0001437750000008 + 0.0000106500000001 + 0.1732469420000007 + -0.0133212000000004 + 0.0000191700000001 + -0.0000014200000000 + 24.0935071455002721 + -2.4355525500001534 + 0.0042701175000289 + -0.0002587950000018 + -34.6904793000003693 + 3.2474034000002079 + -0.0056934900000389 + 0.0003450600000024 + 15.1097553750001588 + -1.3530847500000884 + 0.0023722875000164 + -0.0001437750000010 + -2.0728908500000220 + 0.1804113000000122 + -0.0003163050000022 + 0.0000191700000001 + -34.6904793000003622 + 3.2474034000002079 + -0.0056934900000389 + 0.0003450600000024 + 49.4253712080004988 + -4.3298712000002757 + 0.0075913200000511 + -0.0004600800000031 + -21.4365476700002091 + 1.8041130000001138 + -0.0031630500000209 + 0.0001917000000013 + 2.9331079560000273 + -0.2405484000000150 + 0.0004217400000027 + -0.0000255600000002 + 15.1097553750001588 + -1.3530847500000884 + 0.0023722875000164 + -0.0001437750000010 + -21.4365476700002091 + 1.8041130000001140 + -0.0031630500000209 + 0.0001917000000013 + 9.2829961125000828 + -0.7517137500000454 + 0.0013179375000082 + -0.0000798750000005 + -1.2689418150000105 + 0.1002285000000056 + -0.0001757250000010 + 0.0000106500000001 + -2.0728908500000220 + 0.1804113000000122 + -0.0003163050000022 + 0.0000191700000001 + 2.9331079560000273 + -0.2405484000000150 + 0.0004217400000027 + -0.0000255600000002 + -1.2689418150000105 + 0.1002285000000056 + -0.0001757250000010 + 0.0000106500000001 + 0.1733534420000013 + -0.0133638000000006 + 0.0000234300000001 + -0.0000014200000000 + 24.1214570055004529 + -2.4448691700002163 + 0.0050465025000343 + -0.0002587950000018 + -34.7277457800006175 + 3.2598255600002939 + -0.0067286700000462 + 0.0003450600000024 + 15.1252830750002651 + -1.3582606500001246 + 0.0028036125000195 + -0.0001437750000010 + -2.0749612100000361 + 0.1811014200000171 + -0.0003738150000026 + 0.0000191700000001 + -34.7277457800006175 + 3.2598255600002939 + -0.0067286700000462 + 0.0003450600000024 + 49.4750598480008250 + -4.3464340800003880 + 0.0089715600000605 + -0.0004600800000031 + -21.4572512700003450 + 1.8110142000001597 + -0.0037381500000247 + 0.0001917000000013 + 2.9358684360000451 + -0.2414685600000209 + 0.0004984200000032 + -0.0000255600000002 + 15.1252830750002616 + -1.3582606500001246 + 0.0028036125000195 + -0.0001437750000010 + -21.4572512700003450 + 1.8110142000001597 + -0.0037381500000247 + 0.0001917000000013 + 9.2916226125001380 + -0.7545892500000633 + 0.0015575625000096 + -0.0000798750000005 + -1.2700920150000172 + 0.1006119000000078 + -0.0002076750000012 + 0.0000106500000001 + -2.0749612100000361 + 0.1811014200000171 + -0.0003738150000026 + 0.0000191700000001 + 2.9358684360000451 + -0.2414685600000209 + 0.0004984200000032 + -0.0000255600000002 + -1.2700920150000172 + 0.1006119000000078 + -0.0002076750000012 + 0.0000106500000001 + 0.1735068020000020 + -0.0134149200000009 + 0.0000276900000001 + -0.0000014200000000 + 24.1594998705007029 + -2.4557385600002908 + 0.0058228875000397 + -0.0002587950000018 + -34.7784696000009532 + 3.2743180800003930 + -0.0077638500000534 + 0.0003450600000024 + 15.1464180000004074 + -1.3642992000001666 + 0.0032349375000225 + -0.0001437750000010 + -2.0777792000000561 + 0.1819065600000228 + -0.0004313250000031 + 0.0000191700000001 + -34.7784696000009532 + 3.2743180800003930 + -0.0077638500000534 + 0.0003450600000024 + 49.5426916080012703 + -4.3657574400005181 + 0.0103518000000699 + -0.0004600800000031 + -21.4854311700005276 + 1.8190656000002128 + -0.0043132500000285 + 0.0001917000000013 + 2.9396257560000691 + -0.2425420800000277 + 0.0005751000000037 + -0.0000255600000002 + 15.1464180000004074 + -1.3642992000001666 + 0.0032349375000225 + -0.0001437750000010 + -21.4854311700005276 + 1.8190656000002128 + -0.0043132500000285 + 0.0001917000000013 + 9.3033642375002099 + -0.7579440000000840 + 0.0017971875000111 + -0.0000798750000005 + -1.2716575650000261 + 0.1010592000000103 + -0.0002396250000013 + 0.0000106500000001 + -2.0777792000000561 + 0.1819065600000228 + -0.0004313250000031 + 0.0000191700000001 + 2.9396257560000691 + -0.2425420800000277 + 0.0005751000000037 + -0.0000255600000002 + -1.2716575650000261 + 0.1010592000000103 + -0.0002396250000013 + 0.0000106500000001 + 0.1737155420000029 + -0.0134745600000011 + 0.0000319500000001 + -0.0000014200000000 + -1365.2531474894988150 + 499.2821272799995995 + -60.2999257274999536 + 2.4120022049999981 + 1817.7717268799983685 + -665.7095030399993902 + 80.3999009699999192 + -3.2160029399999974 + -756.7494971999993822 + 277.3789595999998028 + -33.4999587374999663 + 1.3400012249999991 + 100.8416761599999063 + -36.9838612799999709 + 4.4666611649999961 + -0.1786668299999999 + 1817.7717268799983685 + -665.7095030399995039 + 80.3999009699999192 + -3.2160029399999974 + -2420.5242370319979273 + 887.6126707199993007 + -107.1998679599999207 + 4.2880039199999960 + 1007.7091224299991836 + -369.8386127999996802 + 44.6666116499999646 + -1.7866682999999985 + -134.2863147239999080 + 49.3118150399999564 + -5.9555482199999954 + 0.2382224399999998 + -756.7494971999992686 + 277.3789595999998028 + -33.4999587374999663 + 1.3400012249999991 + 1007.7091224299990699 + -369.8386127999996802 + 44.6666116499999646 + -1.7866682999999985 + -419.5276997624996511 + 154.0994219999998904 + -18.6110881874999841 + 0.7444451249999995 + 55.9058176349999627 + -20.5465895999999830 + 2.4814784249999979 + -0.0992593499999999 + 100.8416761599999063 + -36.9838612799999709 + 4.4666611649999961 + -0.1786668299999999 + -134.2863147239999080 + 49.3118150399999564 + -5.9555482199999954 + 0.2382224399999998 + 55.9058176349999627 + -20.5465895999999830 + 2.4814784249999979 + -0.0992593499999999 + -7.4499478179999956 + 2.7395452799999984 + -0.3308637899999998 + 0.0132345800000000 + 0.0000000000000000 + 0.0000000000000000 + 1.8107300115000000 + -1.2071533409999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.4143066819999999 + 1.6095377879999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.0059611175000001 + -0.6706407450000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1341281490000000 + 0.0894187660000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 225.3083766705000244 + -539.2915199999999913 + 404.4686400000000503 + -89.8819200000000080 + -202.2343199999999968 + 485.3623680000000604 + -364.0217760000000453 + 80.8937280000000101 + 58.9850100000000026 + -141.5640239999999892 + 106.1730180000000132 + -23.5940039999999982 + -5.6176200000000005 + 13.4822880000000005 + -10.1117160000000013 + 2.2470479999999999 + -262.9603688939999984 + 629.1734400000000278 + -471.8800800000000208 + 104.8622400000000141 + 235.9400400000000104 + -566.2560960000000705 + 424.6920720000000529 + -94.3760159999999928 + -68.8158449999999959 + 165.1580280000000300 + -123.8685210000000154 + 27.5263379999999991 + 6.5538900000000009 + -15.7293360000000000 + 11.7970019999999991 + -2.6215560000000000 + 100.2041203725000003 + -239.6851199999999835 + 179.7638400000000161 + -39.9475199999999973 + -89.8819200000000080 + 215.7166080000000079 + -161.7874560000000201 + 35.9527679999999989 + 26.2155599999999964 + -62.9173439999999999 + 47.1880080000000035 + -10.4862240000000000 + -2.4967199999999998 + 5.9921279999999992 + -4.4940959999999999 + 0.9986880000000000 + -12.5283093829999999 + 29.9606400000000015 + -22.4704800000000020 + 4.9934399999999997 + 11.2352400000000010 + -26.9645760000000010 + 20.2234320000000025 + -4.4940959999999999 + -3.2769449999999996 + 7.8646680000000000 + -5.8985010000000004 + 1.3107780000000000 + 0.3120900000000000 + -0.7490160000000000 + 0.5617620000000000 + -0.1248360000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888939999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880079999999964 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803724999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763839999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888939999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880079999999964 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803724999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763839999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888939999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880079999999964 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803724999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763839999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888939999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880079999999964 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803724999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763839999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888939999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880079999999964 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803724999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763839999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888939999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880079999999964 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803724999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763839999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888939999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880079999999964 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803724999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763839999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1796984025000000 + 0.1197989350000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.5390952075000000 + -0.3593968050000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3593968050000000 + 0.2395978700000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0598994675000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.7523780425000002 + -15.7744311360000005 + 11.8308233519999995 + -2.6290718559999999 + -7.0045704549999996 + 16.5234516479999982 + -12.3925887360000004 + 2.7539086080000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -6.7580597519999994 + 16.2193434048000000 + -12.1645075536000000 + 2.7032239007999999 + 6.7580597519999994 + -16.2193434048000000 + 12.1645075536000000 + -2.7032239007999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.9711007609999998 + -4.7306418263999994 + 3.5479813698000000 + -0.7884403043999999 + -1.9711007609999998 + 4.7306418263999994 + -3.5479813698000000 + 0.7884403043999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1877238820000000 + 0.4505373168000000 + -0.3379029876000000 + 0.0750895528000000 + 0.1877238820000000 + -0.4505373168000000 + 0.3379029876000000 + -0.0750895528000000 + 1.7561266437000007 + -2.3348907144000020 + 0.9728711310000014 + -0.1297161508000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -46.0039935710999970 + 61.0691501591999995 + -25.4454792330000004 + 3.3927305643999999 + 44.1854485514000146 + -58.7342594448000099 + 24.4726081020000059 + -3.2630144136000014 + -0.0000000000000012 + 0.0000000000000029 + -0.0000000000000020 + 0.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 36.4935226607999965 + -48.6580302144000001 + 20.2741792560000000 + -2.7032239007999999 + -36.4935226608000107 + 48.6580302144000143 + -20.2741792560000071 + 2.7032239008000012 + 0.0000000000000005 + -0.0000000000000012 + 0.0000000000000008 + -0.0000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -10.6439441093999996 + 14.1919254792000000 + -5.9133022830000002 + 0.7884403043999999 + 10.6439441094000031 + -14.1919254792000071 + 5.9133022830000037 + -0.7884403044000006 + -0.0000000000000001 + 0.0000000000000002 + -0.0000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.0137089628000000 + -1.3516119503999999 + 0.5631716460000000 + -0.0750895528000000 + -1.0137089628000004 + 1.3516119504000006 + -0.5631716460000002 + 0.0750895528000001 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0049586079000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2021309517000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1347539678000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3353203725000000 + 0.2235469150000000 + 0.0000000000000000 + 0.0000000000000000 + 0.8047688940000000 + -0.5365125960000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6035766705000000 + 0.4023844470000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1341281490000000 + -0.0894187660000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 56.1396151825000018 + -135.0033327360000044 + 101.2524995520000033 + -22.5005554560000007 + -125.9664885020000042 + 302.9633875199999693 + -227.2225406399999770 + 50.4938979199999949 + 90.0868110964999858 + -216.6912079679999579 + 162.5184059759999968 + -36.1152013279999977 + -20.5720296569999981 + 49.4801736959999943 + -37.1101302719999921 + 8.2466956160000002 + -49.5027190080000068 + 118.8065256192000163 + -89.1048942144000051 + 19.8010876031999992 + 110.2406780160000039 + -264.5776272383999412 + 198.4332204287999843 + -44.0962712064000044 + -78.7312587600000029 + 188.9550210239999615 + -141.7162657679999711 + 31.4925035039999983 + 17.9932997519999986 + -43.1839194047999939 + 32.3879395535999990 + -7.1973199008000002 + 14.4382930439999981 + -34.6519033056000012 + 25.9889274792000009 + -5.7753172175999996 + -32.1535310880000011 + 77.1684746111999971 + -57.8763559583999978 + 12.8614124351999983 + 22.9632838049999997 + -55.1118811319999935 + 41.3339108489999987 + -9.1853135219999995 + -5.2480457610000002 + 12.5953098263999994 + -9.4464823697999982 + 2.0992183043999999 + -1.3750755280000000 + 3.3001812671999997 + -2.4751359503999999 + 0.5500302112000000 + 3.0622410560000000 + -7.3493785343999996 + 5.5120339008000006 + -1.2248964224000001 + -2.1869794100000002 + 5.2487505839999997 + -3.9365629379999998 + 0.8747917640000000 + 0.4998138820000000 + -1.1995533167999999 + 0.8996649876000000 + -0.1999255528000000 + -157.0620940015000429 + 216.2579120640000099 + -90.1074633599999970 + 12.0143284479999988 + 311.4225038820000009 + -432.5158241280000198 + 180.2149267199999940 + -24.0286568960000011 + -192.3943393995000122 + 270.3223900799999910 + -112.6343292000000105 + 15.0179105600000007 + 37.9715111430000007 + -54.0644780160000025 + 22.5268658399999993 + -3.0035821120000001 + 141.4799946432000013 + -194.6321208576000004 + 81.0967170240000002 + -10.8128956031999994 + -280.7129412863999960 + 389.2642417152000007 + -162.1934340480000003 + 21.6257912063999989 + 173.4794213039999988 + -243.2901510719999862 + 101.3708962799999966 + -13.5161195040000006 + -34.2464746608000041 + 48.6580302144000001 + -20.2741792560000036 + 2.7032239008000003 + -41.2649984375999992 + 56.7677019167999930 + -23.6532091319999971 + 3.1537612175999996 + 81.8746078751999988 + -113.5354038336000144 + 47.3064182640000013 + -6.3075224351999992 + -50.5981645469999961 + 70.9596273959999877 + -29.5665114149999972 + 3.9422015219999995 + 9.9885551094000000 + -14.1919254791999983 + 5.9133022830000002 + -0.7884403044000000 + 3.9299998511999998 + -5.4064478016000006 + 2.2526865840000001 + -0.3003582112000000 + -7.7975817024000005 + 10.8128956032000012 + -4.5053731680000002 + 0.6007164224000000 + 4.8188728140000006 + -6.7580597520000003 + 2.8158582299999999 + -0.3754477640000000 + -0.9512909628000000 + 1.3516119504000002 + -0.5631716460000000 + 0.0750895528000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473689999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352399999999992 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999980 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769449999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215559999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553889999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473689999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352399999999992 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999980 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769449999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215559999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553889999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473689999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352399999999992 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999980 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769449999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215559999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553889999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473689999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352399999999992 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999980 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769449999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215559999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553889999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473689999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352399999999992 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999980 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769449999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215559999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553889999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.1313400465000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -12.9643642139999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 10.3474531604999989 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5768473689999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4940959999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2352399999999992 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.9881919999999980 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.2769449999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.6215559999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553889999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1248360000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3120900000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2496720000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.8107300115000000 + -1.2071533409999999 + 0.0000000000000000 + 0.0000000000000000 + -2.4143066819999999 + 1.6095377879999999 + 0.0000000000000000 + 0.0000000000000000 + 1.0059611175000001 + -0.6706407450000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1341281490000000 + 0.0894187660000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 225.3083766704999960 + -539.2915199999999913 + 404.4686400000000503 + -89.8819200000000080 + -262.9603688939999984 + 629.1734400000000278 + -471.8800800000000208 + 104.8622400000000141 + 100.2041203725000003 + -239.6851200000000119 + 179.7638400000000161 + -39.9475200000000044 + -12.5283093829999999 + 29.9606400000000015 + -22.4704800000000020 + 4.9934399999999997 + -202.2343199999999968 + 485.3623680000000036 + -364.0217760000000453 + 80.8937280000000101 + 235.9400400000000104 + -566.2560960000000705 + 424.6920720000000529 + -94.3760160000000070 + -89.8819200000000080 + 215.7166080000000079 + -161.7874560000000201 + 35.9527680000000061 + 11.2352400000000010 + -26.9645760000000010 + 20.2234320000000025 + -4.4940959999999999 + 58.9850100000000026 + -141.5640239999999892 + 106.1730180000000132 + -23.5940039999999982 + -68.8158449999999959 + 165.1580280000000016 + -123.8685210000000154 + 27.5263379999999991 + 26.2155600000000035 + -62.9173440000000070 + 47.1880080000000035 + -10.4862240000000000 + -3.2769449999999996 + 7.8646680000000000 + -5.8985010000000004 + 1.3107780000000000 + -5.6176200000000005 + 13.4822880000000005 + -10.1117160000000013 + 2.2470479999999999 + 6.5538900000000009 + -15.7293360000000000 + 11.7970019999999991 + -2.6215560000000000 + -2.4967199999999998 + 5.9921279999999992 + -4.4940959999999999 + 0.9986880000000000 + 0.3120900000000000 + -0.7490160000000000 + 0.5617620000000000 + -0.1248360000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888940000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803725000022 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880080000000035 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763840000000030 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888940000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803725000022 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880080000000035 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763840000000030 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888940000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803725000022 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880080000000035 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763840000000030 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888940000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803725000022 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880080000000035 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763840000000030 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888940000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803725000022 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880080000000035 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763840000000030 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888940000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803725000022 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880080000000035 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763840000000030 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 45.5445366704999941 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -53.2358888940000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 20.3090803725000022 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.5414293830000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.4468640000000050 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 47.1880080000000035 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9763840000000030 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2470479999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.7970019999999991 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.7631689999999995 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.2431120000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6553890000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.1235240000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3107780000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4993440000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0624180000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + +# piCH + +6 +0.0 +4.0 +0.0 +4.0 +0.0 +9.0 + + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.3500000000000001 + 0.9000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000000 + -0.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000000 + -0.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + -0.6000000000000001 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -63.4499999999999886 + 80.9999999999999858 + -33.7499999999999929 + 4.4999999999999991 + 42.2999999999999972 + -53.9999999999999858 + 22.4999999999999964 + -2.9999999999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 42.2999999999999972 + -53.9999999999999858 + 22.4999999999999964 + -2.9999999999999996 + -28.1999999999999957 + 36.0000000000000000 + -15.0000000000000000 + 2.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 179.5499999999999545 + -161.9999999999999716 + 47.2499999999999929 + -4.4999999999999991 + -119.6999999999999886 + 107.9999999999999716 + -31.4999999999999964 + 2.9999999999999996 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -119.6999999999999886 + 107.9999999999999716 + -31.4999999999999964 + 2.9999999999999996 + 79.7999999999999972 + -72.0000000000000000 + 21.0000000000000000 + -2.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.8000000000000003 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + -5.4000000000000004 + 3.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 4.0500000000000007 + -2.7000000000000002 + 0.0000000000000000 + 0.0000000000000000 + -0.9000000000000000 + 0.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.6000000000000005 + -2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + -2.7000000000000002 + 1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.6000000000000001 + -0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.1499999999999986 + 45.0000000000000000 + -33.7500000000000000 + 7.5000000000000000 + 43.2000000000000028 + -108.0000000000000000 + 81.0000000000000000 + -18.0000000000000000 + -32.3999999999999986 + 81.0000000000000000 + -60.7500000000000000 + 13.5000000000000000 + 7.2000000000000002 + -18.0000000000000000 + 13.5000000000000000 + -3.0000000000000000 + 12.0999999999999996 + -30.0000000000000000 + 22.5000000000000000 + -5.0000000000000000 + -28.8000000000000007 + 72.0000000000000000 + -54.0000000000000000 + 12.0000000000000000 + 21.6000000000000014 + -54.0000000000000000 + 40.5000000000000000 + -9.0000000000000000 + -4.7999999999999998 + 12.0000000000000000 + -9.0000000000000000 + 2.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 80.8499999999999943 + -108.0000000000000000 + 45.0000000000000000 + -6.0000000000000000 + -244.8000000000000114 + 324.0000000000000000 + -135.0000000000000000 + 18.0000000000000000 + 183.5999999999999943 + -243.0000000000000000 + 101.2500000000000000 + -13.5000000000000000 + -40.7999999999999972 + 54.0000000000000000 + -22.5000000000000000 + 3.0000000000000000 + -53.9000000000000057 + 72.0000000000000000 + -30.0000000000000000 + 4.0000000000000000 + 163.1999999999999886 + -216.0000000000000000 + 90.0000000000000000 + -12.0000000000000000 + -122.4000000000000057 + 162.0000000000000000 + -67.5000000000000000 + 9.0000000000000000 + 27.1999999999999993 + -36.0000000000000000 + 15.0000000000000000 + -2.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 60.6000000000000369 + -54.0000000000000284 + 15.7500000000000107 + -1.5000000000000011 + -1.8000000000001068 + 0.0000000000000999 + -0.0000000000000306 + 0.0000000000000031 + 1.3500000000000831 + -0.0000000000000759 + 0.0000000000000226 + -0.0000000000000022 + -0.3000000000000198 + 0.0000000000000173 + -0.0000000000000049 + 0.0000000000000004 + -40.4000000000000270 + 36.0000000000000213 + -10.5000000000000036 + 1.0000000000000004 + 1.2000000000000515 + -0.0000000000000426 + 0.0000000000000111 + -0.0000000000000009 + -0.9000000000000317 + 0.0000000000000253 + -0.0000000000000062 + 0.0000000000000004 + 0.2000000000000040 + -0.0000000000000027 + 0.0000000000000004 + 0.0000000000000000 + -3.9810265070966766 + 2.7143362548386434 + -0.6107256573386948 + 0.0452389375806441 + 9.5544636170320238 + -6.5144070116127439 + 1.4657415776128673 + -0.1085734501935457 + -7.1658477127740188 + 4.8858052587095582 + -1.0993061832096505 + 0.0814300876451593 + 1.5924106028386709 + -1.0857345019354574 + 0.2442902629354779 + -0.0180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 12.5430795212900357 + -8.1430087645159333 + 1.8321769720160854 + -0.1357168127419323 + -30.4633908510960865 + 19.5432210348382434 + -4.3972247328386054 + 0.3257203505806374 + 22.8475431383220666 + -14.6574157761286834 + 3.2979185496289536 + -0.2442902629354781 + -5.0772318085160153 + 3.2572035058063742 + -0.7328707888064342 + 0.0542867250967729 + -8.3620530141933571 + 5.4286725096772885 + -1.2214513146773900 + 0.0904778751612881 + 20.3089272340640541 + -13.0288140232254914 + 2.9314831552257354 + -0.2171469003870915 + -15.2316954255480397 + 9.7716105174191163 + -2.1986123664193014 + 0.1628601752903186 + 3.3848212056773415 + -2.1714690038709143 + 0.4885805258709557 + -0.0361911500645152 + -0.0226194687903220 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0542867250967729 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0407150438225796 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6678584063709662 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.9628601752903188 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.4721451314677392 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3085734501935460 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9814300876451594 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0226194687903220 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0542867250967729 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0407150438225796 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6678584063709662 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.9628601752903188 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.4721451314677392 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3085734501935460 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9814300876451594 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0226194687903220 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0542867250967729 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0407150438225796 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6678584063709662 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.9628601752903188 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.4721451314677392 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3085734501935460 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9814300876451594 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0226194687903220 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0542867250967729 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0407150438225796 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6678584063709662 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.9628601752903188 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.4721451314677392 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3085734501935460 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9814300876451594 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -25.2000000000000028 + 16.8000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 32.4000000000000057 + -21.6000000000000014 + 0.0000000000000000 + 0.0000000000000000 + -13.5000000000000000 + 9.0000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 1.8000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 16.8000000000000007 + -11.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + -21.6000000000000014 + 14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 9.0000000000000018 + -6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 82.3499999999999943 + -217.8000000000000114 + 163.3499999999999943 + -36.2999999999999972 + -110.6999999999999886 + 291.6000000000000227 + -218.6999999999999886 + 48.6000000000000085 + 46.1250000000000000 + -121.5000000000000000 + 91.1250000000000000 + -20.2500000000000036 + -6.1500000000000004 + 16.2000000000000028 + -12.1500000000000021 + 2.7000000000000002 + -54.8999999999999986 + 145.1999999999999886 + -108.9000000000000057 + 24.1999999999999993 + 73.7999999999999972 + -194.4000000000000341 + 145.8000000000000114 + -32.3999999999999986 + -30.7500000000000000 + 81.0000000000000000 + -60.7500000000000000 + 13.5000000000000000 + 4.0999999999999996 + -10.8000000000000007 + 8.0999999999999996 + -1.7999999999999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 9.7500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.6250000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.7500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -6.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 9.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.7500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1460.4000000000000909 + 1306.8000000000001819 + -381.1499999999999773 + 36.2999999999999972 + 1954.8000000000001819 + -1749.6000000000001364 + 510.3000000000000114 + -48.6000000000000085 + -814.5000000000001137 + 729.0000000000001137 + -212.6250000000000000 + 20.2500000000000036 + 108.5999999999999943 + -97.2000000000000028 + 28.3500000000000014 + -2.7000000000000002 + 973.5999999999999091 + -871.2000000000000455 + 254.0999999999999943 + -24.2000000000000028 + -1303.2000000000000455 + 1166.4000000000000909 + -340.2000000000000455 + 32.4000000000000057 + 543.0000000000000000 + -486.0000000000000568 + 141.7500000000000000 + -13.5000000000000000 + -72.4000000000000057 + 64.8000000000000114 + -18.8999999999999986 + 1.8000000000000000 + 21.4975431383220581 + -14.6574157761286745 + 3.2979185496289514 + -0.2442902629354779 + -28.6633908510960751 + 19.5432210348382327 + -4.3972247328386018 + 0.3257203505806372 + 11.9430795212900307 + -8.1430087645159297 + 1.8321769720160841 + -0.1357168127419322 + -1.5924106028386709 + 1.0857345019354574 + -0.2442902629354779 + 0.0180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -72.8926294149661658 + 43.9722473283860253 + -9.8937556488868559 + 0.7328707888064337 + 96.7901725532882438 + -58.6296631045147052 + 13.1916741985158090 + -0.9771610517419118 + -40.3292385638700992 + 24.4290262935477962 + -5.4965309160482541 + 0.4071504382257967 + 5.3772318085160133 + -3.2572035058063733 + 0.7328707888064341 + -0.0542867250967729 + 48.5950862766441105 + -29.3148315522573526 + 6.5958370992579045 + -0.4885805258709559 + -64.5267817021921530 + 39.0864420696764654 + -8.7944494656772036 + 0.6514407011612744 + 26.8861590425800614 + -16.2860175290318594 + 3.6643539440321682 + -0.2714336254838643 + -3.5848212056773412 + 2.1714690038709143 + -0.4885805258709557 + 0.0361911500645152 + 0.1221451314677389 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1628601752903186 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0678584063709661 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.7664353944032172 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2885805258709571 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.7035752191128983 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.8442902629354787 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5257203505806380 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1357168127419324 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1221451314677389 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1628601752903186 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0678584063709661 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.7664353944032172 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2885805258709571 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.7035752191128983 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.8442902629354787 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5257203505806380 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1357168127419324 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1221451314677389 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1628601752903186 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0678584063709661 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.7664353944032172 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2885805258709571 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.7035752191128983 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.8442902629354787 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5257203505806380 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1357168127419324 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1221451314677389 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1628601752903186 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0678584063709661 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.7664353944032172 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2885805258709571 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.7035752191128983 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.8442902629354787 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5257203505806380 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1357168127419324 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9000000000000000 + 0.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6000000000000001 + -0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6749999999999999 + 0.8999999999999997 + -0.6749999999999997 + 0.1499999999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4499999999999999 + -0.5999999999999998 + 0.4499999999999998 + -0.1000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3750000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.6999999999999975 + -5.3999999999999968 + 1.5749999999999993 + -0.1499999999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.7999999999999985 + 3.5999999999999988 + -1.0499999999999998 + 0.1000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.8000000000000003 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.4000000000000004 + 3.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 3.6000000000000005 + -2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 4.0500000000000007 + -2.7000000000000002 + 0.0000000000000000 + 0.0000000000000000 + -2.7000000000000002 + 1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9000000000000000 + 0.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.6000000000000001 + -0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.1499999999999986 + 45.0000000000000000 + -33.7500000000000000 + 7.5000000000000000 + 12.0999999999999996 + -30.0000000000000000 + 22.5000000000000000 + -5.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + -108.0000000000000000 + 81.0000000000000000 + -18.0000000000000000 + -28.8000000000000007 + 72.0000000000000000 + -54.0000000000000000 + 12.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.3999999999999986 + 81.0000000000000000 + -60.7500000000000000 + 13.5000000000000000 + 21.6000000000000014 + -54.0000000000000000 + 40.5000000000000000 + -9.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000002 + -18.0000000000000000 + 13.5000000000000000 + -3.0000000000000000 + -4.7999999999999998 + 12.0000000000000000 + -9.0000000000000000 + 2.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 80.8499999999999943 + -108.0000000000000000 + 45.0000000000000000 + -6.0000000000000000 + -53.9000000000000057 + 72.0000000000000000 + -30.0000000000000000 + 4.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -244.8000000000000114 + 324.0000000000000000 + -135.0000000000000000 + 18.0000000000000000 + 163.1999999999999886 + -216.0000000000000000 + 90.0000000000000000 + -12.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 183.5999999999999943 + -243.0000000000000000 + 101.2500000000000000 + -13.5000000000000000 + -122.4000000000000057 + 162.0000000000000000 + -67.5000000000000000 + 9.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.7999999999999972 + 54.0000000000000000 + -22.5000000000000000 + 3.0000000000000000 + 27.1999999999999993 + -36.0000000000000000 + 15.0000000000000000 + -2.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 60.6000000000000369 + -54.0000000000000284 + 15.7500000000000107 + -1.5000000000000011 + -40.4000000000000270 + 36.0000000000000213 + -10.5000000000000036 + 1.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000001068 + 0.0000000000000999 + -0.0000000000000306 + 0.0000000000000031 + 1.2000000000000515 + -0.0000000000000426 + 0.0000000000000111 + -0.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3500000000000831 + -0.0000000000000759 + 0.0000000000000226 + -0.0000000000000022 + -0.9000000000000317 + 0.0000000000000253 + -0.0000000000000062 + 0.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000198 + 0.0000000000000173 + -0.0000000000000049 + 0.0000000000000004 + 0.2000000000000040 + -0.0000000000000027 + 0.0000000000000004 + 0.0000000000000000 + -3.9810265070966766 + 2.7143362548386434 + -0.6107256573386948 + 0.0452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 12.5430795212900303 + -8.1430087645159297 + 1.8321769720160841 + -0.1357168127419322 + -8.3620530141933536 + 5.4286725096772868 + -1.2214513146773895 + 0.0904778751612881 + 9.5544636170320238 + -6.5144070116127439 + 1.4657415776128673 + -0.1085734501935457 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -30.4633908510960723 + 19.5432210348382327 + -4.3972247328386018 + 0.3257203505806372 + 20.3089272340640505 + -13.0288140232254879 + 2.9314831552257345 + -0.2171469003870915 + -7.1658477127740188 + 4.8858052587095582 + -1.0993061832096505 + 0.0814300876451593 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 22.8475431383220560 + -14.6574157761286745 + 3.2979185496289514 + -0.2442902629354779 + -15.2316954255480361 + 9.7716105174191163 + -2.1986123664193009 + 0.1628601752903186 + 1.5924106028386709 + -1.0857345019354574 + 0.2442902629354779 + -0.0180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.0772318085160126 + 3.2572035058063720 + -0.7328707888064336 + 0.0542867250967729 + 3.3848212056773415 + -2.1714690038709148 + 0.4885805258709558 + -0.0361911500645152 + -0.0226194687903220 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6678584063709662 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0542867250967729 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.9628601752903188 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3085734501935460 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0407150438225796 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.4721451314677392 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9814300876451594 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0226194687903220 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6678584063709662 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0542867250967729 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.9628601752903188 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3085734501935460 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0407150438225796 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.4721451314677392 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9814300876451594 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0226194687903220 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6678584063709662 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0542867250967729 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.9628601752903188 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3085734501935460 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0407150438225796 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.4721451314677392 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9814300876451594 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0226194687903220 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6678584063709662 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4452389375806441 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0542867250967729 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.9628601752903188 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.3085734501935460 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0407150438225796 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.4721451314677392 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9814300876451594 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.4000000000000004 + 1.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + -4.8000000000000007 + 0.0000000000000000 + 0.0000000000000000 + -5.4000000000000004 + 3.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 1.2000000000000002 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + -4.8000000000000007 + 0.0000000000000000 + 0.0000000000000000 + -21.6000000000000014 + 14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 16.2000000000000028 + -10.8000000000000007 + 0.0000000000000000 + 0.0000000000000000 + -3.6000000000000005 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + -5.4000000000000004 + 3.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 16.2000000000000028 + -10.8000000000000007 + 0.0000000000000000 + 0.0000000000000000 + -12.1500000000000021 + 8.1000000000000014 + 0.0000000000000000 + 0.0000000000000000 + 2.7000000000000002 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 1.2000000000000002 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.6000000000000005 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 2.7000000000000002 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + -0.6000000000000001 + 0.4000000000000000 + 49.2000000000000028 + -120.0000000000000000 + 90.0000000000000000 + -20.0000000000000000 + -132.6000000000000227 + 324.0000000000000000 + -243.0000000000000000 + 54.0000000000000000 + 99.4500000000000171 + -243.0000000000000000 + 182.2500000000000000 + -40.5000000000000000 + -22.1000000000000014 + 54.0000000000000000 + -40.5000000000000000 + 9.0000000000000000 + -132.5999999999999943 + 324.0000000000000000 + -243.0000000000000000 + 54.0000000000000000 + 352.8000000000000114 + -864.0000000000000000 + 648.0000000000000000 + -144.0000000000000000 + -264.6000000000000227 + 648.0000000000000000 + -486.0000000000000000 + 108.0000000000000000 + 58.7999999999999972 + -144.0000000000000000 + 108.0000000000000000 + -24.0000000000000000 + 99.4500000000000028 + -243.0000000000000000 + 182.2500000000000000 + -40.5000000000000000 + -264.6000000000000227 + 648.0000000000000000 + -486.0000000000000000 + 108.0000000000000000 + 198.4499999999999886 + -486.0000000000000000 + 364.5000000000000000 + -81.0000000000000000 + -44.1000000000000014 + 108.0000000000000000 + -81.0000000000000000 + 18.0000000000000000 + -22.1000000000000014 + 54.0000000000000000 + -40.5000000000000000 + 9.0000000000000000 + 58.7999999999999972 + -144.0000000000000000 + 108.0000000000000000 + -24.0000000000000000 + -44.1000000000000014 + 108.0000000000000000 + -81.0000000000000000 + 18.0000000000000000 + 9.8000000000000007 + -24.0000000000000000 + 18.0000000000000000 + -4.0000000000000000 + -102.7999999999999972 + 144.0000000000000000 + -60.0000000000000000 + 8.0000000000000000 + 311.3999999999999773 + -432.0000000000000000 + 180.0000000000000000 + -24.0000000000000000 + -233.5499999999999829 + 324.0000000000000000 + -135.0000000000000000 + 18.0000000000000000 + 51.8999999999999986 + -72.0000000000000000 + 30.0000000000000000 + -4.0000000000000000 + 311.3999999999999773 + -432.0000000000000000 + 180.0000000000000000 + -24.0000000000000000 + -943.2000000000000455 + 1296.0000000000000000 + -540.0000000000000000 + 72.0000000000000000 + 707.3999999999999773 + -972.0000000000000000 + 405.0000000000000000 + -54.0000000000000000 + -157.1999999999999886 + 216.0000000000000000 + -90.0000000000000000 + 12.0000000000000000 + -233.5499999999999829 + 324.0000000000000000 + -135.0000000000000000 + 18.0000000000000000 + 707.4000000000000909 + -972.0000000000000000 + 405.0000000000000000 + -54.0000000000000000 + -530.5499999999999545 + 729.0000000000000000 + -303.7500000000000000 + 40.5000000000000000 + 117.9000000000000057 + -162.0000000000000000 + 67.5000000000000000 + -9.0000000000000000 + 51.8999999999999986 + -72.0000000000000000 + 30.0000000000000000 + -4.0000000000000000 + -157.1999999999999886 + 216.0000000000000000 + -90.0000000000000000 + 12.0000000000000000 + 117.9000000000000057 + -162.0000000000000000 + 67.5000000000000000 + -9.0000000000000000 + -26.1999999999999993 + 36.0000000000000000 + -15.0000000000000000 + 2.0000000000000000 + -480.8000000000000114 + 432.0000000000000000 + -126.0000000000000000 + 12.0000000000000000 + 1202.4000000000000909 + -1080.0000000000000000 + 315.0000000000000568 + -30.0000000000000036 + -901.8000000000000682 + 810.0000000000001137 + -236.2500000000000000 + 22.5000000000000036 + 200.4000000000000341 + -180.0000000000000284 + 52.5000000000000071 + -5.0000000000000000 + 1202.4000000000003183 + -1080.0000000000002274 + 315.0000000000000568 + -30.0000000000000071 + -2887.2000000000007276 + 2592.0000000000004547 + -756.0000000000001137 + 72.0000000000000142 + 2165.4000000000005457 + -1944.0000000000002274 + 567.0000000000000000 + -54.0000000000000071 + -481.2000000000000455 + 432.0000000000000568 + -126.0000000000000142 + 12.0000000000000000 + -901.8000000000000682 + 810.0000000000002274 + -236.2500000000000284 + 22.5000000000000036 + 2165.4000000000005457 + -1944.0000000000004547 + 567.0000000000000000 + -54.0000000000000071 + -1624.0500000000001819 + 1458.0000000000002274 + -425.2500000000000568 + 40.5000000000000071 + 360.9000000000000341 + -324.0000000000000568 + 94.5000000000000000 + -9.0000000000000000 + 200.4000000000000341 + -180.0000000000000284 + 52.5000000000000071 + -5.0000000000000000 + -481.2000000000000455 + 432.0000000000000568 + -126.0000000000000142 + 12.0000000000000000 + 360.9000000000000341 + -324.0000000000000568 + 94.5000000000000000 + -9.0000000000000000 + -80.2000000000000028 + 72.0000000000000000 + -21.0000000000000000 + 2.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.0500000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.0500000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.0500000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.0500000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.0500000000000007 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 33.6000000000000014 + -22.3999999999999986 + 0.0000000000000000 + 0.0000000000000000 + -43.2000000000000028 + 28.8000000000000043 + 0.0000000000000000 + 0.0000000000000000 + 18.0000000000000000 + -12.0000000000000018 + 0.0000000000000000 + 0.0000000000000000 + -2.4000000000000004 + 1.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + -100.8000000000000114 + 67.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 129.6000000000000227 + -86.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + -54.0000000000000000 + 36.0000000000000071 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + -4.8000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 75.6000000000000085 + -50.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + -97.2000000000000171 + 64.8000000000000114 + 0.0000000000000000 + 0.0000000000000000 + 40.5000000000000000 + -27.0000000000000036 + 0.0000000000000000 + 0.0000000000000000 + -5.4000000000000004 + 3.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + -16.8000000000000007 + 11.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 21.6000000000000014 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + -9.0000000000000018 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 1.2000000000000002 + -0.8000000000000000 + -109.8000000000000114 + 290.3999999999999773 + -217.7999999999999829 + 48.3999999999999986 + 147.5999999999999943 + -388.8000000000000114 + 291.6000000000000227 + -64.7999999999999972 + -61.5000000000000000 + 162.0000000000000000 + -121.5000000000000000 + 27.0000000000000000 + 8.1999999999999993 + -21.6000000000000014 + 16.1999999999999993 + -3.6000000000000001 + 329.4000000000000341 + -871.2000000000000455 + 653.3999999999999773 + -145.1999999999999886 + -442.8000000000000114 + 1166.4000000000000909 + -874.8000000000000682 + 194.4000000000000341 + 184.5000000000000000 + -486.0000000000000568 + 364.5000000000000000 + -81.0000000000000000 + -24.6000000000000014 + 64.8000000000000114 + -48.6000000000000085 + 10.8000000000000007 + -247.0499999999999829 + 653.4000000000000909 + -490.0499999999999545 + 108.9000000000000057 + 332.0999999999999659 + -874.8000000000000682 + 656.1000000000000227 + -145.8000000000000114 + -138.3750000000000000 + 364.5000000000000568 + -273.3750000000000000 + 60.7500000000000000 + 18.4499999999999993 + -48.6000000000000085 + 36.4500000000000028 + -8.0999999999999996 + 54.8999999999999986 + -145.1999999999999886 + 108.9000000000000057 + -24.1999999999999993 + -73.7999999999999972 + 194.4000000000000341 + -145.8000000000000114 + 32.3999999999999986 + 30.7500000000000000 + -81.0000000000000000 + 60.7500000000000000 + -13.5000000000000000 + -4.0999999999999996 + 10.8000000000000007 + -8.0999999999999996 + 1.7999999999999998 + -13.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 18.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 39.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -54.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 22.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -29.2500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 40.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -16.8750000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -9.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.7500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1947.2000000000000455 + -1742.3999999999998636 + 508.1999999999999318 + -48.3999999999999986 + -2606.4000000000005457 + 2332.8000000000001819 + -680.3999999999999773 + 64.8000000000000114 + 1086.0000000000000000 + -972.0000000000001137 + 283.5000000000000000 + -27.0000000000000036 + -144.8000000000000114 + 129.5999999999999943 + -37.7999999999999972 + 3.6000000000000005 + -5841.6000000000003638 + 5227.2000000000007276 + -1524.5999999999999091 + 145.1999999999999886 + 7819.2000000000007276 + -6998.4000000000005457 + 2041.2000000000002728 + -194.4000000000000341 + -3258.0000000000004547 + 2916.0000000000004547 + -850.5000000000000000 + 81.0000000000000142 + 434.4000000000000341 + -388.8000000000000114 + 113.4000000000000057 + -10.8000000000000007 + 4381.2000000000007276 + -3920.4000000000005457 + 1143.4500000000000455 + -108.9000000000000057 + -5864.4000000000014552 + 5248.8000000000001819 + -1530.9000000000000909 + 145.8000000000000114 + 2443.5000000000004547 + -2187.0000000000004547 + 637.8750000000000000 + -60.7500000000000142 + -325.8000000000000114 + 291.6000000000000227 + -85.0500000000000114 + 8.1000000000000014 + -973.5999999999999091 + 871.2000000000000455 + -254.0999999999999943 + 24.2000000000000028 + 1303.2000000000000455 + -1166.4000000000000909 + 340.2000000000000455 + -32.4000000000000057 + -543.0000000000000000 + 486.0000000000000568 + -141.7500000000000000 + 13.5000000000000000 + 72.4000000000000057 + -64.8000000000000114 + 18.8999999999999986 + -1.8000000000000000 + 11.1999999999999993 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000014 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000036 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.1999999999999993 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000014 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000036 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.1999999999999993 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000014 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000036 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.1999999999999993 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000014 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000036 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.1999999999999993 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000014 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000036 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.2000000000000002 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.6000000000000005 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.7000000000000002 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6000000000000001 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.8999999999999998 + -1.1999999999999997 + 0.8999999999999996 + -0.1999999999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.6999999999999993 + 3.5999999999999988 + -2.6999999999999988 + 0.5999999999999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.0249999999999995 + -2.6999999999999988 + 2.0249999999999995 + -0.4499999999999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4499999999999999 + 0.5999999999999998 + -0.4499999999999998 + 0.1000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.1250000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5999999999999961 + 7.1999999999999966 + -2.0999999999999992 + 0.1999999999999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 22.7999999999999901 + -21.5999999999999908 + 6.2999999999999972 + -0.5999999999999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.0999999999999943 + 16.1999999999999922 + -4.7249999999999979 + 0.4499999999999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.7999999999999985 + -3.5999999999999988 + 1.0499999999999998 + -0.1000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -25.2000000000000028 + 16.8000000000000007 + 0.0000000000000000 + 0.0000000000000000 + 16.8000000000000007 + -11.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 32.4000000000000057 + -21.6000000000000014 + 0.0000000000000000 + 0.0000000000000000 + -21.6000000000000014 + 14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.5000000000000000 + 9.0000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 9.0000000000000018 + -6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.8000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 82.3499999999999943 + -217.8000000000000114 + 163.3499999999999943 + -36.2999999999999972 + -54.8999999999999986 + 145.1999999999999886 + -108.9000000000000057 + 24.1999999999999993 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -110.6999999999999886 + 291.6000000000000227 + -218.6999999999999886 + 48.6000000000000085 + 73.7999999999999972 + -194.4000000000000341 + 145.8000000000000114 + -32.3999999999999986 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 46.1250000000000000 + -121.5000000000000000 + 91.1250000000000000 + -20.2500000000000036 + -30.7500000000000000 + 81.0000000000000000 + -60.7500000000000000 + 13.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -6.1500000000000004 + 16.2000000000000028 + -12.1500000000000021 + 2.7000000000000002 + 4.0999999999999996 + -10.8000000000000007 + 8.0999999999999996 + -1.7999999999999998 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 9.7500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -6.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -13.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 9.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.6250000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.7500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.7500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1460.4000000000000909 + 1306.8000000000001819 + -381.1499999999999773 + 36.2999999999999972 + 973.5999999999999091 + -871.2000000000000455 + 254.0999999999999943 + -24.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1954.8000000000001819 + -1749.6000000000001364 + 510.3000000000000114 + -48.6000000000000085 + -1303.2000000000000455 + 1166.4000000000000909 + -340.2000000000000455 + 32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -814.5000000000001137 + 729.0000000000001137 + -212.6250000000000000 + 20.2500000000000036 + 543.0000000000000000 + -486.0000000000000568 + 141.7500000000000000 + -13.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 108.5999999999999943 + -97.2000000000000028 + 28.3500000000000014 + -2.7000000000000002 + -72.4000000000000057 + 64.8000000000000114 + -18.8999999999999986 + 1.8000000000000000 + 21.4975431383220581 + -14.6574157761286745 + 3.2979185496289514 + -0.2442902629354779 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -72.8926294149661658 + 43.9722473283860253 + -9.8937556488868559 + 0.7328707888064337 + 48.5950862766441105 + -29.3148315522573526 + 6.5958370992579045 + -0.4885805258709559 + -28.6633908510960751 + 19.5432210348382327 + -4.3972247328386018 + 0.3257203505806372 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 96.7901725532882438 + -58.6296631045147052 + 13.1916741985158090 + -0.9771610517419118 + -64.5267817021921530 + 39.0864420696764654 + -8.7944494656772036 + 0.6514407011612744 + 11.9430795212900307 + -8.1430087645159297 + 1.8321769720160841 + -0.1357168127419322 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -40.3292385638700992 + 24.4290262935477962 + -5.4965309160482541 + 0.4071504382257967 + 26.8861590425800614 + -16.2860175290318594 + 3.6643539440321682 + -0.2714336254838643 + -1.5924106028386709 + 1.0857345019354574 + -0.2442902629354779 + 0.0180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.3772318085160133 + -3.2572035058063733 + 0.7328707888064341 + -0.0542867250967729 + -3.5848212056773412 + 2.1714690038709143 + -0.4885805258709557 + 0.0361911500645152 + 0.1221451314677389 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.7664353944032172 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.8442902629354787 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1628601752903186 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2885805258709571 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5257203505806380 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0678584063709661 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.7035752191128983 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1357168127419324 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1221451314677389 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.7664353944032172 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.8442902629354787 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1628601752903186 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2885805258709571 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5257203505806380 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0678584063709661 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.7035752191128983 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1357168127419324 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1221451314677389 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.7664353944032172 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.8442902629354787 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1628601752903186 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2885805258709571 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5257203505806380 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0678584063709661 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.7035752191128983 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1357168127419324 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.1221451314677389 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -8.7664353944032172 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.8442902629354787 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.1628601752903186 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2885805258709571 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5257203505806380 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0678584063709661 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.7035752191128983 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.1357168127419324 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.0090477875161288 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.6271433625483865 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.4180955750322576 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 33.6000000000000014 + -22.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + -100.8000000000000114 + 67.2000000000000171 + 0.0000000000000000 + 0.0000000000000000 + 75.6000000000000085 + -50.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + -16.8000000000000007 + 11.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + -43.2000000000000028 + 28.8000000000000043 + 0.0000000000000000 + 0.0000000000000000 + 129.6000000000000227 + -86.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + -97.2000000000000171 + 64.8000000000000114 + 0.0000000000000000 + 0.0000000000000000 + 21.6000000000000014 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 18.0000000000000000 + -12.0000000000000018 + 0.0000000000000000 + 0.0000000000000000 + -54.0000000000000071 + 36.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 40.5000000000000000 + -27.0000000000000036 + 0.0000000000000000 + 0.0000000000000000 + -9.0000000000000018 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + -2.4000000000000004 + 1.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + -4.8000000000000007 + 0.0000000000000000 + 0.0000000000000000 + -5.4000000000000004 + 3.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 1.2000000000000002 + -0.8000000000000000 + -109.7999999999999829 + 290.3999999999999773 + -217.7999999999999829 + 48.3999999999999986 + 329.4000000000000341 + -871.2000000000000455 + 653.4000000000000909 + -145.1999999999999886 + -247.0499999999999829 + 653.4000000000000909 + -490.0499999999999545 + 108.9000000000000057 + 54.8999999999999986 + -145.1999999999999886 + 108.9000000000000057 + -24.1999999999999993 + 147.5999999999999943 + -388.8000000000000114 + 291.6000000000000227 + -64.8000000000000114 + -442.8000000000000114 + 1166.4000000000000909 + -874.8000000000000682 + 194.4000000000000341 + 332.0999999999999659 + -874.8000000000000682 + 656.1000000000000227 + -145.8000000000000114 + -73.7999999999999972 + 194.4000000000000341 + -145.8000000000000114 + 32.3999999999999986 + -61.4999999999999929 + 162.0000000000000284 + -121.5000000000000000 + 27.0000000000000000 + 184.5000000000000000 + -486.0000000000000568 + 364.5000000000000000 + -81.0000000000000000 + -138.3750000000000000 + 364.5000000000000568 + -273.3750000000000000 + 60.7500000000000000 + 30.7500000000000000 + -81.0000000000000000 + 60.7500000000000000 + -13.5000000000000000 + 8.1999999999999993 + -21.6000000000000014 + 16.1999999999999993 + -3.6000000000000001 + -24.6000000000000014 + 64.8000000000000114 + -48.6000000000000085 + 10.8000000000000007 + 18.4499999999999993 + -48.6000000000000085 + 36.4500000000000028 + -8.0999999999999996 + -4.0999999999999996 + 10.8000000000000007 + -8.0999999999999996 + 1.7999999999999998 + -13.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 39.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -29.2500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 18.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -54.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 40.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -9.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 22.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -16.8750000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.7500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1947.2000000000000455 + -1742.3999999999998636 + 508.2000000000000455 + -48.3999999999999986 + -5841.6000000000003638 + 5227.2000000000007276 + -1524.5999999999999091 + 145.1999999999999886 + 4381.2000000000007276 + -3920.4000000000000909 + 1143.4500000000000455 + -108.9000000000000199 + -973.5999999999999091 + 871.2000000000000455 + -254.0999999999999943 + 24.2000000000000028 + -2606.4000000000005457 + 2332.8000000000001819 + -680.3999999999999773 + 64.8000000000000114 + 7819.2000000000007276 + -6998.4000000000005457 + 2041.2000000000000455 + -194.4000000000000341 + -5864.4000000000014552 + 5248.8000000000001819 + -1530.9000000000000909 + 145.8000000000000114 + 1303.2000000000000455 + -1166.4000000000000909 + 340.2000000000000455 + -32.4000000000000057 + 1086.0000000000000000 + -972.0000000000001137 + 283.5000000000000000 + -27.0000000000000036 + -3258.0000000000004547 + 2916.0000000000004547 + -850.5000000000000000 + 81.0000000000000142 + 2443.5000000000004547 + -2187.0000000000004547 + 637.8750000000000000 + -60.7500000000000142 + -543.0000000000000000 + 486.0000000000000568 + -141.7500000000000000 + 13.5000000000000000 + -144.8000000000000114 + 129.5999999999999943 + -37.7999999999999972 + 3.6000000000000005 + 434.4000000000000341 + -388.8000000000000114 + 113.4000000000000057 + -10.8000000000000007 + -325.8000000000000114 + 291.6000000000000227 + -85.0500000000000114 + 8.1000000000000014 + 72.4000000000000057 + -64.8000000000000114 + 18.8999999999999986 + -1.8000000000000000 + 11.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000085 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000085 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000085 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000085 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 11.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -33.6000000000000085 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 25.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -5.6000000000000005 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -14.4000000000000021 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 43.2000000000000028 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -32.4000000000000057 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 7.2000000000000011 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 6.0000000000000009 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -18.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.5000000000000018 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.0000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.9000000000000000 + 0.6000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.6000000000000001 + -0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.6749999999999999 + 0.8999999999999997 + -0.6749999999999997 + 0.1499999999999999 + 0.4499999999999999 + -0.5999999999999998 + 0.4499999999999998 + -0.1000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3750000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.6999999999999975 + -5.3999999999999968 + 1.5749999999999993 + -0.1499999999999999 + -3.7999999999999985 + 3.5999999999999988 + -1.0499999999999998 + 0.1000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.3000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.2000000000000002 + -0.8000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -3.6000000000000005 + 2.4000000000000004 + 0.0000000000000000 + 0.0000000000000000 + 2.7000000000000002 + -1.8000000000000003 + 0.0000000000000000 + 0.0000000000000000 + -0.6000000000000001 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.8999999999999998 + -1.1999999999999997 + 0.8999999999999996 + -0.1999999999999999 + -2.6999999999999993 + 3.5999999999999988 + -2.6999999999999988 + 0.5999999999999998 + 2.0249999999999995 + -2.6999999999999988 + 2.0249999999999995 + -0.4499999999999998 + -0.4499999999999999 + 0.5999999999999998 + -0.4499999999999998 + 0.1000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.5000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 1.1250000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2500000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -7.5999999999999961 + 7.1999999999999966 + -2.0999999999999992 + 0.1999999999999999 + 22.7999999999999901 + -21.5999999999999908 + 6.2999999999999972 + -0.5999999999999998 + -17.0999999999999943 + 16.1999999999999922 + -4.7249999999999979 + 0.4499999999999998 + 3.7999999999999985 + -3.5999999999999988 + 1.0499999999999998 + -0.1000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.4000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -1.2000000000000002 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.9000000000000001 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -0.2000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + +# piHH + +6 +0.0 +4.0 +0.0 +4.0 +0.0 +9.0 + + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 3.3727308659999999 + -2.2484872439999997 + 0.0000000000000000 + 0.0000000000000000 + -2.2484872439999997 + 1.4989914959999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.2484872439999997 + 1.4989914959999999 + 0.0000000000000000 + 0.0000000000000000 + 1.4989914959999999 + -0.9993276639999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4969744879999993 + 13.4909234639999980 + -10.1181925979999985 + 2.2484872439999997 + 2.9979829919999998 + -8.9939489759999987 + 6.7454617319999990 + -1.4989914959999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.9979829919999998 + -8.9939489759999987 + 6.7454617319999990 + -1.4989914959999999 + -1.9986553279999999 + 5.9959659839999997 + -4.4969744879999993 + 0.9993276639999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4969744879999993 + 2.9979829919999998 + 0.0000000000000000 + 0.0000000000000000 + 13.4909234639999980 + -8.9939489759999987 + 0.0000000000000000 + 0.0000000000000000 + -10.1181925979999985 + 6.7454617319999990 + 0.0000000000000000 + 0.0000000000000000 + 2.2484872439999997 + -1.4989914959999999 + 0.0000000000000000 + 0.0000000000000000 + 2.9979829919999998 + -1.9986553279999999 + 0.0000000000000000 + 0.0000000000000000 + -8.9939489759999987 + 5.9959659839999997 + 0.0000000000000000 + 0.0000000000000000 + 6.7454617319999990 + -4.4969744879999993 + 0.0000000000000000 + 0.0000000000000000 + -1.4989914959999999 + 0.9993276639999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.9959659839999997 + -17.9878979519999973 + 13.4909234639999980 + -2.9979829919999998 + -17.9878979519999973 + 53.9636938559999919 + -40.4727703919999939 + 8.9939489759999987 + 13.4909234639999980 + -40.4727703919999939 + 30.3545777939999937 + -6.7454617319999990 + -2.9979829919999998 + 8.9939489759999987 + -6.7454617319999990 + 1.4989914959999999 + -3.9973106559999998 + 11.9919319679999994 + -8.9939489759999987 + 1.9986553279999999 + 11.9919319679999994 + -35.9757959039999946 + 26.9818469279999960 + -5.9959659839999997 + -8.9939489759999987 + 26.9818469279999960 + -20.2363851959999970 + 4.4969744879999993 + 1.9986553279999999 + -5.9959659839999997 + 4.4969744879999993 + -0.9993276639999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -4.4969744879999993 + 2.9979829919999998 + 0.0000000000000000 + 0.0000000000000000 + 2.9979829919999998 + -1.9986553279999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.4909234639999980 + -8.9939489759999987 + 0.0000000000000000 + 0.0000000000000000 + -8.9939489759999987 + 5.9959659839999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -10.1181925979999985 + 6.7454617319999990 + 0.0000000000000000 + 0.0000000000000000 + 6.7454617319999990 + -4.4969744879999993 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 2.2484872439999997 + -1.4989914959999999 + 0.0000000000000000 + 0.0000000000000000 + -1.4989914959999999 + 0.9993276639999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.9959659839999997 + -17.9878979519999973 + 13.4909234639999980 + -2.9979829919999998 + -3.9973106559999998 + 11.9919319679999994 + -8.9939489759999987 + 1.9986553279999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -17.9878979519999973 + 53.9636938559999919 + -40.4727703919999939 + 8.9939489759999987 + 11.9919319679999994 + -35.9757959039999946 + 26.9818469279999960 + -5.9959659839999997 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 13.4909234639999980 + -40.4727703919999939 + 30.3545777939999937 + -6.7454617319999990 + -8.9939489759999987 + 26.9818469279999960 + -20.2363851959999970 + 4.4969744879999993 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + -2.9979829919999998 + 8.9939489759999987 + -6.7454617319999990 + 1.4989914959999999 + 1.9986553279999999 + -5.9959659839999997 + 4.4969744879999993 + -0.9993276639999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 5.9959659839999997 + -3.9973106559999998 + 0.0000000000000000 + 0.0000000000000000 + -17.9878979519999973 + 11.9919319679999994 + 0.0000000000000000 + 0.0000000000000000 + 13.4909234639999980 + -8.9939489759999987 + 0.0000000000000000 + 0.0000000000000000 + -2.9979829919999998 + 1.9986553279999999 + 0.0000000000000000 + 0.0000000000000000 + -17.9878979519999973 + 11.9919319679999994 + 0.0000000000000000 + 0.0000000000000000 + 53.9636938559999919 + -35.9757959039999946 + 0.0000000000000000 + 0.0000000000000000 + -40.4727703919999939 + 26.9818469279999960 + 0.0000000000000000 + 0.0000000000000000 + 8.9939489759999987 + -5.9959659839999997 + 0.0000000000000000 + 0.0000000000000000 + 13.4909234639999980 + -8.9939489759999987 + 0.0000000000000000 + 0.0000000000000000 + -40.4727703919999939 + 26.9818469279999960 + 0.0000000000000000 + 0.0000000000000000 + 30.3545777939999937 + -20.2363851959999970 + 0.0000000000000000 + 0.0000000000000000 + -6.7454617319999990 + 4.4969744879999993 + 0.0000000000000000 + 0.0000000000000000 + -2.9979829919999998 + 1.9986553279999999 + 0.0000000000000000 + 0.0000000000000000 + 8.9939489759999987 + -5.9959659839999997 + 0.0000000000000000 + 0.0000000000000000 + -6.7454617319999990 + 4.4969744879999993 + 0.0000000000000000 + 0.0000000000000000 + 1.4989914959999999 + -0.9993276639999999 + -7.9946213120000005 + 23.9838639359999988 + -17.9878979519999973 + 3.9973106559999998 + 23.9838639359999988 + -71.9515918079999892 + 53.9636938559999919 + -11.9919319679999994 + -17.9878979519999973 + 53.9636938559999919 + -40.4727703919999939 + 8.9939489759999987 + 3.9973106559999998 + -11.9919319679999994 + 8.9939489759999987 + -1.9986553279999999 + 23.9838639359999988 + -71.9515918079999892 + 53.9636938559999919 + -11.9919319679999994 + -71.9515918079999892 + 215.8547754239999108 + -161.8910815680000042 + 35.9757959039999946 + 53.9636938559999919 + -161.8910815679999473 + 121.4183111759999605 + -26.9818469279999960 + -11.9919319679999994 + 35.9757959039999946 + -26.9818469279999960 + 5.9959659839999997 + -17.9878979519999973 + 53.9636938559999919 + -40.4727703919999939 + 8.9939489759999987 + 53.9636938559999919 + -161.8910815679999473 + 121.4183111759999889 + -26.9818469279999960 + -40.4727703919999939 + 121.4183111759999747 + -91.0637333819999810 + 20.2363851959999970 + 8.9939489759999987 + -26.9818469279999960 + 20.2363851959999970 + -4.4969744879999993 + 3.9973106559999998 + -11.9919319679999994 + 8.9939489759999987 + -1.9986553279999999 + -11.9919319679999994 + 35.9757959039999946 + -26.9818469279999960 + 5.9959659839999997 + 8.9939489759999987 + -26.9818469279999960 + 20.2363851959999970 + -4.4969744879999993 + -1.9986553279999999 + 5.9959659839999997 + -4.4969744879999993 + 0.9993276639999999 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + 0.0000000000000000 + +# Tij + +6 +0.0 +4.0 +0.0 +4.0 +0.0 +9.0 + + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -2.6355000000 + 1.7570000000 + 0.0000000000 + 0.0000000000 + 6.3252000000 + -4.2168000000 + 0.0000000000 + 0.0000000000 + -4.7439000000 + 3.1626000000 + 0.0000000000 + 0.0000000000 + 1.0542000000 + -0.7028000000 + 0.0000000000 + 0.0000000000 + 6.3252000000 + -4.2168000000 + 0.0000000000 + 0.0000000000 + -15.1804800000 + 10.1203200000 + 0.0000000000 + 0.0000000000 + 11.3853600000 + -7.5902400000 + 0.0000000000 + 0.0000000000 + -2.5300800000 + 1.6867200000 + 0.0000000000 + 0.0000000000 + -4.7439000000 + 3.1626000000 + 0.0000000000 + 0.0000000000 + 11.3853600000 + -7.5902400000 + 0.0000000000 + 0.0000000000 + -8.5390200000 + 5.6926800000 + 0.0000000000 + 0.0000000000 + 1.8975600000 + -1.2650400000 + 0.0000000000 + 0.0000000000 + 1.0542000000 + -0.7028000000 + 0.0000000000 + 0.0000000000 + -2.5300800000 + 1.6867200000 + 0.0000000000 + 0.0000000000 + 1.8975600000 + -1.2650400000 + 0.0000000000 + 0.0000000000 + -0.4216800000 + 0.2811200000 + 3.0080000000 + -9.3276000000 + 6.9957000000 + -1.5546000000 + -7.2192000000 + 22.3862400000 + -16.7896800000 + 3.7310400000 + 5.4144000000 + -16.7896800000 + 12.5922600000 + -2.7982800000 + -1.2032000000 + 3.7310400000 + -2.7982800000 + 0.6218400000 + -7.2192000000 + 22.3862400000 + -16.7896800000 + 3.7310400000 + 17.3260800000 + -53.7269760000 + 40.2952320000 + -8.9544960000 + -12.9945600000 + 40.2952320000 + -30.2214240000 + 6.7158720000 + 2.8876800000 + -8.9544960000 + 6.7158720000 + -1.4924160000 + 5.4144000000 + -16.7896800000 + 12.5922600000 + -2.7982800000 + -12.9945600000 + 40.2952320000 + -30.2214240000 + 6.7158720000 + 9.7459200000 + -30.2214240000 + 22.6660680000 + -5.0369040000 + -2.1657600000 + 6.7158720000 + -5.0369040000 + 1.1193120000 + -1.2032000000 + 3.7310400000 + -2.7982800000 + 0.6218400000 + 2.8876800000 + -8.9544960000 + 6.7158720000 + -1.4924160000 + -2.1657600000 + 6.7158720000 + -5.0369040000 + 1.1193120000 + 0.4812800000 + -1.4924160000 + 1.1193120000 + -0.2487360000 + -0.1012000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.5829120000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.3278880000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1012000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.5829120000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.3278880000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1012000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.5829120000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.3278880000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1012000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.5829120000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.3278880000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1012000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.5829120000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.3278880000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1012000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.5829120000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.3278880000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1012000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2428800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.5829120000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1821600000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.4371840000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.3278880000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 14.2317000000 + -9.4878000000 + 0.0000000000 + 0.0000000000 + -18.9756000000 + 12.6504000000 + 0.0000000000 + 0.0000000000 + 7.9065000000 + -5.2710000000 + 0.0000000000 + 0.0000000000 + -1.0542000000 + 0.7028000000 + 0.0000000000 + 0.0000000000 + -34.1560800000 + 22.7707200000 + 0.0000000000 + 0.0000000000 + 45.5414400000 + -30.3609600000 + 0.0000000000 + 0.0000000000 + -18.9756000000 + 12.6504000000 + 0.0000000000 + 0.0000000000 + 2.5300800000 + -1.6867200000 + 0.0000000000 + 0.0000000000 + 25.6170600000 + -17.0780400000 + 0.0000000000 + 0.0000000000 + -34.1560800000 + 22.7707200000 + 0.0000000000 + 0.0000000000 + 14.2317000000 + -9.4878000000 + 0.0000000000 + 0.0000000000 + -1.8975600000 + 1.2650400000 + 0.0000000000 + 0.0000000000 + -5.6926800000 + 3.7951200000 + 0.0000000000 + 0.0000000000 + 7.5902400000 + -5.0601600000 + 0.0000000000 + 0.0000000000 + -3.1626000000 + 2.1084000000 + 0.0000000000 + 0.0000000000 + 0.4216800000 + -0.2811200000 + -16.2432000000 + 50.3690400000 + -37.7767800000 + 8.3948400000 + 21.6576000000 + -67.1587200000 + 50.3690400000 + -11.1931200000 + -9.0240000000 + 27.9828000000 + -20.9871000000 + 4.6638000000 + 1.2032000000 + -3.7310400000 + 2.7982800000 + -0.6218400000 + 38.9836800000 + -120.8856960000 + 90.6642720000 + -20.1476160000 + -51.9782400000 + 161.1809280000 + -120.8856960000 + 26.8634880000 + 21.6576000000 + -67.1587200000 + 50.3690400000 + -11.1931200000 + -2.8876800000 + 8.9544960000 + -6.7158720000 + 1.4924160000 + -29.2377600000 + 90.6642720000 + -67.9982040000 + 15.1107120000 + 38.9836800000 + -120.8856960000 + 90.6642720000 + -20.1476160000 + -16.2432000000 + 50.3690400000 + -37.7767800000 + 8.3948400000 + 2.1657600000 + -6.7158720000 + 5.0369040000 + -1.1193120000 + 6.4972800000 + -20.1476160000 + 15.1107120000 + -3.3579360000 + -8.6630400000 + 26.8634880000 + -20.1476160000 + 4.4772480000 + 3.6096000000 + -11.1931200000 + 8.3948400000 + -1.8655200000 + -0.4812800000 + 1.4924160000 + -1.1193120000 + 0.2487360000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 14.2317000000 + -9.4878000000 + 0.0000000000 + 0.0000000000 + -34.1560800000 + 22.7707200000 + 0.0000000000 + 0.0000000000 + 25.6170600000 + -17.0780400000 + 0.0000000000 + 0.0000000000 + -5.6926800000 + 3.7951200000 + 0.0000000000 + 0.0000000000 + -18.9756000000 + 12.6504000000 + 0.0000000000 + 0.0000000000 + 45.5414400000 + -30.3609600000 + 0.0000000000 + 0.0000000000 + -34.1560800000 + 22.7707200000 + 0.0000000000 + 0.0000000000 + 7.5902400000 + -5.0601600000 + 0.0000000000 + 0.0000000000 + 7.9065000000 + -5.2710000000 + 0.0000000000 + 0.0000000000 + -18.9756000000 + 12.6504000000 + 0.0000000000 + 0.0000000000 + 14.2317000000 + -9.4878000000 + 0.0000000000 + 0.0000000000 + -3.1626000000 + 2.1084000000 + 0.0000000000 + 0.0000000000 + -1.0542000000 + 0.7028000000 + 0.0000000000 + 0.0000000000 + 2.5300800000 + -1.6867200000 + 0.0000000000 + 0.0000000000 + -1.8975600000 + 1.2650400000 + 0.0000000000 + 0.0000000000 + 0.4216800000 + -0.2811200000 + -16.2432000000 + 50.3690400000 + -37.7767800000 + 8.3948400000 + 38.9836800000 + -120.8856960000 + 90.6642720000 + -20.1476160000 + -29.2377600000 + 90.6642720000 + -67.9982040000 + 15.1107120000 + 6.4972800000 + -20.1476160000 + 15.1107120000 + -3.3579360000 + 21.6576000000 + -67.1587200000 + 50.3690400000 + -11.1931200000 + -51.9782400000 + 161.1809280000 + -120.8856960000 + 26.8634880000 + 38.9836800000 + -120.8856960000 + 90.6642720000 + -20.1476160000 + -8.6630400000 + 26.8634880000 + -20.1476160000 + 4.4772480000 + -9.0240000000 + 27.9828000000 + -20.9871000000 + 4.6638000000 + 21.6576000000 + -67.1587200000 + 50.3690400000 + -11.1931200000 + -16.2432000000 + 50.3690400000 + -37.7767800000 + 8.3948400000 + 3.6096000000 + -11.1931200000 + 8.3948400000 + -1.8655200000 + 1.2032000000 + -3.7310400000 + 2.7982800000 + -0.6218400000 + -2.8876800000 + 8.9544960000 + -6.7158720000 + 1.4924160000 + 2.1657600000 + -6.7158720000 + 5.0369040000 + -1.1193120000 + -0.4812800000 + 1.4924160000 + -1.1193120000 + 0.2487360000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.9836640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 1.7487360000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.3115520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.3036000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.7286400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.5464800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0404800000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0971520000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0728640000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -76.8511800000 + 51.2341200000 + 0.0000000000 + 0.0000000000 + 102.4682400000 + -68.3121600000 + 0.0000000000 + 0.0000000000 + -42.6951000000 + 28.4634000000 + 0.0000000000 + 0.0000000000 + 5.6926800000 + -3.7951200000 + 0.0000000000 + 0.0000000000 + 102.4682400000 + -68.3121600000 + 0.0000000000 + 0.0000000000 + -136.6243200000 + 91.0828800000 + 0.0000000000 + 0.0000000000 + 56.9268000000 + -37.9512000000 + 0.0000000000 + 0.0000000000 + -7.5902400000 + 5.0601600000 + 0.0000000000 + 0.0000000000 + -42.6951000000 + 28.4634000000 + 0.0000000000 + 0.0000000000 + 56.9268000000 + -37.9512000000 + 0.0000000000 + 0.0000000000 + -23.7195000000 + 15.8130000000 + 0.0000000000 + 0.0000000000 + 3.1626000000 + -2.1084000000 + 0.0000000000 + 0.0000000000 + 5.6926800000 + -3.7951200000 + 0.0000000000 + 0.0000000000 + -7.5902400000 + 5.0601600000 + 0.0000000000 + 0.0000000000 + 3.1626000000 + -2.1084000000 + 0.0000000000 + 0.0000000000 + -0.4216800000 + 0.2811200000 + 87.7132800000 + -271.9928159999 + 203.9946120000 + -45.3321360000 + -116.9510400000 + 362.6570879999 + -271.9928159999 + 60.4428480000 + 48.7296000000 + -151.1071200000 + 113.3303400000 + -25.1845200000 + -6.4972800000 + 20.1476160000 + -15.1107120000 + 3.3579360000 + -116.9510400000 + 362.6570880000 + -271.9928160000 + 60.4428480000 + 155.9347200000 + -483.5427840000 + 362.6570880000 + -80.5904640000 + -64.9728000000 + 201.4761600000 + -151.1071200000 + 33.5793600000 + 8.6630400000 + -26.8634880000 + 20.1476160000 + -4.4772480000 + 48.7296000000 + -151.1071200000 + 113.3303400000 + -25.1845200000 + -64.9728000000 + 201.4761600000 + -151.1071200000 + 33.5793600000 + 27.0720000000 + -83.9484000000 + 62.9613000000 + -13.9914000000 + -3.6096000000 + 11.1931200000 + -8.3948400000 + 1.8655200000 + -6.4972800000 + 20.1476160000 + -15.1107120000 + 3.3579360000 + 8.6630400000 + -26.8634880000 + 20.1476160000 + -4.4772480000 + -3.6096000000 + 11.1931200000 + -8.3948400000 + 1.8655200000 + 0.4812800000 + -1.4924160000 + 1.1193120000 + -0.2487360000 + -2.9509920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -5.2462080000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.9108000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -2.9509920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -5.2462080000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.9108000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -2.9509920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -5.2462080000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.9108000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -2.9509920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -5.2462080000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.9108000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -2.9509920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -5.2462080000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.9108000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -2.9509920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -5.2462080000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.9108000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -2.9509920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 3.9346560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -5.2462080000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -1.6394400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 2.1859200000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.9108000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.2185920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.2914560000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.1214400000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + -0.0161920000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 + 0.0000000000 diff --git a/src/MANYBODY/pair_rebo.cpp b/src/MANYBODY/pair_rebo.cpp index 1f31c0b0cd..10d1d83579 100644 --- a/src/MANYBODY/pair_rebo.cpp +++ b/src/MANYBODY/pair_rebo.cpp @@ -30,9 +30,263 @@ void PairREBO::settings(int narg, char **/*arg*/) cutlj = 0.0; ljflag = torflag = 0; - - // this one parameter for C-C interactions is different in REBO vs AIREBO - // see Favata, Micheletti, Ryu, Pugno, Comp Phys Comm (2016) - - PCCf_2_0 = 0.0; + PCCf_2_0 = -0.0276030; +} + +/* ---------------------------------------------------------------------- + initialize spline knot values +------------------------------------------------------------------------- */ + +void PairREBO::spline_init() +{ + int i,j,k; + + for (i = 0; i < 5; i++) { + for (j = 0; j < 5; j++) { + PCCf[i][j] = 0.0; + PCCdfdx[i][j] = 0.0; + PCCdfdy[i][j] = 0.0; + PCHf[i][j] = 0.0; + PCHdfdx[i][j] = 0.0; + PCHdfdy[i][j] = 0.0; + } + } + + PCCf[0][2] = 0.007860700254745; + PCCf[0][3] = 0.016125364564267; + PCCf[1][1] = 0.003026697473481; + PCCf[1][2] = 0.006326248241119; + PCCf[2][0] = 0.; + PCCf[2][1] = 0.003179530830731; + + PCHf[0][1] = 0.2093367328250380; + PCHf[0][2] = -0.064449615432525; + PCHf[0][3] = -0.303927546346162; + PCHf[1][0] = 0.010; + PCHf[1][1] = -0.1251234006287090; + PCHf[1][2] = -0.298905245783; + PCHf[2][0] = -0.1220421462782555; + PCHf[2][1] = -0.3005291724067579; + PCHf[3][0] = -0.307584705066; + + for (int nH = 0; nH < 4; nH++) { + for (int nC = 0; nC < 4; nC++) { + double y[4] = {0}, y1[4] = {0}, y2[4] = {0}; + y[0] = PCCf[nC][nH]; + y[1] = PCCf[nC][nH+1]; + y[2] = PCCf[nC+1][nH]; + y[3] = PCCf[nC+1][nH+1]; + Spbicubic_patch_coeffs(nC, nC+1, nH, nH+1, y, y1, y2, &pCC[nC][nH][0]); + y[0] = PCHf[nC][nH]; + y[1] = PCHf[nC][nH+1]; + y[2] = PCHf[nC+1][nH]; + y[3] = PCHf[nC+1][nH+1]; + Spbicubic_patch_coeffs(nC, nC+1, nH, nH+1, y, y1, y2, &pCH[nC][nH][0]); + } + } + + for (i = 0; i < 5; i++) { + for (j = 0; j < 5; j++) { + for (k = 0; k < 10; k++) { + piCCf[i][j][k] = 0.0; + piCCdfdx[i][j][k] = 0.0; + piCCdfdy[i][j][k] = 0.0; + piCCdfdz[i][j][k] = 0.0; + piCHf[i][j][k] = 0.0; + piCHdfdx[i][j][k] = 0.0; + piCHdfdy[i][j][k] = 0.0; + piCHdfdz[i][j][k] = 0.0; + piHHf[i][j][k] = 0.0; + piHHdfdx[i][j][k] = 0.0; + piHHdfdy[i][j][k] = 0.0; + piHHdfdz[i][j][k] = 0.0; + Tf[i][j][k] = 0.0; + Tdfdx[i][j][k] = 0.0; + Tdfdy[i][j][k] = 0.0; + Tdfdz[i][j][k] = 0.0; + } + } + } + + for (i = 3; i < 10; i++) piCCf[0][0][i] = 0.0049586079; + piCCf[1][0][1] = 0.021693495; + piCCf[0][1][1] = 0.021693495; + for (i = 2; i < 10; i++) piCCf[1][0][i] = 0.0049586079; + for (i = 2; i < 10; i++) piCCf[0][1][i] = 0.0049586079; + piCCf[1][1][1] = 0.05250; + piCCf[1][1][2] = -0.002088750; + for (i = 3; i < 10; i++) piCCf[1][1][i] = -0.00804280; + piCCf[2][0][1] = 0.024698831850; + piCCf[0][2][1] = 0.024698831850; + piCCf[2][0][2] = -0.00597133450; + piCCf[0][2][2] = -0.00597133450; + for (i = 3; i < 10; i++) piCCf[2][0][i] = 0.0049586079; + for (i = 3; i < 10; i++) piCCf[0][2][i] = 0.0049586079; + piCCf[2][1][1] = 0.00482478490; + piCCf[1][2][1] = 0.00482478490; + piCCf[2][1][2] = 0.0150; + piCCf[1][2][2] = 0.0150; + piCCf[2][1][3] = -0.010; + piCCf[1][2][3] = -0.010; + piCCf[2][1][4] = -0.01168893870; + piCCf[1][2][4] = -0.01168893870; + piCCf[2][1][5] = -0.013377877400; + piCCf[1][2][5] = -0.013377877400; + piCCf[2][1][6] = -0.015066816000; + piCCf[1][2][6] = -0.015066816000; + for (i = 7; i < 10; i++) piCCf[2][1][i] = -0.015066816000; + for (i = 7; i < 10; i++) piCCf[1][2][i] = -0.015066816000; + piCCf[2][2][1] = 0.0472247850; + piCCf[2][2][2] = 0.0110; + piCCf[2][2][3] = 0.0198529350; + piCCf[2][2][4] = 0.01654411250; + piCCf[2][2][5] = 0.013235290; + piCCf[2][2][6] = 0.00992646749999 ; + piCCf[2][2][7] = 0.006617644999; + piCCf[2][2][8] = 0.00330882250; + piCCf[3][0][1] = -0.05989946750; + piCCf[0][3][1] = -0.05989946750; + piCCf[3][0][2] = -0.05989946750; + piCCf[0][3][2] = -0.05989946750; + for (i = 3; i < 10; i++) piCCf[3][0][i] = 0.0049586079; + for (i = 3; i < 10; i++) piCCf[0][3][i] = 0.0049586079; + piCCf[3][1][2] = -0.0624183760; + piCCf[1][3][2] = -0.0624183760; + for (i = 3; i < 10; i++) piCCf[3][1][i] = -0.0624183760; + for (i = 3; i < 10; i++) piCCf[1][3][i] = -0.0624183760; + piCCf[3][2][1] = -0.02235469150; + piCCf[2][3][1] = -0.02235469150; + for (i = 2; i < 10; i++) piCCf[3][2][i] = -0.02235469150; + for (i = 2; i < 10; i++) piCCf[2][3][i] = -0.02235469150; + + piCCdfdx[2][1][1] = -0.026250; + piCCdfdx[2][1][5] = -0.0271880; + piCCdfdx[2][1][6] = -0.0271880; + for (i = 7; i < 10; i++) piCCdfdx[2][1][i] = -0.0271880; + piCCdfdx[1][3][2] = 0.0187723882; + for (i = 2; i < 10; i++) piCCdfdx[2][3][i] = 0.031209; + + piCCdfdy[1][2][1] = -0.026250; + piCCdfdy[1][2][5] = -0.0271880; + piCCdfdy[1][2][6] = -0.0271880; + for (i = 7; i < 10; i++) piCCdfdy[1][2][i] = -0.0271880; + piCCdfdy[3][1][2] = 0.0187723882; + for (i = 2; i < 10; i++) piCCdfdy[3][2][i] = 0.031209; + + piCCdfdz[1][1][2] = -0.0302715; + piCCdfdz[2][1][4] = -0.0100220; + piCCdfdz[1][2][4] = -0.0100220; + piCCdfdz[2][1][5] = -0.0100220; + piCCdfdz[1][2][5] = -0.0100220; + for (i = 4; i < 9; i++) piCCdfdz[2][2][i] = -0.0033090; + + // make top end of piCC flat instead of zero + i = 4; + for (j = 0; j < 4; j++){ + for (k = 1; k < 11; k++){ + piCCf[i][j][k] = piCCf[i-1][j][k]; + } + } + for (i = 0; i < 4; i++){ // also enforces some symmetry + for (j = i+1; j < 5; j++){ + for (k = 1; k < 11; k++){ + piCCf[i][j][k] = piCCf[j][i][k]; + } + } + } + for (k = 1; k < 11; k++) piCCf[4][4][k] = piCCf[3][4][k]; + k = 10; + for (i = 0; i < 5; i++){ + for (j = 0; j < 5; j++){ + piCCf[i][j][k] = piCCf[i][j][k-1]; + } + } + + piCHf[1][1][1] = -0.050; + piCHf[1][1][2] = -0.050; + piCHf[1][1][3] = -0.30; + for (i = 4; i < 10; i++) piCHf[1][1][i] = -0.050; + for (i = 5; i < 10; i++) piCHf[2][0][i] = -0.004523893758064; + for (i = 5; i < 10; i++) piCHf[0][2][i] = -0.004523893758064; + piCHf[2][1][2] = -0.250; + piCHf[1][2][2] = -0.250; + piCHf[2][1][3] = -0.250; + piCHf[1][2][3] = -0.250; + piCHf[3][1][1] = -0.10; + piCHf[1][3][1] = -0.10; + piCHf[3][1][2] = -0.125; + piCHf[1][3][2] = -0.125; + piCHf[3][1][3] = -0.125; + piCHf[1][3][3] = -0.125; + for (i = 4; i < 10; i++) piCHf[3][1][i] = -0.10; + for (i = 4; i < 10; i++) piCHf[1][3][i] = -0.10; + + // make top end of piCH flat instead of zero + // also enforces some symmetry + + i = 4; + for (j = 0; j < 4; j++){ + for (k = 1; k < 11; k++){ + piCHf[i][j][k] = piCHf[i-1][j][k]; + } + } + for (i = 0; i < 4; i++){ + for (j = i+1; j < 5; j++){ + for (k = 1; k < 11; k++){ + piCHf[i][j][k] = piCHf[j][i][k]; + } + } + } + for (k = 1; k < 11; k++) piCHf[4][4][k] = piCHf[3][4][k]; + k = 10; + for (i = 0; i < 5; i++){ + for (j = 0; j < 5; j++){ + piCHf[i][j][k] = piCHf[i][j][k-1]; + } + } + + piHHf[1][1][1] = 0.124915958; + + Tf[2][2][1] = -0.035140; + for (i = 2; i < 10; i++) Tf[2][2][i] = -0.0040480; + + for (int nH = 0; nH < 4; nH++) { + for (int nC = 0; nC < 4; nC++) { + // Note: Spline knot values exist up to "10", but are never used because + // they are clamped down to 9. + for (int nConj = 0; nConj < 9; nConj++) { + double y[8] = {0}, y1[8] = {0}, y2[8] = {0}, y3[8] = {0}; + #define FILL_KNOTS_TRI(dest, src) \ + dest[0] = src[nC+0][nH+0][nConj+0]; \ + dest[1] = src[nC+0][nH+0][nConj+1]; \ + dest[2] = src[nC+0][nH+1][nConj+0]; \ + dest[3] = src[nC+0][nH+1][nConj+1]; \ + dest[4] = src[nC+1][nH+0][nConj+0]; \ + dest[5] = src[nC+1][nH+0][nConj+1]; \ + dest[6] = src[nC+1][nH+1][nConj+0]; \ + dest[7] = src[nC+1][nH+1][nConj+1]; + FILL_KNOTS_TRI(y, piCCf) + FILL_KNOTS_TRI(y1, piCCdfdx) + FILL_KNOTS_TRI(y2, piCCdfdy) + FILL_KNOTS_TRI(y3, piCCdfdz) + Sptricubic_patch_coeffs(nC, nC+1, nH, nH+1, nConj, nConj+1, y, y1, y2, y3, &piCC[nC][nH][nConj][0]); + FILL_KNOTS_TRI(y, piCHf) + FILL_KNOTS_TRI(y1, piCHdfdx) + FILL_KNOTS_TRI(y2, piCHdfdy) + FILL_KNOTS_TRI(y3, piCHdfdz) + Sptricubic_patch_coeffs(nC, nC+1, nH, nH+1, nConj, nConj+1, y, y1, y2, y3, &piCH[nC][nH][nConj][0]); + FILL_KNOTS_TRI(y, piHHf) + FILL_KNOTS_TRI(y1, piHHdfdx) + FILL_KNOTS_TRI(y2, piHHdfdy) + FILL_KNOTS_TRI(y3, piHHdfdz) + Sptricubic_patch_coeffs(nC, nC+1, nH, nH+1, nConj, nConj+1, y, y1, y2, y3, &piHH[nC][nH][nConj][0]); + FILL_KNOTS_TRI(y, Tf) + FILL_KNOTS_TRI(y1, Tdfdx) + FILL_KNOTS_TRI(y2, Tdfdy) + FILL_KNOTS_TRI(y3, Tdfdz) + Sptricubic_patch_coeffs(nC, nC+1, nH, nH+1, nConj, nConj+1, y, y1, y2, y3, &Tijc[nC][nH][nConj][0]); + #undef FILL_KNOTS_TRI + } + } + } } diff --git a/src/MANYBODY/pair_rebo.h b/src/MANYBODY/pair_rebo.h index be1e1f0b55..9c1a12d4de 100644 --- a/src/MANYBODY/pair_rebo.h +++ b/src/MANYBODY/pair_rebo.h @@ -28,6 +28,7 @@ class PairREBO : public PairAIREBO { public: PairREBO(class LAMMPS *); void settings(int, char **); + void spline_init(); }; } From 1235e77199eaffa29257b6ad8483cd7e98bf88b6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 9 Nov 2018 15:18:01 -0500 Subject: [PATCH 0065/1242] implemented recommended change to remove global class member --- src/MANYBODY/pair_airebo.cpp | 7 +------ src/MANYBODY/pair_airebo.h | 1 - src/MANYBODY/pair_rebo.cpp | 1 - 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index 067eb1634f..f2877647c0 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -168,10 +168,6 @@ void PairAIREBO::settings(int narg, char **arg) sigwid = sigcut - sigmin; } - // this one parameter for C-C interactions is different in AIREBO vs REBO - // see Favata, Micheletti, Ryu, Pugno, Comp Phys Comm (2016) - - PCCf_2_0 = -0.0276030; } /* ---------------------------------------------------------------------- @@ -4373,8 +4369,7 @@ void PairAIREBO::spline_init() // this one parameter for C-C interactions is different in REBO vs AIREBO // see Favata, Micheletti, Ryu, Pugno, Comp Phys Comm (2016) - PCCf[2][0] = PCCf_2_0; - + PCCf[2][0] = -0.0276030; PCCf[2][1] = 0.00317953083; PCHf[0][1] = 0.209336733; diff --git a/src/MANYBODY/pair_airebo.h b/src/MANYBODY/pair_airebo.h index c7c9b07357..579c342f1b 100644 --- a/src/MANYBODY/pair_airebo.h +++ b/src/MANYBODY/pair_airebo.h @@ -84,7 +84,6 @@ class PairAIREBO : public Pair { // spline knot values - double PCCf_2_0; double PCCf[5][5],PCCdfdx[5][5],PCCdfdy[5][5],PCHf[5][5]; double PCHdfdx[5][5],PCHdfdy[5][5]; double piCCf[5][5][11],piCCdfdx[5][5][11]; diff --git a/src/MANYBODY/pair_rebo.cpp b/src/MANYBODY/pair_rebo.cpp index 10d1d83579..5563e1222c 100644 --- a/src/MANYBODY/pair_rebo.cpp +++ b/src/MANYBODY/pair_rebo.cpp @@ -30,7 +30,6 @@ void PairREBO::settings(int narg, char **/*arg*/) cutlj = 0.0; ljflag = torflag = 0; - PCCf_2_0 = -0.0276030; } /* ---------------------------------------------------------------------- From dcffeb546fd297d5e5cc3af5b64fdfb48de9650b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Nov 2018 13:48:49 -0500 Subject: [PATCH 0066/1242] update AIREBO/REBO examples and provide references for rebo and airebo with LJ and TORSION turned off --- examples/airebo/in.airebo-0-0 | 22 +++++ examples/airebo/in.rebo2 | 22 +++++ examples/airebo/log.29Jun18.airebo-0-0.g++.1 | 88 +++++++++++++++++++ examples/airebo/log.29Jun18.airebo-0-0.g++.4 | 88 +++++++++++++++++++ ...ebo-m.g++.1 => log.29Jun18.airebo-m.g++.1} | 24 ++--- ...ebo-m.g++.4 => log.29Jun18.airebo-m.g++.4} | 24 ++--- ....airebo.g++.1 => log.29Jun18.airebo.g++.1} | 24 ++--- ....airebo.g++.4 => log.29Jun18.airebo.g++.4} | 24 ++--- examples/airebo/log.29Jun18.rebo2.g++.1 | 88 +++++++++++++++++++ examples/airebo/log.29Jun18.rebo2.g++.4 | 88 +++++++++++++++++++ 10 files changed, 448 insertions(+), 44 deletions(-) create mode 100644 examples/airebo/in.airebo-0-0 create mode 100644 examples/airebo/in.rebo2 create mode 100644 examples/airebo/log.29Jun18.airebo-0-0.g++.1 create mode 100644 examples/airebo/log.29Jun18.airebo-0-0.g++.4 rename examples/airebo/{log.23Jun17.airebo-m.g++.1 => log.29Jun18.airebo-m.g++.1} (78%) rename examples/airebo/{log.23Jun17.airebo-m.g++.4 => log.29Jun18.airebo-m.g++.4} (78%) rename examples/airebo/{log.23Jun17.airebo.g++.1 => log.29Jun18.airebo.g++.1} (78%) rename examples/airebo/{log.23Jun17.airebo.g++.4 => log.29Jun18.airebo.g++.4} (78%) create mode 100644 examples/airebo/log.29Jun18.rebo2.g++.1 create mode 100644 examples/airebo/log.29Jun18.rebo2.g++.4 diff --git a/examples/airebo/in.airebo-0-0 b/examples/airebo/in.airebo-0-0 new file mode 100644 index 0000000000..edcb1561fb --- /dev/null +++ b/examples/airebo/in.airebo-0-0 @@ -0,0 +1,22 @@ +# AIREBO polyethelene benchmark + +units metal +atom_style atomic + +read_data data.airebo + +replicate 17 16 2 + +neighbor 0.5 bin +neigh_modify delay 5 every 1 + +pair_style airebo 3.0 0 0 +pair_coeff * * ../../potentials/CH.airebo C H + +velocity all create 300.0 761341 + +fix 1 all nve +timestep 0.0005 + +thermo 10 +run 100 diff --git a/examples/airebo/in.rebo2 b/examples/airebo/in.rebo2 new file mode 100644 index 0000000000..6834528ffb --- /dev/null +++ b/examples/airebo/in.rebo2 @@ -0,0 +1,22 @@ +# AIREBO polyethelene benchmark + +units metal +atom_style atomic + +read_data data.airebo + +replicate 17 16 2 + +neighbor 0.5 bin +neigh_modify delay 5 every 1 + +pair_style rebo +pair_coeff * * ../../potentials/CH.rebo C H + +velocity all create 300.0 761341 + +fix 1 all nve +timestep 0.0005 + +thermo 10 +run 100 diff --git a/examples/airebo/log.29Jun18.airebo-0-0.g++.1 b/examples/airebo/log.29Jun18.airebo-0-0.g++.1 new file mode 100644 index 0000000000..d61c8e8b34 --- /dev/null +++ b/examples/airebo/log.29Jun18.airebo-0-0.g++.1 @@ -0,0 +1,88 @@ +LAMMPS (29 Jun 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +# AIREBO polyethelene benchmark + +units metal +atom_style atomic + +read_data data.airebo + orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 60 atoms + +replicate 17 16 2 + orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) + 1 by 1 by 1 MPI processor grid + 32640 atoms + Time spent = 0.00136042 secs + +neighbor 0.5 bin +neigh_modify delay 5 every 1 + +pair_style airebo 3.0 0 0 +pair_coeff * * ../../potentials/CH.airebo C H +Reading potential file ../../potentials/CH.airebo with DATE: 2011-10-25 + +velocity all create 300.0 761341 + +fix 1 all nve +timestep 0.0005 + +thermo 10 +run 100 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.5 + ghost atom cutoff = 6.5 + binsize = 3.25, bins = 22 21 16 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair airebo, perpetual + attributes: full, newton on, ghost + pair build: full/bin/ghost + stencil: full/ghost/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 34.21 | 34.21 | 34.21 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 300 -138442.83 0 -137177.16 2463.0756 + 10 179.38448 -137931.29 0 -137174.48 15656.689 + 20 206.89283 -138047.05 0 -137174.19 -24047.407 + 30 150.81289 -137807.48 0 -137171.21 -16524.191 + 40 173.24289 -137902.32 0 -137171.42 -5721.7187 + 50 151.80722 -137812.37 0 -137171.91 3489.8954 + 60 199.06038 -138013.7 0 -137173.88 17887.024 + 70 217.84848 -138093.82 0 -137174.73 -12266.16 + 80 202.34667 -138029.28 0 -137175.59 -7623.6635 + 90 194.92367 -137997.12 0 -137174.75 -32277.173 + 100 185.2078 -137954.64 0 -137173.26 -6888.5104 +Loop time of 5.00753 on 1 procs for 100 steps with 32640 atoms + +Performance: 0.863 ns/day, 27.820 hours/ns, 19.970 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 | 3.4898 | 3.4898 | 3.4898 | 0.0 | 69.69 +Neigh | 1.4697 | 1.4697 | 1.4697 | 0.0 | 29.35 +Comm | 0.015885 | 0.015885 | 0.015885 | 0.0 | 0.32 +Output | 0.00096607 | 0.00096607 | 0.00096607 | 0.0 | 0.02 +Modify | 0.021901 | 0.021901 | 0.021901 | 0.0 | 0.44 +Other | | 0.009297 | | | 0.19 + +Nlocal: 32640 ave 32640 max 32640 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 26460 ave 26460 max 26460 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 4.90213e+06 ave 4.90213e+06 max 4.90213e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 4902134 +Ave neighs/atom = 150.188 +Neighbor list builds = 9 +Dangerous builds = 0 +Total wall time: 0:00:05 diff --git a/examples/airebo/log.29Jun18.airebo-0-0.g++.4 b/examples/airebo/log.29Jun18.airebo-0-0.g++.4 new file mode 100644 index 0000000000..72d6fdd211 --- /dev/null +++ b/examples/airebo/log.29Jun18.airebo-0-0.g++.4 @@ -0,0 +1,88 @@ +LAMMPS (29 Jun 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +# AIREBO polyethelene benchmark + +units metal +atom_style atomic + +read_data data.airebo + orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579) + 1 by 1 by 4 MPI processor grid + reading atoms ... + 60 atoms + +replicate 17 16 2 + orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) + 2 by 2 by 1 MPI processor grid + 32640 atoms + Time spent = 0.000609159 secs + +neighbor 0.5 bin +neigh_modify delay 5 every 1 + +pair_style airebo 3.0 0 0 +pair_coeff * * ../../potentials/CH.airebo C H +Reading potential file ../../potentials/CH.airebo with DATE: 2011-10-25 + +velocity all create 300.0 761341 + +fix 1 all nve +timestep 0.0005 + +thermo 10 +run 100 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.5 + ghost atom cutoff = 6.5 + binsize = 3.25, bins = 22 21 16 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair airebo, perpetual + attributes: full, newton on, ghost + pair build: full/bin/ghost + stencil: full/ghost/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 11.75 | 11.94 | 12.13 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 300 -138442.83 0 -137177.16 2463.0756 + 10 179.38448 -137931.29 0 -137174.48 15656.689 + 20 206.89283 -138047.05 0 -137174.19 -24047.407 + 30 150.81289 -137807.48 0 -137171.21 -16524.191 + 40 173.24289 -137902.32 0 -137171.42 -5721.7187 + 50 151.80722 -137812.37 0 -137171.91 3489.8954 + 60 199.06038 -138013.7 0 -137173.88 17887.024 + 70 217.84848 -138093.82 0 -137174.73 -12266.16 + 80 202.34667 -138029.28 0 -137175.59 -7623.6635 + 90 194.92367 -137997.12 0 -137174.75 -32277.173 + 100 185.2078 -137954.64 0 -137173.26 -6888.5104 +Loop time of 1.50369 on 4 procs for 100 steps with 32640 atoms + +Performance: 2.873 ns/day, 8.354 hours/ns, 66.503 timesteps/s +98.5% 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.92943 | 0.95749 | 0.97327 | 1.8 | 63.68 +Neigh | 0.456 | 0.46115 | 0.46657 | 0.7 | 30.67 +Comm | 0.048775 | 0.068415 | 0.10077 | 8.2 | 4.55 +Output | 0.00044918 | 0.00073665 | 0.0015814 | 0.0 | 0.05 +Modify | 0.0087936 | 0.0089477 | 0.0091038 | 0.1 | 0.60 +Other | | 0.006951 | | | 0.46 + +Nlocal: 8160 ave 8163 max 8157 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Nghost: 11605.8 ave 11615 max 11593 min +Histogram: 1 0 0 0 0 0 2 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 1.22553e+06 ave 1.22734e+06 max 1.22455e+06 min +Histogram: 2 0 0 1 0 0 0 0 0 1 + +Total # of neighbors = 4902134 +Ave neighs/atom = 150.188 +Neighbor list builds = 9 +Dangerous builds = 0 +Total wall time: 0:00:01 diff --git a/examples/airebo/log.23Jun17.airebo-m.g++.1 b/examples/airebo/log.29Jun18.airebo-m.g++.1 similarity index 78% rename from examples/airebo/log.23Jun17.airebo-m.g++.1 rename to examples/airebo/log.29Jun18.airebo-m.g++.1 index 1483fcb4a6..ea587e9380 100644 --- a/examples/airebo/log.23Jun17.airebo-m.g++.1 +++ b/examples/airebo/log.29Jun18.airebo-m.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (23 Jun 2017) +LAMMPS (29 Jun 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark @@ -15,6 +16,7 @@ replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 1 by 1 by 1 MPI processor grid 32640 atoms + Time spent = 0.00136828 secs neighbor 0.5 bin neigh_modify delay 5 every 1 @@ -55,20 +57,20 @@ Step Temp E_pair E_mol TotEng Press 80 164.28396 -138709.5 0 -138016.4 -1524.7353 90 180.26403 -138776.42 0 -138015.9 -27143.467 100 164.05694 -138706.58 0 -138014.44 5157.5516 -Loop time of 117.672 on 1 procs for 100 steps with 32640 atoms +Loop time of 64.9938 on 1 procs for 100 steps with 32640 atoms -Performance: 0.037 ns/day, 653.734 hours/ns, 0.850 timesteps/s -99.3% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 0.066 ns/day, 361.077 hours/ns, 1.539 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 | 108.31 | 108.31 | 108.31 | 0.0 | 92.04 -Neigh | 9.2199 | 9.2199 | 9.2199 | 0.0 | 7.84 -Comm | 0.052942 | 0.052942 | 0.052942 | 0.0 | 0.04 -Output | 0.0015149 | 0.0015149 | 0.0015149 | 0.0 | 0.00 -Modify | 0.060962 | 0.060962 | 0.060962 | 0.0 | 0.05 -Other | | 0.02656 | | | 0.02 +Pair | 60.289 | 60.289 | 60.289 | 0.0 | 92.76 +Neigh | 4.6445 | 4.6445 | 4.6445 | 0.0 | 7.15 +Comm | 0.025577 | 0.025577 | 0.025577 | 0.0 | 0.04 +Output | 0.00097752 | 0.00097752 | 0.00097752 | 0.0 | 0.00 +Modify | 0.022412 | 0.022412 | 0.022412 | 0.0 | 0.03 +Other | | 0.01114 | | | 0.02 Nlocal: 32640 ave 32640 max 32640 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -83,4 +85,4 @@ Total # of neighbors = 22210922 Ave neighs/atom = 680.482 Neighbor list builds = 8 Dangerous builds = 0 -Total wall time: 0:02:00 +Total wall time: 0:01:06 diff --git a/examples/airebo/log.23Jun17.airebo-m.g++.4 b/examples/airebo/log.29Jun18.airebo-m.g++.4 similarity index 78% rename from examples/airebo/log.23Jun17.airebo-m.g++.4 rename to examples/airebo/log.29Jun18.airebo-m.g++.4 index 3a3d922bcb..d93f6f7c85 100644 --- a/examples/airebo/log.23Jun17.airebo-m.g++.4 +++ b/examples/airebo/log.29Jun18.airebo-m.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (23 Jun 2017) +LAMMPS (29 Jun 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark @@ -15,6 +16,7 @@ replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 2 by 2 by 1 MPI processor grid 32640 atoms + Time spent = 0.000688076 secs neighbor 0.5 bin neigh_modify delay 5 every 1 @@ -55,20 +57,20 @@ Step Temp E_pair E_mol TotEng Press 80 164.28396 -138709.5 0 -138016.4 -1524.7353 90 180.26403 -138776.42 0 -138015.9 -27143.467 100 164.05694 -138706.58 0 -138014.44 5157.5516 -Loop time of 32.9268 on 4 procs for 100 steps with 32640 atoms +Loop time of 18.0388 on 4 procs for 100 steps with 32640 atoms -Performance: 0.131 ns/day, 182.927 hours/ns, 3.037 timesteps/s -99.4% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 0.239 ns/day, 100.216 hours/ns, 5.544 timesteps/s +99.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 | 28.045 | 28.537 | 29.42 | 10.4 | 86.67 -Neigh | 3.163 | 3.237 | 3.3761 | 4.7 | 9.83 -Comm | 0.09883 | 1.1206 | 1.6862 | 60.4 | 3.40 -Output | 0.00099325 | 0.0011329 | 0.0012462 | 0.3 | 0.00 -Modify | 0.016013 | 0.016726 | 0.017257 | 0.4 | 0.05 -Other | | 0.01459 | | | 0.04 +Pair | 15.983 | 16.085 | 16.285 | 2.9 | 89.17 +Neigh | 1.5975 | 1.6116 | 1.6215 | 0.8 | 8.93 +Comm | 0.11408 | 0.32424 | 0.43065 | 21.7 | 1.80 +Output | 0.00062895 | 0.0012782 | 0.0018394 | 1.2 | 0.01 +Modify | 0.0089653 | 0.0090135 | 0.0090837 | 0.0 | 0.05 +Other | | 0.007664 | | | 0.04 Nlocal: 8160 ave 8167 max 8153 min Histogram: 1 0 1 0 0 0 0 1 0 1 @@ -83,4 +85,4 @@ Total # of neighbors = 22210922 Ave neighs/atom = 680.482 Neighbor list builds = 8 Dangerous builds = 0 -Total wall time: 0:00:33 +Total wall time: 0:00:18 diff --git a/examples/airebo/log.23Jun17.airebo.g++.1 b/examples/airebo/log.29Jun18.airebo.g++.1 similarity index 78% rename from examples/airebo/log.23Jun17.airebo.g++.1 rename to examples/airebo/log.29Jun18.airebo.g++.1 index 0ef895dc28..12ba33cd95 100644 --- a/examples/airebo/log.23Jun17.airebo.g++.1 +++ b/examples/airebo/log.29Jun18.airebo.g++.1 @@ -1,4 +1,5 @@ -LAMMPS (23 Jun 2017) +LAMMPS (29 Jun 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark @@ -15,6 +16,7 @@ replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 1 by 1 by 1 MPI processor grid 32640 atoms + Time spent = 0.00137973 secs neighbor 0.5 bin neigh_modify delay 5 every 1 @@ -55,20 +57,20 @@ Step Temp E_pair E_mol TotEng Press 80 157.16184 -138695.77 0 -138032.72 19824.698 90 196.15907 -138860.65 0 -138033.07 -7950.8462 100 178.31875 -138784.89 0 -138032.57 30997.671 -Loop time of 110.107 on 1 procs for 100 steps with 32640 atoms +Loop time of 58.178 on 1 procs for 100 steps with 32640 atoms -Performance: 0.039 ns/day, 611.705 hours/ns, 0.908 timesteps/s -99.5% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 0.074 ns/day, 323.211 hours/ns, 1.719 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 | 100.76 | 100.76 | 100.76 | 0.0 | 91.51 -Neigh | 9.1909 | 9.1909 | 9.1909 | 0.0 | 8.35 -Comm | 0.058134 | 0.058134 | 0.058134 | 0.0 | 0.05 -Output | 0.0015941 | 0.0015941 | 0.0015941 | 0.0 | 0.00 -Modify | 0.062212 | 0.062212 | 0.062212 | 0.0 | 0.06 -Other | | 0.03123 | | | 0.03 +Pair | 53.477 | 53.477 | 53.477 | 0.0 | 91.92 +Neigh | 4.6405 | 4.6405 | 4.6405 | 0.0 | 7.98 +Comm | 0.025745 | 0.025745 | 0.025745 | 0.0 | 0.04 +Output | 0.00097823 | 0.00097823 | 0.00097823 | 0.0 | 0.00 +Modify | 0.022715 | 0.022715 | 0.022715 | 0.0 | 0.04 +Other | | 0.01117 | | | 0.02 Nlocal: 32640 ave 32640 max 32640 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -83,4 +85,4 @@ Total # of neighbors = 22217840 Ave neighs/atom = 680.694 Neighbor list builds = 8 Dangerous builds = 0 -Total wall time: 0:01:52 +Total wall time: 0:00:59 diff --git a/examples/airebo/log.23Jun17.airebo.g++.4 b/examples/airebo/log.29Jun18.airebo.g++.4 similarity index 78% rename from examples/airebo/log.23Jun17.airebo.g++.4 rename to examples/airebo/log.29Jun18.airebo.g++.4 index 486b48a004..36794642af 100644 --- a/examples/airebo/log.23Jun17.airebo.g++.4 +++ b/examples/airebo/log.29Jun18.airebo.g++.4 @@ -1,4 +1,5 @@ -LAMMPS (23 Jun 2017) +LAMMPS (29 Jun 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark @@ -15,6 +16,7 @@ replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 2 by 2 by 1 MPI processor grid 32640 atoms + Time spent = 0.000712872 secs neighbor 0.5 bin neigh_modify delay 5 every 1 @@ -55,20 +57,20 @@ Step Temp E_pair E_mol TotEng Press 80 157.16184 -138695.77 0 -138032.72 19824.698 90 196.15907 -138860.65 0 -138033.07 -7950.8462 100 178.31875 -138784.89 0 -138032.57 30997.671 -Loop time of 30.1916 on 4 procs for 100 steps with 32640 atoms +Loop time of 16.4409 on 4 procs for 100 steps with 32640 atoms -Performance: 0.143 ns/day, 167.731 hours/ns, 3.312 timesteps/s -99.1% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 0.263 ns/day, 91.338 hours/ns, 6.082 timesteps/s +98.4% CPU use with 4 MPI tasks x 1 OpenMP threads MPI task timing breakdown: Section | min time | avg time | max time |%varavg| %total --------------------------------------------------------------- -Pair | 26.083 | 26.31 | 26.795 | 5.5 | 87.14 -Neigh | 3.1781 | 3.2134 | 3.2775 | 2.2 | 10.64 -Comm | 0.086296 | 0.63643 | 0.88995 | 40.2 | 2.11 -Output | 0.00074124 | 0.0010698 | 0.0013616 | 0.7 | 0.00 -Modify | 0.015335 | 0.016373 | 0.017565 | 0.8 | 0.05 -Other | | 0.01457 | | | 0.05 +Pair | 14.212 | 14.384 | 14.487 | 3.0 | 87.49 +Neigh | 1.5943 | 1.615 | 1.6263 | 1.0 | 9.82 +Comm | 0.30944 | 0.42389 | 0.61698 | 19.2 | 2.58 +Output | 0.00065231 | 0.00094843 | 0.0018184 | 0.0 | 0.01 +Modify | 0.0092347 | 0.0093143 | 0.0094111 | 0.1 | 0.06 +Other | | 0.007456 | | | 0.05 Nlocal: 8160 ave 8174 max 8146 min Histogram: 1 0 1 0 0 0 0 1 0 1 @@ -83,4 +85,4 @@ Total # of neighbors = 22217840 Ave neighs/atom = 680.694 Neighbor list builds = 8 Dangerous builds = 0 -Total wall time: 0:00:30 +Total wall time: 0:00:16 diff --git a/examples/airebo/log.29Jun18.rebo2.g++.1 b/examples/airebo/log.29Jun18.rebo2.g++.1 new file mode 100644 index 0000000000..54c87ab474 --- /dev/null +++ b/examples/airebo/log.29Jun18.rebo2.g++.1 @@ -0,0 +1,88 @@ +LAMMPS (29 Jun 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +# AIREBO polyethelene benchmark + +units metal +atom_style atomic + +read_data data.airebo + orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579) + 1 by 1 by 1 MPI processor grid + reading atoms ... + 60 atoms + +replicate 17 16 2 + orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) + 1 by 1 by 1 MPI processor grid + 32640 atoms + Time spent = 0.00153542 secs + +neighbor 0.5 bin +neigh_modify delay 5 every 1 + +pair_style rebo +pair_coeff * * ../../potentials/CH.rebo C H +Reading potential file ../../potentials/CH.rebo with DATE: 2018-7-3 + +velocity all create 300.0 761341 + +fix 1 all nve +timestep 0.0005 + +thermo 10 +run 100 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.5 + ghost atom cutoff = 6.5 + binsize = 3.25, bins = 22 21 16 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair rebo, perpetual + attributes: full, newton on, ghost + pair build: full/bin/ghost + stencil: full/ghost/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 34.21 | 34.21 | 34.21 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 300 -138442.83 0 -137177.16 2463.0748 + 10 179.37985 -137931.27 0 -137174.48 15655.936 + 20 206.87654 -138046.99 0 -137174.19 -24042.627 + 30 150.80122 -137807.43 0 -137171.21 -16524.118 + 40 173.24945 -137902.35 0 -137171.42 -5716.9118 + 50 151.80455 -137812.36 0 -137171.91 3480.4584 + 60 199.08777 -138013.82 0 -137173.88 17881.372 + 70 217.85748 -138093.86 0 -137174.73 -12270.999 + 80 202.37482 -138029.39 0 -137175.59 -7622.732 + 90 194.90628 -137997.05 0 -137174.75 -32267.471 + 100 185.17818 -137954.51 0 -137173.26 -6901.7499 +Loop time of 5.03541 on 1 procs for 100 steps with 32640 atoms + +Performance: 0.858 ns/day, 27.975 hours/ns, 19.859 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 | 3.5083 | 3.5083 | 3.5083 | 0.0 | 69.67 +Neigh | 1.4785 | 1.4785 | 1.4785 | 0.0 | 29.36 +Comm | 0.016176 | 0.016176 | 0.016176 | 0.0 | 0.32 +Output | 0.0009644 | 0.0009644 | 0.0009644 | 0.0 | 0.02 +Modify | 0.02224 | 0.02224 | 0.02224 | 0.0 | 0.44 +Other | | 0.009286 | | | 0.18 + +Nlocal: 32640 ave 32640 max 32640 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 26460 ave 26460 max 26460 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 4.90213e+06 ave 4.90213e+06 max 4.90213e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 4902134 +Ave neighs/atom = 150.188 +Neighbor list builds = 9 +Dangerous builds = 0 +Total wall time: 0:00:05 diff --git a/examples/airebo/log.29Jun18.rebo2.g++.4 b/examples/airebo/log.29Jun18.rebo2.g++.4 new file mode 100644 index 0000000000..b7d63dd2e5 --- /dev/null +++ b/examples/airebo/log.29Jun18.rebo2.g++.4 @@ -0,0 +1,88 @@ +LAMMPS (29 Jun 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +# AIREBO polyethelene benchmark + +units metal +atom_style atomic + +read_data data.airebo + orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579) + 1 by 1 by 4 MPI processor grid + reading atoms ... + 60 atoms + +replicate 17 16 2 + orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) + 2 by 2 by 1 MPI processor grid + 32640 atoms + Time spent = 0.00151467 secs + +neighbor 0.5 bin +neigh_modify delay 5 every 1 + +pair_style rebo +pair_coeff * * ../../potentials/CH.rebo C H +Reading potential file ../../potentials/CH.rebo with DATE: 2018-7-3 + +velocity all create 300.0 761341 + +fix 1 all nve +timestep 0.0005 + +thermo 10 +run 100 +Neighbor list info ... + update every 1 steps, delay 5 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 6.5 + ghost atom cutoff = 6.5 + binsize = 3.25, bins = 22 21 16 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair rebo, perpetual + attributes: full, newton on, ghost + pair build: full/bin/ghost + stencil: full/ghost/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 11.75 | 11.94 | 12.13 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 300 -138442.83 0 -137177.16 2463.0748 + 10 179.37985 -137931.27 0 -137174.48 15655.936 + 20 206.87654 -138046.99 0 -137174.19 -24042.627 + 30 150.80122 -137807.43 0 -137171.21 -16524.118 + 40 173.24945 -137902.35 0 -137171.42 -5716.9118 + 50 151.80455 -137812.36 0 -137171.91 3480.4584 + 60 199.08777 -138013.82 0 -137173.88 17881.372 + 70 217.85748 -138093.86 0 -137174.73 -12270.999 + 80 202.37482 -138029.39 0 -137175.59 -7622.732 + 90 194.90628 -137997.05 0 -137174.75 -32267.471 + 100 185.17818 -137954.51 0 -137173.26 -6901.7499 +Loop time of 1.49632 on 4 procs for 100 steps with 32640 atoms + +Performance: 2.887 ns/day, 8.313 hours/ns, 66.831 timesteps/s +98.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.93275 | 0.95717 | 0.97367 | 1.6 | 63.97 +Neigh | 0.45634 | 0.46084 | 0.46749 | 0.6 | 30.80 +Comm | 0.038283 | 0.062074 | 0.090508 | 7.6 | 4.15 +Output | 0.00046492 | 0.00072992 | 0.0015128 | 0.0 | 0.05 +Modify | 0.0088651 | 0.0090639 | 0.0093012 | 0.2 | 0.61 +Other | | 0.006436 | | | 0.43 + +Nlocal: 8160 ave 8163 max 8157 min +Histogram: 1 1 0 0 0 0 0 0 1 1 +Nghost: 11605.8 ave 11615 max 11593 min +Histogram: 1 0 0 0 0 0 2 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 1.22553e+06 ave 1.22735e+06 max 1.22455e+06 min +Histogram: 2 0 0 1 0 0 0 0 0 1 + +Total # of neighbors = 4902134 +Ave neighs/atom = 150.188 +Neighbor list builds = 9 +Dangerous builds = 0 +Total wall time: 0:00:01 From e51720a2def24ce3194d0cce4c4f020942b70018 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 20 Nov 2018 13:51:12 -0500 Subject: [PATCH 0067/1242] add code to detect inconistent use of AIREBO/REBO potential files --- doc/src/pair_airebo.txt | 17 ++++++++------- src/MANYBODY/pair_airebo.cpp | 35 +++++++++++++++++++++++++----- src/MANYBODY/pair_airebo.h | 6 +++-- src/MANYBODY/pair_airebo_morse.cpp | 4 +++- src/MANYBODY/pair_rebo.cpp | 4 +++- 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/doc/src/pair_airebo.txt b/doc/src/pair_airebo.txt index c090a39af7..4d5cf4528b 100644 --- a/doc/src/pair_airebo.txt +++ b/doc/src/pair_airebo.txt @@ -36,7 +36,7 @@ pair_style airebo/morse 3.0 pair_coeff * * ../potentials/CH.airebo-m H C :pre pair_style rebo -pair_coeff * * ../potentials/CH.airebo H C :pre +pair_coeff * * ../potentials/CH.rebo H C :pre [Description:] @@ -57,7 +57,8 @@ The {rebo} pair style computes the Reactive Empirical Bond Order (REBO) Potential of "(Brenner)"_#Brenner. Note that this is the so-called 2nd generation REBO from 2002, not the original REBO from 1990. As discussed below, 2nd generation REBO is closely related to the -initial AIREBO; it is just a subset of the potential energy terms. +initial AIREBO; it is just a subset of the potential energy terms +with a few slightly different parameters The AIREBO potential consists of three terms: @@ -113,12 +114,12 @@ various dihedral angle preferences in hydrocarbon configurations. :line Only a single pair_coeff command is used with the {airebo}, {airebo} -or {rebo} style which specifies an AIREBO or AIREBO-M potential file -with parameters for C and H. Note that the {rebo} style in LAMMPS -uses the same AIREBO-formatted potential file. These are mapped to -LAMMPS atom types by specifying N additional arguments after the -filename in the pair_coeff command, where N is the number of LAMMPS -atom types: +or {rebo} style which specifies an AIREBO, REBO, or AIREBO-M potential +file with parameters for C and H. Note that as of LAMMPS version +15 November 2018 the {rebo} style in LAMMPS uses its own potential +file (CH.rebo). These are mapped to LAMMPS atom types by specifying +N additional arguments after the filename in the pair_coeff command, +where N is the number of LAMMPS atom types: filename N element names = mapping of AIREBO elements to atom types :ul diff --git a/src/MANYBODY/pair_airebo.cpp b/src/MANYBODY/pair_airebo.cpp index f2877647c0..966a2514d6 100644 --- a/src/MANYBODY/pair_airebo.cpp +++ b/src/MANYBODY/pair_airebo.cpp @@ -49,7 +49,8 @@ using namespace MathSpecial; /* ---------------------------------------------------------------------- */ -PairAIREBO::PairAIREBO(LAMMPS *lmp) : Pair(lmp) +PairAIREBO::PairAIREBO(LAMMPS *lmp) + : Pair(lmp), variant(AIREBO) { single_enable = 0; restartinfo = 0; @@ -3368,14 +3369,38 @@ void PairAIREBO::read_file(char *filename) FILE *fp = force->open_potential(filename); if (fp == NULL) { char str[128]; - if (morseflag) - snprintf(str,128,"Cannot open AIREBO-M potential file %s",filename); - else + switch (variant) { + + case AIREBO: snprintf(str,128,"Cannot open AIREBO potential file %s",filename); + break; + + case REBO_2: + snprintf(str,128,"Cannot open REBO2 potential file %s",filename); + break; + + case AIREBO_M: + snprintf(str,128,"Cannot open AIREBO-M potential file %s",filename); + break; + + default: + snprintf(str,128,"Unknown REBO style variant %d",variant); + } error->one(FLERR,str); } - // skip initial comment lines + // skip initial comment line and check for potential file style identifier comment + + fgets(s,MAXLINE,fp); + fgets(s,MAXLINE,fp); + + if (((variant == AIREBO) && (strncmp(s,"# AIREBO ",9) != 0)) + || ((variant == REBO_2) && (strncmp(s,"# REBO2 ",8) != 0)) + || ((variant == AIREBO_M) && (strncmp(s,"# AIREBO-M ",11) != 0))) { + error->one(FLERR,"Potential file does not match AIREBO/REBO style variant"); + } + + // skip remaining comments while (1) { fgets(s,MAXLINE,fp); diff --git a/src/MANYBODY/pair_airebo.h b/src/MANYBODY/pair_airebo.h index 579c342f1b..31c99c4529 100644 --- a/src/MANYBODY/pair_airebo.h +++ b/src/MANYBODY/pair_airebo.h @@ -38,10 +38,12 @@ class PairAIREBO : public Pair { double init_one(int, int); double memory_usage(); - protected: + enum { AIREBO, REBO_2, AIREBO_M }; // for telling class variants apart in shared code + +protected: int *map; // 0 (C), 1 (H), or -1 (NULL) for each type - int me; + int me,variant; int ljflag,torflag; // 0/1 if LJ/Morse,torsion terms included int morseflag; // 1 if Morse instead of LJ for non-bonded diff --git a/src/MANYBODY/pair_airebo_morse.cpp b/src/MANYBODY/pair_airebo_morse.cpp index b501ed0982..a39f7df82e 100644 --- a/src/MANYBODY/pair_airebo_morse.cpp +++ b/src/MANYBODY/pair_airebo_morse.cpp @@ -19,7 +19,9 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairAIREBOMorse::PairAIREBOMorse(LAMMPS *lmp) : PairAIREBO(lmp) {} +PairAIREBOMorse::PairAIREBOMorse(LAMMPS *lmp) : PairAIREBO(lmp) { + variant = AIREBO_M; +} /* ---------------------------------------------------------------------- global settings diff --git a/src/MANYBODY/pair_rebo.cpp b/src/MANYBODY/pair_rebo.cpp index 5563e1222c..01331c912d 100644 --- a/src/MANYBODY/pair_rebo.cpp +++ b/src/MANYBODY/pair_rebo.cpp @@ -18,7 +18,9 @@ using namespace LAMMPS_NS; /* ---------------------------------------------------------------------- */ -PairREBO::PairREBO(LAMMPS *lmp) : PairAIREBO(lmp) {} +PairREBO::PairREBO(LAMMPS *lmp) : PairAIREBO(lmp) { + variant = REBO_2; +} /* ---------------------------------------------------------------------- global settings From ab1c3f649832aa37f770dd9c1775050ce4075b7a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 30 Nov 2018 11:54:48 -0700 Subject: [PATCH 0068/1242] 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 0069/1242] 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 0070/1242] 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 0071/1242] 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 b068690e1392e0c5d6ff0c7faf2293ceab9a40fc Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 12 Dec 2018 16:21:54 -0600 Subject: [PATCH 0072/1242] Update for kim-api beta.3 release --- cmake/CMakeLists.txt | 6 +- .../log.11Jul2018.kim.lj.newton-off.ubuntu.1 | 68 ----------------- .../log.11Jul2018.kim.lj.newton-off.ubuntu.4 | 74 ------------------- .../log.11Jul2018.kim.lj.newton-on.ubuntu.1 | 68 ----------------- .../log.11Jul2018.kim.lj.newton-on.ubuntu.4 | 74 ------------------- ... log.12Dec2018.in.kim.lj.lmp.newton-off.1} | 37 ++++------ ... log.12Dec2018.in.kim.lj.lmp.newton-off.4} | 39 ++++------ ...> log.12Dec2018.in.kim.lj.lmp.newton-on.1} | 37 ++++------ ...> log.12Dec2018.in.kim.lj.lmp.newton-on.4} | 39 ++++------ .../kim/log.12Dec2018.in.kim.lj.newton-off.1 | 59 +++++++++++++++ .../kim/log.12Dec2018.in.kim.lj.newton-off.4 | 65 ++++++++++++++++ .../kim/log.12Dec2018.in.kim.lj.newton-on.1 | 59 +++++++++++++++ .../kim/log.12Dec2018.in.kim.lj.newton-on.4 | 65 ++++++++++++++++ lib/kim/.gitignore | 3 +- lib/kim/Install.py | 8 +- 15 files changed, 310 insertions(+), 391 deletions(-) delete mode 100644 examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.1 delete mode 100644 examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.4 delete mode 100644 examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.1 delete mode 100644 examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.4 rename examples/kim/{log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.1 => log.12Dec2018.in.kim.lj.lmp.newton-off.1} (56%) rename examples/kim/{log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.4 => log.12Dec2018.in.kim.lj.lmp.newton-off.4} (55%) rename examples/kim/{log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1 => log.12Dec2018.in.kim.lj.lmp.newton-on.1} (56%) rename examples/kim/{log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4 => log.12Dec2018.in.kim.lj.lmp.newton-on.4} (55%) create mode 100644 examples/kim/log.12Dec2018.in.kim.lj.newton-off.1 create mode 100644 examples/kim/log.12Dec2018.in.kim.lj.newton-off.4 create mode 100644 examples/kim/log.12Dec2018.in.kim.lj.newton-on.1 create mode 100644 examples/kim/log.12Dec2018.in.kim.lj.newton-on.4 diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 1e0d207a7e..4abbeb4732 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -590,8 +590,8 @@ if(PKG_KIM) enable_language(Fortran) include(ExternalProject) ExternalProject_Add(kim_build - URL https://s3.openkim.org/kim-api/kim-api-v2.0.0-beta.2.txz - URL_MD5 1fbdbb734059cf0dc9d807e6dd6cc8ea + URL https://s3.openkim.org/kim-api/kim-api-v2-2.0.0-beta.3.txz + URL_MD5 67c103a00e84865848d004837262c76e BINARY_DIR build CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} @@ -601,7 +601,7 @@ if(PKG_KIM) ) ExternalProject_get_property(kim_build INSTALL_DIR) set(KIM-API-V2_INCLUDE_DIRS ${INSTALL_DIR}/include/kim-api-v2) - set(KIM-API-V2_LIBRARIES ${INSTALL_DIR}/lib/libkim-api-v2.2${CMAKE_SHARED_LIBRARY_SUFFIX}) + set(KIM-API-V2_LDFLAGS ${INSTALL_DIR}/lib/libkim-api-v2.2${CMAKE_SHARED_LIBRARY_SUFFIX}) list(APPEND LAMMPS_DEPS kim_build) else() find_package(KIM-API-V2) diff --git a/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.1 b/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.1 deleted file mode 100644 index c8c1919de5..0000000000 --- a/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.1 +++ /dev/null @@ -1,68 +0,0 @@ --------------------------------------------------------------------------- -[[5713,1],0]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 1 by 1 MPI processor grid -Created 32000 atoms - Time spent = 0.00256546 secs -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 8.45 - ghost atom cutoff = 8.45 - binsize = 4.225, bins = 21 21 21 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair kim, perpetual - attributes: half, newton off, cut 8.45 - pair build: half/bin/newtoff - stencil: half/bin/3d/newtoff - bin: standard -Setting up Verlet run ... - Unit style : metal - Current step : 0 - Time step : 0.001 -Per MPI rank memory allocation (min/avg/max) = 21.26 | 21.26 | 21.26 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 6290.8194 0 7118.0584 129712.25 - 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.69522 on 1 procs for 100 steps with 32000 atoms - -Performance: 3.206 ns/day, 7.487 hours/ns, 37.103 timesteps/s -99.8% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.3655 | 2.3655 | 2.3655 | 0.0 | 87.77 -Neigh | 0.28659 | 0.28659 | 0.28659 | 0.0 | 10.63 -Comm | 0.0061924 | 0.0061924 | 0.0061924 | 0.0 | 0.23 -Output | 0.00034901 | 0.00034901 | 0.00034901 | 0.0 | 0.01 -Modify | 0.025061 | 0.025061 | 0.025061 | 0.0 | 0.93 -Other | | 0.01157 | | | 0.43 - -Nlocal: 32000 ave 32000 max 32000 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 19911 ave 19911 max 19911 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 2.3705e+06 ave 2.3705e+06 max 2.3705e+06 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 2370499 -Ave neighs/atom = 74.0781 -Neighbor list builds = 3 -Dangerous builds = 0 -Total wall time: 0:00:02 diff --git a/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.4 b/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.4 deleted file mode 100644 index c8d5faeb20..0000000000 --- a/examples/kim/log.11Jul2018.kim.lj.newton-off.ubuntu.4 +++ /dev/null @@ -1,74 +0,0 @@ --------------------------------------------------------------------------- -[[5673,1],0]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 2 by 2 MPI processor grid -Created 32000 atoms - Time spent = 0.00215514 secs -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 8.45 - ghost atom cutoff = 8.45 - binsize = 4.225, bins = 21 21 21 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair kim, perpetual - attributes: half, newton off, cut 8.45 - pair build: half/bin/newtoff - stencil: half/bin/3d/newtoff - bin: standard -Setting up Verlet run ... - Unit style : metal - Current step : 0 - Time step : 0.001 -Per MPI rank memory allocation (min/avg/max) = 8.528 | 8.528 | 8.528 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 6290.8194 0 7118.0584 129712.25 - 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 3.06157 on 4 procs for 100 steps with 32000 atoms - -Performance: 2.822 ns/day, 8.504 hours/ns, 32.663 timesteps/s -24.4% CPU use with 4 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 1.9964 | 2.0369 | 2.084 | 2.5 | 66.53 -Neigh | 0.25048 | 0.27467 | 0.29605 | 3.1 | 8.97 -Comm | 0.66611 | 0.71603 | 0.74496 | 3.6 | 23.39 -Output | 0.00048383 | 0.00070085 | 0.00098836 | 0.0 | 0.02 -Modify | 0.0064885 | 0.0065907 | 0.006806 | 0.2 | 0.22 -Other | | 0.02664 | | | 0.87 - -Nlocal: 8000 ave 8018 max 7967 min -Histogram: 1 0 0 0 0 0 1 0 0 2 -Nghost: 9131 ave 9164 max 9113 min -Histogram: 2 0 0 1 0 0 0 0 0 1 -Neighs: 630904 ave 632094 max 628209 min -Histogram: 1 0 0 0 0 0 0 1 0 2 - -Total # of neighbors = 2523614 -Ave neighs/atom = 78.8629 -Neighbor list builds = 3 -Dangerous builds = 0 -Total wall time: 0:00:03 diff --git a/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.1 b/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.1 deleted file mode 100644 index 21af1a6299..0000000000 --- a/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.1 +++ /dev/null @@ -1,68 +0,0 @@ --------------------------------------------------------------------------- -[[5690,1],0]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 1 by 1 MPI processor grid -Created 32000 atoms - Time spent = 0.00258302 secs -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 8.45 - ghost atom cutoff = 8.45 - binsize = 4.225, bins = 21 21 21 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair kim, perpetual - attributes: half, newton off, cut 8.45 - pair build: half/bin/newtoff - stencil: half/bin/3d/newtoff - bin: standard -Setting up Verlet run ... - Unit style : metal - Current step : 0 - Time step : 0.001 -Per MPI rank memory allocation (min/avg/max) = 20.87 | 20.87 | 20.87 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 6290.8194 0 7118.0584 129712.25 - 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.7052 on 1 procs for 100 steps with 32000 atoms - -Performance: 3.194 ns/day, 7.514 hours/ns, 36.966 timesteps/s -99.6% CPU use with 1 MPI tasks x no OpenMP threads - -MPI task timing breakdown: -Section | min time | avg time | max time |%varavg| %total ---------------------------------------------------------------- -Pair | 2.3715 | 2.3715 | 2.3715 | 0.0 | 87.67 -Neigh | 0.28386 | 0.28386 | 0.28386 | 0.0 | 10.49 -Comm | 0.012808 | 0.012808 | 0.012808 | 0.0 | 0.47 -Output | 0.00033716 | 0.00033716 | 0.00033716 | 0.0 | 0.01 -Modify | 0.02349 | 0.02349 | 0.02349 | 0.0 | 0.87 -Other | | 0.01317 | | | 0.49 - -Nlocal: 32000 ave 32000 max 32000 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Nghost: 19911 ave 19911 max 19911 min -Histogram: 1 0 0 0 0 0 0 0 0 0 -Neighs: 2.3705e+06 ave 2.3705e+06 max 2.3705e+06 min -Histogram: 1 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 2370499 -Ave neighs/atom = 74.0781 -Neighbor list builds = 3 -Dangerous builds = 0 -Total wall time: 0:00:02 diff --git a/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.4 b/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.4 deleted file mode 100644 index 1214436d4d..0000000000 --- a/examples/kim/log.11Jul2018.kim.lj.newton-on.ubuntu.4 +++ /dev/null @@ -1,74 +0,0 @@ --------------------------------------------------------------------------- -[[5682,1],0]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) -Lattice spacing in x,y,z = 4.43 4.43 4.43 -Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) - 1 by 2 by 2 MPI processor grid -Created 32000 atoms - Time spent = 0.00322684 secs -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (../pair_kim.cpp:955) -WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (../pair_kim.cpp:959) -Neighbor list info ... - update every 1 steps, delay 0 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 8.45 - ghost atom cutoff = 8.45 - binsize = 4.225, bins = 21 21 21 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair kim, perpetual - attributes: half, newton off, cut 8.45 - pair build: half/bin/newtoff - stencil: half/bin/3d/newtoff - bin: standard -Setting up Verlet run ... - Unit style : metal - Current step : 0 - Time step : 0.001 -Per MPI rank memory allocation (min/avg/max) = 8.263 | 8.263 | 8.263 Mbytes -Step Temp E_pair E_mol TotEng Press - 0 200 6290.8194 0 7118.0584 129712.25 - 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 3.1366 on 4 procs for 100 steps with 32000 atoms - -Performance: 2.755 ns/day, 8.713 hours/ns, 31.882 timesteps/s -23.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 | 1.3641 | 1.4213 | 1.4783 | 3.5 | 45.31 -Neigh | 0.25408 | 0.27714 | 0.29697 | 3.2 | 8.84 -Comm | 1.3588 | 1.4045 | 1.4806 | 4.0 | 44.78 -Output | 0.00055232 | 0.00072915 | 0.00087484 | 0.0 | 0.02 -Modify | 0.0061178 | 0.0062019 | 0.0062811 | 0.1 | 0.20 -Other | | 0.02673 | | | 0.85 - -Nlocal: 8000 ave 8018 max 7967 min -Histogram: 1 0 0 0 0 0 1 0 0 2 -Nghost: 9131 ave 9164 max 9113 min -Histogram: 2 0 0 1 0 0 0 0 0 1 -Neighs: 630904 ave 632094 max 628209 min -Histogram: 1 0 0 0 0 0 0 1 0 2 - -Total # of neighbors = 2523614 -Ave neighs/atom = 78.8629 -Neighbor list builds = 3 -Dangerous builds = 0 -Total wall time: 0:00:03 diff --git a/examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.1 b/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.1 similarity index 56% rename from examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.1 rename to examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.1 index bf5864cb08..0b67cc1ccb 100644 --- a/examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.1 +++ b/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.1 @@ -1,22 +1,11 @@ --------------------------------------------------------------------------- -[[6124,1],0]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) +LAMMPS (24 Oct 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00263722 secs + Time spent = 0.00307703 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -37,20 +26,20 @@ Per MPI rank memory allocation (min/avg/max) = 20.37 | 20.37 | 20.37 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.59913 on 1 procs for 100 steps with 32000 atoms +Loop time of 2.58348 on 1 procs for 100 steps with 32000 atoms -Performance: 3.324 ns/day, 7.220 hours/ns, 38.474 timesteps/s -99.4% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 3.344 ns/day, 7.176 hours/ns, 38.707 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 | 2.2753 | 2.2753 | 2.2753 | 0.0 | 87.54 -Neigh | 0.28456 | 0.28456 | 0.28456 | 0.0 | 10.95 -Comm | 0.0055908 | 0.0055908 | 0.0055908 | 0.0 | 0.22 -Output | 0.00034594 | 0.00034594 | 0.00034594 | 0.0 | 0.01 -Modify | 0.023011 | 0.023011 | 0.023011 | 0.0 | 0.89 -Other | | 0.01037 | | | 0.40 +Pair | 2.2621 | 2.2621 | 2.2621 | 0.0 | 87.56 +Neigh | 0.28294 | 0.28294 | 0.28294 | 0.0 | 10.95 +Comm | 0.0057185 | 0.0057185 | 0.0057185 | 0.0 | 0.22 +Output | 0.00010109 | 0.00010109 | 0.00010109 | 0.0 | 0.00 +Modify | 0.023396 | 0.023396 | 0.023396 | 0.0 | 0.91 +Other | | 0.009175 | | | 0.36 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.4 b/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.4 similarity index 55% rename from examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.4 rename to examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.4 index 7f51d447fd..e2ee8e39bb 100644 --- a/examples/kim/log.11Jul2018.kim.lj.lmp.newton-off.ubuntu.4 +++ b/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.4 @@ -1,22 +1,11 @@ --------------------------------------------------------------------------- -[[6116,1],1]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) +LAMMPS (24 Oct 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.00125703 secs + Time spent = 0.000934124 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -37,20 +26,20 @@ Per MPI rank memory allocation (min/avg/max) = 8.013 | 8.013 | 8.013 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.99901 on 4 procs for 100 steps with 32000 atoms +Loop time of 0.76167 on 4 procs for 100 steps with 32000 atoms -Performance: 2.881 ns/day, 8.331 hours/ns, 33.344 timesteps/s -24.4% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 11.343 ns/day, 2.116 hours/ns, 131.290 timesteps/s +99.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 | 1.3704 | 1.4012 | 1.439 | 2.3 | 46.72 -Neigh | 0.252 | 0.27028 | 0.28236 | 2.2 | 9.01 -Comm | 0.66355 | 0.73942 | 0.82223 | 6.5 | 24.66 -Output | 0.0037821 | 0.0090774 | 0.016142 | 5.1 | 0.30 -Modify | 0.0058855 | 0.019317 | 0.044855 | 11.4 | 0.64 -Other | | 0.5597 | | | 18.66 +Pair | 0.65549 | 0.6589 | 0.66089 | 0.3 | 86.51 +Neigh | 0.075691 | 0.075959 | 0.07641 | 0.1 | 9.97 +Comm | 0.0073049 | 0.007397 | 0.0074785 | 0.1 | 0.97 +Output | 5.6982e-05 | 0.00014746 | 0.00024986 | 0.0 | 0.02 +Modify | 0.0068338 | 0.0068703 | 0.0068941 | 0.0 | 0.90 +Other | | 0.0124 | | | 1.63 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 @@ -63,4 +52,4 @@ Total # of neighbors = 2523614 Ave neighs/atom = 78.8629 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:00:03 +Total wall time: 0:00:00 diff --git a/examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1 b/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.1 similarity index 56% rename from examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1 rename to examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.1 index 7be22a7f60..91731438de 100644 --- a/examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.1 +++ b/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.1 @@ -1,22 +1,11 @@ --------------------------------------------------------------------------- -[[5635,1],0]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) +LAMMPS (24 Oct 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00226572 secs + Time spent = 0.00311494 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -37,20 +26,20 @@ Per MPI rank memory allocation (min/avg/max) = 19.23 | 19.23 | 19.23 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.26274 on 1 procs for 100 steps with 32000 atoms +Loop time of 2.22646 on 1 procs for 100 steps with 32000 atoms -Performance: 3.818 ns/day, 6.285 hours/ns, 44.194 timesteps/s -99.0% CPU use with 1 MPI tasks x no OpenMP threads +Performance: 3.881 ns/day, 6.185 hours/ns, 44.914 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 | 2.0589 | 2.0589 | 2.0589 | 0.0 | 90.99 -Neigh | 0.15362 | 0.15362 | 0.15362 | 0.0 | 6.79 -Comm | 0.012277 | 0.012277 | 0.012277 | 0.0 | 0.54 -Output | 0.0003387 | 0.0003387 | 0.0003387 | 0.0 | 0.01 -Modify | 0.02416 | 0.02416 | 0.02416 | 0.0 | 1.07 -Other | | 0.01346 | | | 0.59 +Pair | 2.0344 | 2.0344 | 2.0344 | 0.0 | 91.38 +Neigh | 0.14575 | 0.14575 | 0.14575 | 0.0 | 6.55 +Comm | 0.01127 | 0.01127 | 0.01127 | 0.0 | 0.51 +Output | 0.000103 | 0.000103 | 0.000103 | 0.0 | 0.00 +Modify | 0.024057 | 0.024057 | 0.024057 | 0.0 | 1.08 +Other | | 0.01083 | | | 0.49 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4 b/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.4 similarity index 55% rename from examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4 rename to examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.4 index d910afbbc2..92eb8ba8bc 100644 --- a/examples/kim/log.11Jul2018.kim.lj.lmp.newton-on.ubuntu.4 +++ b/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.4 @@ -1,22 +1,11 @@ --------------------------------------------------------------------------- -[[5659,1],0]: A high-performance Open MPI point-to-point messaging module -was unable to find any relevant network interfaces: - -Module: OpenFabrics (openib) - Host: ubuntu-artful - -Another transport will be used instead, although this may result in -lower performance. - -NOTE: You can disable this warning by setting the MCA parameter -btl_base_warn_component_unused to 0. --------------------------------------------------------------------------- -LAMMPS (22 Jun 2018) +LAMMPS (24 Oct 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.00213171 secs + Time spent = 0.000946045 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -37,20 +26,20 @@ Per MPI rank memory allocation (min/avg/max) = 7.632 | 7.632 | 7.632 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.44628 on 4 procs for 100 steps with 32000 atoms +Loop time of 0.639437 on 4 procs for 100 steps with 32000 atoms -Performance: 3.532 ns/day, 6.795 hours/ns, 40.878 timesteps/s -24.2% CPU use with 4 MPI tasks x no OpenMP threads +Performance: 13.512 ns/day, 1.776 hours/ns, 156.388 timesteps/s +99.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.98717 | 1.0434 | 1.1582 | 6.6 | 42.65 -Neigh | 0.10195 | 0.12588 | 0.15258 | 5.2 | 5.15 -Comm | 1.1525 | 1.2449 | 1.3061 | 5.1 | 50.89 -Output | 0.0005828 | 0.00075188 | 0.00087256 | 0.0 | 0.03 -Modify | 0.0057955 | 0.0059132 | 0.006044 | 0.1 | 0.24 -Other | | 0.02542 | | | 1.04 +Pair | 0.55655 | 0.55752 | 0.55833 | 0.1 | 87.19 +Neigh | 0.040557 | 0.040752 | 0.041148 | 0.1 | 6.37 +Comm | 0.024693 | 0.025886 | 0.026853 | 0.5 | 4.05 +Output | 4.6015e-05 | 5.1558e-05 | 6.0081e-05 | 0.0 | 0.01 +Modify | 0.0088108 | 0.0089263 | 0.0090554 | 0.1 | 1.40 +Other | | 0.006306 | | | 0.99 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 @@ -63,4 +52,4 @@ Total # of neighbors = 2126875 Ave neighs/atom = 66.4648 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:00:02 +Total wall time: 0:00:00 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.newton-off.1 b/examples/kim/log.12Dec2018.in.kim.lj.newton-off.1 new file mode 100644 index 0000000000..c25368b917 --- /dev/null +++ b/examples/kim/log.12Dec2018.in.kim.lj.newton-off.1 @@ -0,0 +1,59 @@ +LAMMPS (24 Oct 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 1 by 1 MPI processor grid +Created 32000 atoms + Time spent = 0.00450015 secs +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: full, newton off, cut 8.45 + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 28.51 | 28.51 | 28.51 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 3.35585 on 1 procs for 100 steps with 32000 atoms + +Performance: 2.575 ns/day, 9.322 hours/ns, 29.799 timesteps/s +99.2% CPU use with 1 MPI tasks x 1 OpenMP threads + +MPI task timing breakdown: +Section | min time | avg time | max time |%varavg| %total +--------------------------------------------------------------- +Pair | 2.9239 | 2.9239 | 2.9239 | 0.0 | 87.13 +Neigh | 0.38492 | 0.38492 | 0.38492 | 0.0 | 11.47 +Comm | 0.0072038 | 0.0072038 | 0.0072038 | 0.0 | 0.21 +Output | 0.00010204 | 0.00010204 | 0.00010204 | 0.0 | 0.00 +Modify | 0.028316 | 0.028316 | 0.028316 | 0.0 | 0.84 +Other | | 0.01146 | | | 0.34 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 19911 ave 19911 max 19911 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 4.25375e+06 ave 4.25375e+06 max 4.25375e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 4253750 +Ave neighs/atom = 132.93 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.newton-off.4 b/examples/kim/log.12Dec2018.in.kim.lj.newton-off.4 new file mode 100644 index 0000000000..c8c52d6e09 --- /dev/null +++ b/examples/kim/log.12Dec2018.in.kim.lj.newton-off.4 @@ -0,0 +1,65 @@ +LAMMPS (24 Oct 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 2 by 2 MPI processor grid +Created 32000 atoms + Time spent = 0.00106215 secs +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: full, newton off, cut 8.45 + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 10.05 | 10.05 | 10.05 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 0.930494 on 4 procs for 100 steps with 32000 atoms + +Performance: 9.285 ns/day, 2.585 hours/ns, 107.470 timesteps/s +99.5% 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.80926 | 0.81195 | 0.81464 | 0.3 | 87.26 +Neigh | 0.089949 | 0.092688 | 0.095287 | 0.8 | 9.96 +Comm | 0.007302 | 0.0074284 | 0.0075471 | 0.1 | 0.80 +Output | 0.00012898 | 0.00014371 | 0.00016093 | 0.0 | 0.02 +Modify | 0.011517 | 0.011761 | 0.011959 | 0.2 | 1.26 +Other | | 0.006522 | | | 0.70 + +Nlocal: 8000 ave 8018 max 7967 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 9131 ave 9164 max 9113 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 1.06344e+06 ave 1.06594e+06 max 1.05881e+06 min +Histogram: 1 0 0 0 0 0 1 0 0 2 + +Total # of neighbors = 4253750 +Ave neighs/atom = 132.93 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.newton-on.1 b/examples/kim/log.12Dec2018.in.kim.lj.newton-on.1 new file mode 100644 index 0000000000..eec26307ac --- /dev/null +++ b/examples/kim/log.12Dec2018.in.kim.lj.newton-on.1 @@ -0,0 +1,59 @@ +LAMMPS (24 Oct 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 1 by 1 MPI processor grid +Created 32000 atoms + Time spent = 0.0030508 secs +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: full, newton off, cut 8.45 + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 28.12 | 28.12 | 28.12 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 2.97001 on 1 procs for 100 steps with 32000 atoms + +Performance: 2.909 ns/day, 8.250 hours/ns, 33.670 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 | 2.5982 | 2.5982 | 2.5982 | 0.0 | 87.48 +Neigh | 0.32516 | 0.32516 | 0.32516 | 0.0 | 10.95 +Comm | 0.012059 | 0.012059 | 0.012059 | 0.0 | 0.41 +Output | 0.000103 | 0.000103 | 0.000103 | 0.0 | 0.00 +Modify | 0.023878 | 0.023878 | 0.023878 | 0.0 | 0.80 +Other | | 0.01058 | | | 0.36 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 19911 ave 19911 max 19911 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 4.25375e+06 ave 4.25375e+06 max 4.25375e+06 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 4253750 +Ave neighs/atom = 132.93 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:03 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.newton-on.4 b/examples/kim/log.12Dec2018.in.kim.lj.newton-on.4 new file mode 100644 index 0000000000..6c0da32ba4 --- /dev/null +++ b/examples/kim/log.12Dec2018.in.kim.lj.newton-on.4 @@ -0,0 +1,65 @@ +LAMMPS (24 Oct 2018) +OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) + using 1 OpenMP thread(s) per MPI task +Lattice spacing in x,y,z = 4.43 4.43 4.43 +Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) + 1 by 2 by 2 MPI processor grid +Created 32000 atoms + Time spent = 0.000946999 secs +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) +WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) +Neighbor list info ... + update every 1 steps, delay 0 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 8.45 + ghost atom cutoff = 8.45 + binsize = 4.225, bins = 21 21 21 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair kim, perpetual + attributes: full, newton off, cut 8.45 + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Setting up Verlet run ... + Unit style : metal + Current step : 0 + Time step : 0.001 +Per MPI rank memory allocation (min/avg/max) = 9.789 | 9.789 | 9.789 Mbytes +Step Temp E_pair E_mol TotEng Press + 0 200 6290.8194 0 7118.0584 129712.25 + 100 95.179725 6718.814 0 7112.496 133346.59 +Loop time of 0.891065 on 4 procs for 100 steps with 32000 atoms + +Performance: 9.696 ns/day, 2.475 hours/ns, 112.225 timesteps/s +99.8% 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.75777 | 0.75864 | 0.75996 | 0.1 | 85.14 +Neigh | 0.088332 | 0.088883 | 0.089737 | 0.2 | 9.97 +Comm | 0.027187 | 0.02829 | 0.029602 | 0.6 | 3.17 +Output | 4.9114e-05 | 5.4777e-05 | 6.6042e-05 | 0.0 | 0.01 +Modify | 0.0088358 | 0.0089488 | 0.0091376 | 0.1 | 1.00 +Other | | 0.00625 | | | 0.70 + +Nlocal: 8000 ave 8018 max 7967 min +Histogram: 1 0 0 0 0 0 1 0 0 2 +Nghost: 9131 ave 9164 max 9113 min +Histogram: 2 0 0 1 0 0 0 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 1.06344e+06 ave 1.06594e+06 max 1.05881e+06 min +Histogram: 1 0 0 0 0 0 1 0 0 2 + +Total # of neighbors = 4253750 +Ave neighs/atom = 132.93 +Neighbor list builds = 3 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/lib/kim/.gitignore b/lib/kim/.gitignore index c1f57fe64c..bfd4b35d87 100644 --- a/lib/kim/.gitignore +++ b/lib/kim/.gitignore @@ -1,3 +1,2 @@ -/Makefile.KIM_DIR -/Makefile.KIM_Config +/kim-prefix.txt /installed-kim-api-* diff --git a/lib/kim/Install.py b/lib/kim/Install.py index 815827b645..b1dcee1a36 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -21,7 +21,7 @@ Syntax from lib dir: python Install.py -b -v version -a kim-name specify one or more options, order does not matter -v = version of KIM API library to use - default = kim-api-v2.0.0-beta.2 (current as of November 2018) + default = kim-api-v2.0.0-beta.3 (current as of December 2018) -b = download and build base KIM API library with example Models this will delete any previous installation in the current folder -n = do NOT download and build base KIM API library. @@ -36,9 +36,9 @@ specify one or more options, order does not matter Examples: make lib-kim args="-b" # install KIM API lib with only example models -make lib-kim args="-a Glue_Ercolessi_Adams_Al__MO_324507536345_002" # Ditto plus one model +make lib-kim args="-a EAM_ErcolessiAdams_1994_Al__MO_324507536345_002" # Ditto plus one model make lib-kim args="-b -a everything" # install KIM API lib with all models -make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_003" # only add one model or model driver +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 @@ -109,7 +109,7 @@ nargs = len(args) if nargs == 0: error() thisdir = os.environ['PWD'] -version = "kim-api-v2.0.0-beta.2" +version = "kim-api-v2-2.0.0-beta.3" buildflag = False everythingflag = False From e538fd5c6d9594edc15554f8bded8cd9baa32704 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 12 Dec 2018 17:14:56 -0700 Subject: [PATCH 0073/1242] 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 540026ca00d4b637e54a3d3892cdf9979a86688b Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sun, 16 Dec 2018 15:53:51 -0600 Subject: [PATCH 0074/1242] Update CMakeLists.txt to avoid merge conflicts --- cmake/CMakeLists.txt | 203 +++++++++++++++++++++++++++++++++---------- 1 file changed, 159 insertions(+), 44 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 4abbeb4732..1936b50a56 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -11,6 +11,10 @@ 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) +# 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 ) +endif() # To avoid conflicts with the conventional Makefile build system, we build everything here file(GLOB LIB_SOURCES ${LAMMPS_SOURCE_DIR}/[^.]*.cpp) @@ -75,6 +79,7 @@ if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS) #release comes with -O3 by default set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) endif(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CXX_FLAGS) +string(TOUPPER "${CMAKE_BUILD_TYPE}" BTYPE) # check for files auto-generated by make-based buildsystem # this is fast, so check for it all the time @@ -171,8 +176,9 @@ set(DEFAULT_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS DIPOLE GRANULAR USER-BOCS USER-CGDNA USER-MESO USER-CGSDK USER-COLVARS USER-DIFFRACTION USER-DPD USER-DRUDE USER-EFF USER-FEP USER-H5MD USER-LB USER-MANIFOLD USER-MEAMC USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE USER-NETCDF - USER-PHONON USER-PTM USER-QTB USER-REAXC USER-SCAFACOS USER-SMD USER-SMTBQ - USER-SPH USER-TALLY USER-UEF USER-VTK USER-QUIP USER-QMMM) + USER-PHONON USER-PLUMED USER-PTM USER-QTB USER-REAXC USER-SCAFACOS + USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK + USER-QUIP USER-QMMM) set(ACCEL_PACKAGES USER-OMP KOKKOS OPT USER-INTEL GPU) set(OTHER_PACKAGES CORESHELL QEQ) foreach(PKG ${DEFAULT_PACKAGES}) @@ -215,7 +221,7 @@ else() endif() -set(LAMMPS_SIZES "smallbig" CACHE STRING "LAMMPS size limit") +set(LAMMPS_SIZES "smallbig" CACHE STRING "LAMMPS integer sizes (smallsmall: all 32-bit, smallbig: 64-bit #atoms #timesteps, bigbig: also 64-bit imageint, 64-bit atom ids)") set(LAMMPS_SIZES_VALUES smallbig bigbig smallsmall) set_property(CACHE LAMMPS_SIZES PROPERTY STRINGS ${LAMMPS_SIZES_VALUES}) validate_option(LAMMPS_SIZES LAMMPS_SIZES_VALUES) @@ -303,7 +309,7 @@ pkg_depends(USER-SCAFACOS MPI) find_package(OpenMP QUIET) option(BUILD_OMP "Build with OpenMP support" ${OpenMP_FOUND}) -if(BUILD_OMP OR PKG_USER-OMP OR PKG_KOKKOS OR PKG_USER-INTEL) +if(BUILD_OMP OR PKG_KOKKOS OR PKG_USER-INTEL) find_package(OpenMP REQUIRED) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") @@ -421,16 +427,30 @@ if(WITH_FFMPEG) add_definitions(-DLAMMPS_FFMPEG) endif() +if(BUILD_SHARED_LIBS) + set(CONFIGURE_REQUEST_PIC "--with-pic") + set(CMAKE_REQUEST_PIC "-DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}") + set(CUDA_REQUEST_PIC "-Xcompiler ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") +else() + set(CONFIGURE_REQUEST_PIC) + set(CMAKE_REQUEST_PIC) + set(CUDA_REQUEST_PIC) +endif() + + if(PKG_VORONOI) - option(DOWNLOAD_VORO "Download voro++ (instead of using the system's one)" OFF) + option(DOWNLOAD_VORO "Download and compile the Voro++ library instead of using an already installed one" OFF) if(DOWNLOAD_VORO) + message(STATUS "Voro++ download requested - we will build our own") include(ExternalProject) if(BUILD_SHARED_LIBS) - set(VORO_BUILD_OPTIONS "CFLAGS=-fPIC") + set(VORO_BUILD_CFLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS} ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BTYPE}}") else() - set(VORO_BUILD_OPTIONS) + set(VORO_BUILD_CFLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${BTYPE}}") endif() + string(APPEND VORO_BUILD_CFLAGS ${CMAKE_CXX_FLAGS}) + set(VORO_BUILD_OPTIONS CXX=${CMAKE_CXX_COMPILER} CFLAGS=${VORO_BUILD_CFLAGS}) ExternalProject_Add(voro_build URL http://math.lbl.gov/voro++/download/dir/voro++-0.4.6.tar.gz @@ -444,7 +464,7 @@ if(PKG_VORONOI) else() find_package(VORO) if(NOT VORO_FOUND) - message(FATAL_ERROR "VORO not found, help CMake to find it by setting VORO_LIBRARY and VORO_INCLUDE_DIR, or set DOWNLOAD_VORO=ON to download it") + message(FATAL_ERROR "Voro++ library not found. Help CMake to find it by setting VORO_LIBRARY and VORO_INCLUDE_DIR, or set DOWNLOAD_VORO=ON to download it") endif() endif() include_directories(${VORO_INCLUDE_DIRS}) @@ -452,26 +472,26 @@ if(PKG_VORONOI) endif() if(PKG_LATTE) - option(DOWNLOAD_LATTE "Download latte (instead of using the system's one)" OFF) + option(DOWNLOAD_LATTE "Download the LATTE library instead of using an already installed one" OFF) if(DOWNLOAD_LATTE) if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR message(FATAL_ERROR "For downlading LATTE you need at least cmake-3.7") endif() - message(STATUS "LATTE not found - we will build our own") + message(STATUS "LATTE download requested - we will build our own") include(ExternalProject) ExternalProject_Add(latte_build URL https://github.com/lanl/LATTE/archive/v1.2.1.tar.gz URL_MD5 85ac414fdada2d04619c8f936344df14 SOURCE_SUBDIR cmake - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= -DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE} - ) + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= ${CMAKE_REQUEST_PIC} + ) ExternalProject_get_property(latte_build INSTALL_DIR) set(LATTE_LIBRARIES ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/liblatte.a) list(APPEND LAMMPS_DEPS latte_build) else() find_package(LATTE) if(NOT LATTE_FOUND) - message(FATAL_ERROR "LATTE not found, help CMake to find it by setting LATTE_LIBRARY, or set DOWNLOAD_LATTE=ON to download it") + message(FATAL_ERROR "LATTE library not found, help CMake to find it by setting LATTE_LIBRARY, or set DOWNLOAD_LATTE=ON to download it") endif() endif() list(APPEND LAMMPS_LINK_LIBS ${LATTE_LIBRARIES} ${LAPACK_LIBRARIES}) @@ -479,24 +499,22 @@ endif() if(PKG_USER-SCAFACOS) find_package(GSL REQUIRED) - option(DOWNLOAD_SCAFACOS "Download ScaFaCoS (instead of using the system's one)" OFF) + option(DOWNLOAD_SCAFACOS "Download ScaFaCoS library instead of using an already installed one" OFF) if(DOWNLOAD_SCAFACOS) + message(STATUS "ScaFaCoS download requested - we will build our own") include(ExternalProject) ExternalProject_Add(scafacos_build URL https://github.com/scafacos/scafacos/releases/download/v1.0.1/scafacos-1.0.1.tar.gz URL_MD5 bd46d74e3296bd8a444d731bb10c1738 - CONFIGURE_COMMAND /configure --prefix= - --disable-doc + CONFIGURE_COMMAND /configure --prefix= --disable-doc --enable-fcs-solvers=fmm,p2nfft,direct,ewald,p3m - --with-internal-fftw - --with-internal-pfft - --with-internal-pnfft - $<$:--with-pic> + --with-internal-fftw --with-internal-pfft + --with-internal-pnfft ${CONFIGURE_REQUEST_PIC} FC=${CMAKE_MPI_Fortran_COMPILER} CXX=${CMAKE_MPI_CXX_COMPILER} CC=${CMAKE_MPI_C_COMPILER} F77= - ) + ) ExternalProject_get_property(scafacos_build INSTALL_DIR) set(SCAFACOS_BUILD_DIR ${INSTALL_DIR}) set(SCAFACOS_INCLUDE_DIRS ${SCAFACOS_BUILD_DIR}/include) @@ -528,6 +546,54 @@ if(PKG_USER-SCAFACOS) include_directories(${SCAFACOS_INCLUDE_DIRS}) endif() +if(PKG_USER-PLUMED) + find_package(GSL REQUIRED) + set(PLUMED_MODE "static" CACHE STRING "Linkage mode for Plumed2 library") + set(PLUMED_MODE_VALUES static shared runtime) + set_property(CACHE PLUMED_MODE PROPERTY STRINGS ${PLUMED_MODE_VALUES}) + validate_option(PLUMED_MODE PLUMED_MODE_VALUES) + string(TOUPPER ${PLUMED_MODE} PLUMED_MODE) + + option(DOWNLOAD_PLUMED "Download Plumed package instead of using an already installed one" OFF) + if(DOWNLOAD_PLUMED) + message(STATUS "PLUMED download requested - we will build our own") + include(ExternalProject) + ExternalProject_Add(plumed_build + URL https://github.com/plumed/plumed2/releases/download/v2.4.3/plumed-src-2.4.3.tgz + URL_MD5 b1be7c48971627febc11c61b70767fc5 + BUILD_IN_SOURCE 1 + CONFIGURE_COMMAND /configure --prefix= ${CONFIGURE_REQUEST_PIC}) + ExternalProject_get_property(plumed_build INSTALL_DIR) + set(PLUMED_INSTALL_DIR ${INSTALL_DIR}) + list(APPEND LAMMPS_DEPS plumed_build) + if(PLUMED_MODE STREQUAL "STATIC") + add_definitions(-D__PLUMED_WRAPPER_CXX=1) + list(APPEND LAMMPS_LINK_LIBS ${PLUMED_INSTALL_DIR}/lib/plumed/obj/kernel.o + "${PLUMED_INSTALL_DIR}/lib/plumed/obj/PlumedStatic.o" ${GSL_LIBRARIES} ${CMAKE_DL_LIBS}) + elseif(PLUMED_MODE STREQUAL "SHARED") + list(APPEND LAMMPS_LINK_LIBS ${PLUMED_INSTALL_DIR}/lib/libplumed.so ${CMAKE_DL_LIBS}) + elseif(PLUMED_MODE STREQUAL "RUNTIME") + add_definitions(-D__PLUMED_HAS_DLOPEN=1 -D__PLUMED_DEFAULT_KERNEL=${PLUMED_INSTALL_DIR}/lib/libplumedKernel.so) + list(APPEND LAMMPS_LINK_LIBS ${PLUMED_INSTALL_DIR}/lib/libplumedWrapper.a -rdynamic ${CMAKE_DL_LIBS}) + endif() + set(PLUMED_INCLUDE_DIRS "${PLUMED_INSTALL_DIR}/include") + else() + find_package(PkgConfig REQUIRED) + pkg_check_modules(PLUMED plumed REQUIRED) + if(PLUMED_MODE STREQUAL "STATIC") + add_definitions(-D__PLUMED_WRAPPER_CXX=1) + include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.static) + elseif(PLUMED_MODE STREQUAL "SHARED") + include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.shared) + elseif(PLUMED_MODE STREQUAL "RUNTIME") + add_definitions(-D__PLUMED_HAS_DLOPEN=1 -D__PLUMED_DEFAULT_KERNEL=${PLUMED_LIBDIR}/libplumedKernel.so) + include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.runtime) + endif() + list(APPEND LAMMPS_LINK_LIBS ${PLUMED_LOAD}) + endif() + include_directories(${PLUMED_INCLUDE_DIRS}) +endif() + if(PKG_USER-MOLFILE) add_library(molfile INTERFACE) target_include_directories(molfile INTERFACE ${LAMMPS_LIB_SOURCE_DIR}/molfile) @@ -543,8 +609,9 @@ if(PKG_USER-NETCDF) endif() if(PKG_USER-SMD) - option(DOWNLOAD_EIGEN3 "Download Eigen3 (instead of using the system's one)" OFF) + option(DOWNLOAD_EIGEN3 "Download Eigen3 instead of using an already installed one)" OFF) if(DOWNLOAD_EIGEN3) + message(STATUS "Eigen3 download requested - we will build our own") include(ExternalProject) ExternalProject_Add(Eigen3_build URL http://bitbucket.org/eigen/eigen/get/3.3.4.tar.gz @@ -584,8 +651,9 @@ if(PKG_USER-VTK) endif() if(PKG_KIM) - option(DOWNLOAD_KIM "Download kim-api (instead of using the system's one)" OFF) + 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") enable_language(C) enable_language(Fortran) include(ExternalProject) @@ -606,7 +674,7 @@ if(PKG_KIM) else() find_package(KIM-API-V2) if(NOT KIM-API-V2_FOUND) - message(FATAL_ERROR "KIM not found, help CMake to find it by setting PKG_CONFIG_PATH, or set DOWNLOAD_KIM=ON to download it") + 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") endif() endif() list(APPEND LAMMPS_LINK_LIBS "${KIM-API-V2_LDFLAGS}") @@ -619,12 +687,7 @@ if(PKG_MESSAGE) ${LAMMPS_LIB_SOURCE_DIR}/message/cslib/[^.]*.c ${LAMMPS_LIB_SOURCE_DIR}/message/cslib/[^.]*.cpp) - if(BUILD_SHARED_LIBS) - add_library(cslib SHARED ${cslib_SOURCES}) - else() - add_library(cslib STATIC ${cslib_SOURCES}) - endif() - + add_library(cslib STATIC ${cslib_SOURCES}) if(BUILD_MPI) target_compile_definitions(cslib PRIVATE -DMPI_YES) set_target_properties(cslib PROPERTIES OUTPUT_NAME "csmpi") @@ -649,10 +712,10 @@ endif() if(PKG_MSCG) find_package(GSL REQUIRED) - option(DOWNLOAD_MSCG "Download latte (instead of using the system's one)" OFF) + option(DOWNLOAD_MSCG "Download MSCG library instead of using an already installed one)" OFF) if(DOWNLOAD_MSCG) if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR - message(FATAL_ERROR "For downlading LATTE you need at least cmake-3.7") + message(FATAL_ERROR "For downlading MSCG you need at least cmake-3.7") endif() include(ExternalProject) if(NOT LAPACK_FOUND) @@ -662,7 +725,7 @@ if(PKG_MSCG) URL https://github.com/uchicago-voth/MSCG-release/archive/1.7.3.1.tar.gz URL_MD5 8c45e269ee13f60b303edd7823866a91 SOURCE_SUBDIR src/CMake - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= -DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE} ${EXTRA_MSCG_OPTS} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= ${CMAKE_REQUEST_PIC} ${EXTRA_MSCG_OPTS} BUILD_COMMAND make mscg INSTALL_COMMAND "" ) ExternalProject_get_property(mscg_build BINARY_DIR) @@ -710,7 +773,7 @@ set(MATH_LIBRARIES "m" CACHE STRING "math library") mark_as_advanced( MATH_LIBRARIES ) include(CheckLibraryExists) if (CMAKE_VERSION VERSION_LESS "3.4") - enable_language(C) # check_library_exists isn't supported without a c compiler before v3.4 + enable_language(C) # check_library_exists isn't supported without a C compiler before v3.4 endif() # RB: disabled this check because it breaks with KOKKOS CUDA enabled #foreach(FUNC sin cos) @@ -748,6 +811,13 @@ foreach(PKG ${DEFAULT_PACKAGES}) endif() endforeach() +# packages that need defines set +foreach(PKG MPIIO) + if(PKG_${PKG}) + add_definitions(-DLMP_${PKG}) + endif() +endforeach() + # dedicated check for entire contents of accelerator packages foreach(PKG ${ACCEL_PACKAGES}) set(${PKG}_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/${PKG}) @@ -776,7 +846,7 @@ foreach(SIMPLE_LIB REAX MEAM POEMS USER-ATC USER-AWPMD USER-COLVARS USER-H5MD if(PKG_LIB STREQUAL awpmd) target_include_directories(awpmd PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/awpmd/systems/interact ${LAMMPS_LIB_SOURCE_DIR}/awpmd/ivutils/include) elseif(PKG_LIB STREQUAL h5md) - target_include_directories(h5md PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/h5md/include) + target_include_directories(h5md PUBLIC ${LAMMPS_LIB_SOURCE_DIR}/h5md/include ${HDF5_INCLUDE_DIRS}) elseif(PKG_LIB STREQUAL colvars) target_compile_options(colvars PRIVATE -DLEPTON) target_include_directories(colvars PRIVATE ${LAMMPS_LIB_SOURCE_DIR}/colvars/lepton/include) @@ -792,6 +862,9 @@ if(PKG_USER-AWPMD) endif() if(PKG_USER-ATC) + if(LAMMPS_SIZES STREQUAL BIGBIG) + message(FATAL_ERROR "The USER-ATC Package is not compatible with -DLAMMPS_BIGBIG") + endif() target_link_libraries(atc ${LAPACK_LIBRARIES}) endif() @@ -799,6 +872,7 @@ if(PKG_USER-H5MD) find_package(HDF5 REQUIRED) target_link_libraries(h5md ${HDF5_LIBRARIES}) target_include_directories(h5md PRIVATE ${HDF5_INCLUDE_DIRS}) + include_directories(${HDF5_INCLUDE_DIRS}) endif() @@ -884,6 +958,20 @@ if(PKG_USER-OMP) include_directories(${USER-OMP_SOURCES_DIR}) endif() +# Fix rigid/meso requires RIGID to be installed +if(PKG_USER-SDPD) + set(USER-SDPD_SOURCES_DIR ${LAMMPS_SOURCE_DIR}/USER-SDPD) + + get_property(hlist GLOBAL PROPERTY FIX) + if(NOT PKG_RIGID) + list(REMOVE_ITEM hlist ${USER-SDPD_SOURCES_DIR}/fix_rigid_meso.h) + list(REMOVE_ITEM LIB_SOURCES ${USER-SDPD_SOURCES_DIR}/fix_rigid_meso.cpp) + endif() + set_property(GLOBAL PROPERTY FIX "${hlist}") + + include_directories(${USER-SDPD_SOURCES_DIR}) +endif() + if(PKG_KOKKOS) set(LAMMPS_LIB_KOKKOS_SRC_DIR ${LAMMPS_LIB_SOURCE_DIR}/kokkos) set(LAMMPS_LIB_KOKKOS_BIN_DIR ${LAMMPS_LIB_BINARY_DIR}/kokkos) @@ -961,7 +1049,7 @@ if(PKG_USER-INTEL) endif() if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 16) - message(FATAL_ERROR "USER-INTEL is needed at least 2016 intel compiler, found ${CMAKE_CXX_COMPILER_VERSION}") + message(FATAL_ERROR "USER-INTEL needs at least a 2016 intel compiler, found ${CMAKE_CXX_COMPILER_VERSION}") endif() if(NOT BUILD_OMP) @@ -1061,11 +1149,11 @@ if(PKG_GPU) find_package(CUDA REQUIRED) find_program(BIN2C bin2c) if(NOT BIN2C) - message(FATAL_ERROR "Couldn't find bin2c, use -DBIN2C helping cmake to find it.") + 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) - set(GPU_ARCH "sm_30" CACHE STRING "LAMMPS GPU CUDA SM architecture (e.g. sm_60)") + set(GPU_ARCH "sm_30" CACHE STRING "LAMMPS GPU CUDA SM primary architecture (e.g. sm_60)") file(GLOB GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/[^.]*.cu ${CMAKE_CURRENT_SOURCE_DIR}/gpu/[^.]*.cu) list(REMOVE_ITEM GPU_LIB_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/lal_pppm.cu) @@ -1078,11 +1166,39 @@ if(PKG_GPU) file(GLOB GPU_LIB_CUDPP_CU ${LAMMPS_LIB_SOURCE_DIR}/gpu/cudpp_mini/[^.]*.cu) endif() - cuda_compile_cubin(GPU_GEN_OBJS ${GPU_LIB_CU} OPTIONS - -DUNIX -O3 -Xptxas -v --use_fast_math -DNV_KERNEL -DUCL_CUDADR -arch=${GPU_ARCH} -D_${GPU_PREC_SETTING}) + # build arch/gencode commands for nvcc based on CUDA toolkit version and use choice + # --arch translates directly instead of JIT, so this should be for the preferred or most common architecture + set(GPU_CUDA_GENCODE "-arch=${GPU_ARCH} ") + # Fermi (GPU Arch 2.x) is supported by CUDA 3.2 to CUDA 8.0 + if((CUDA_VERSION VERSION_GREATER "3.1") AND (CUDA_VERSION VERSION_LESS "9.0")) + string(APPEND GPU_CUDA_GENCODE "-gencode arch=compute_20,code=[sm_20,compute_20] ") + endif() + # Kepler (GPU Arch 3.x) is supported by CUDA 5 and later + if(CUDA_VERSION VERSION_GREATER "4.9") + string(APPEND GPU_CUDA_GENCODE "-gencode arch=compute_30,code=[sm_30,compute_30] -gencode arch=compute_35,code=[sm_35,compute_35] ") + endif() + # Maxwell (GPU Arch 5.x) is supported by CUDA 6 and later + if(CUDA_VERSION VERSION_GREATER "5.9") + string(APPEND GPU_CUDA_GENCODE "-gencode arch=compute_50,code=[sm_50,compute_50] -gencode arch=compute_52,code=[sm_52,compute_52] ") + endif() + # Pascal (GPU Arch 6.x) is supported by CUDA 8 and later + if(CUDA_VERSION VERSION_GREATER "7.9") + string(APPEND GPU_CUDA_GENCODE "-gencode arch=compute_60,code=[sm_60,compute_60] -gencode arch=compute_61,code=[sm_61,compute_61] ") + endif() + # Volta (GPU Arch 7.0) is supported by CUDA 9 and later + if(CUDA_VERSION VERSION_GREATER "8.9") + string(APPEND GPU_CUDA_GENCODE "-gencode arch=compute_70,code=[sm_70,compute_70] ") + endif() + # Turing (GPU Arch 7.5) is supported by CUDA 10 and later + if(CUDA_VERSION VERSION_GREATER "9.9") + string(APPEND GPU_CUDA_GENCODE "-gencode arch=compute_75,code=[sm_75,compute_75] ") + endif() - cuda_compile(GPU_OBJS ${GPU_LIB_CUDPP_CU} OPTIONS $<$:-Xcompiler=-fPIC> - -DUNIX -O3 -Xptxas -v --use_fast_math -DUCL_CUDADR -arch=${GPU_ARCH} -D_${GPU_PREC_SETTING}) + cuda_compile_fatbin(GPU_GEN_OBJS ${GPU_LIB_CU} OPTIONS + -DUNIX -O3 --use_fast_math -Wno-deprecated-gpu-targets -DNV_KERNEL -DUCL_CUDADR ${GPU_CUDA_GENCODE} -D_${GPU_PREC_SETTING}) + + cuda_compile(GPU_OBJS ${GPU_LIB_CUDPP_CU} OPTIONS ${CUDA_REQUEST_PIC} + -DUNIX -O3 --use_fast_math -Wno-deprecated-gpu-targets -DUCL_CUDADR ${GPU_CUDA_GENCODE} -D_${GPU_PREC_SETTING}) foreach(CU_OBJ ${GPU_GEN_OBJS}) get_filename_component(CU_NAME ${CU_OBJ} NAME_WE) @@ -1351,7 +1467,6 @@ foreach(PKG ${DEFAULT_PACKAGES} ${ACCEL_PACKAGES} ${OTHER_PACKAGES}) endif() endforeach() -string(TOUPPER "${CMAKE_BUILD_TYPE}" BTYPE) get_directory_property(CPPFLAGS DIRECTORY ${CMAKE_SOURCE_DIR} COMPILE_DEFINITIONS) include(FeatureSummary) feature_summary(DESCRIPTION "The following packages have been found:" WHAT PACKAGES_FOUND) @@ -1382,7 +1497,7 @@ endif() if(CMAKE_EXE_LINKER_FLAGS) message(STATUS "Linker flags: Executable ${CMAKE_EXE_LINKER_FLAGS}") - endif() +endif() if(BUILD_SHARED_LIBS) message(STATUS "Shared libraries ${CMAKE_SHARED_LINKER_FLAGS}") else() From 67782d71a8126512ced150224b96aea3cea67817 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Tue, 18 Dec 2018 21:23:04 -0700 Subject: [PATCH 0075/1242] 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 0076/1242] 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 0077/1242] 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 0078/1242] 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 0079/1242] 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 0080/1242] 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 41ccf832bf83e11b1d3898e0437c9ab41d011f5c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 30 Dec 2018 04:30:58 -0500 Subject: [PATCH 0081/1242] update log files --- ...0-0.g++.1 => log.12Dec18.airebo-0-0.g++.1} | 31 +++++----- ...0-0.g++.4 => log.12Dec18.airebo-0-0.g++.4} | 33 ++++++----- ...ebo-m.g++.1 => log.12Dec18.airebo-m.g++.1} | 54 +++++++++--------- ...ebo-m.g++.4 => log.12Dec18.airebo-m.g++.4} | 54 +++++++++--------- ....airebo.g++.1 => log.12Dec18.airebo.g++.1} | 56 +++++++++---------- ....airebo.g++.4 => log.12Dec18.airebo.g++.4} | 56 +++++++++---------- ...18.rebo2.g++.1 => log.12Dec18.rebo2.g++.1} | 27 +++++---- ...18.rebo2.g++.4 => log.12Dec18.rebo2.g++.4} | 27 +++++---- 8 files changed, 167 insertions(+), 171 deletions(-) rename examples/airebo/{log.29Jun18.airebo-0-0.g++.1 => log.12Dec18.airebo-0-0.g++.1} (77%) rename examples/airebo/{log.29Jun18.airebo-0-0.g++.4 => log.12Dec18.airebo-0-0.g++.4} (76%) rename examples/airebo/{log.27Nov18.airebo-m.g++.1 => log.12Dec18.airebo-m.g++.1} (67%) rename examples/airebo/{log.27Nov18.airebo-m.g++.4 => log.12Dec18.airebo-m.g++.4} (67%) rename examples/airebo/{log.27Nov18.airebo.g++.1 => log.12Dec18.airebo.g++.1} (67%) rename examples/airebo/{log.27Nov18.airebo.g++.4 => log.12Dec18.airebo.g++.4} (66%) rename examples/airebo/{log.29Jun18.rebo2.g++.1 => log.12Dec18.rebo2.g++.1} (76%) rename examples/airebo/{log.29Jun18.rebo2.g++.4 => log.12Dec18.rebo2.g++.4} (76%) diff --git a/examples/airebo/log.29Jun18.airebo-0-0.g++.1 b/examples/airebo/log.12Dec18.airebo-0-0.g++.1 similarity index 77% rename from examples/airebo/log.29Jun18.airebo-0-0.g++.1 rename to examples/airebo/log.12Dec18.airebo-0-0.g++.1 index d61c8e8b34..7efacc2dd7 100644 --- a/examples/airebo/log.29Jun18.airebo-0-0.g++.1 +++ b/examples/airebo/log.12Dec18.airebo-0-0.g++.1 @@ -1,5 +1,4 @@ -LAMMPS (29 Jun 2018) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) +LAMMPS (12 Dec 2018) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark @@ -16,7 +15,7 @@ replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 1 by 1 by 1 MPI processor grid 32640 atoms - Time spent = 0.00136042 secs + Time spent = 0.00132823 secs neighbor 0.5 bin neigh_modify delay 5 every 1 @@ -46,31 +45,31 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 34.21 | 34.21 | 34.21 Mbytes Step Temp E_pair E_mol TotEng Press - 0 300 -138442.83 0 -137177.16 2463.0756 - 10 179.38448 -137931.29 0 -137174.48 15656.689 - 20 206.89283 -138047.05 0 -137174.19 -24047.407 + 0 300 -138442.83 0 -137177.16 2463.0755 + 10 179.38448 -137931.29 0 -137174.48 15656.69 + 20 206.89283 -138047.06 0 -137174.19 -24047.407 30 150.81289 -137807.48 0 -137171.21 -16524.191 40 173.24289 -137902.32 0 -137171.42 -5721.7187 50 151.80722 -137812.37 0 -137171.91 3489.8954 - 60 199.06038 -138013.7 0 -137173.88 17887.024 + 60 199.06038 -138013.7 0 -137173.88 17887.025 70 217.84848 -138093.82 0 -137174.73 -12266.16 - 80 202.34667 -138029.28 0 -137175.59 -7623.6635 + 80 202.34667 -138029.28 0 -137175.59 -7623.6634 90 194.92367 -137997.12 0 -137174.75 -32277.173 100 185.2078 -137954.64 0 -137173.26 -6888.5104 -Loop time of 5.00753 on 1 procs for 100 steps with 32640 atoms +Loop time of 4.96876 on 1 procs for 100 steps with 32640 atoms -Performance: 0.863 ns/day, 27.820 hours/ns, 19.970 timesteps/s +Performance: 0.869 ns/day, 27.604 hours/ns, 20.126 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 | 3.4898 | 3.4898 | 3.4898 | 0.0 | 69.69 -Neigh | 1.4697 | 1.4697 | 1.4697 | 0.0 | 29.35 -Comm | 0.015885 | 0.015885 | 0.015885 | 0.0 | 0.32 -Output | 0.00096607 | 0.00096607 | 0.00096607 | 0.0 | 0.02 -Modify | 0.021901 | 0.021901 | 0.021901 | 0.0 | 0.44 -Other | | 0.009297 | | | 0.19 +Pair | 3.4535 | 3.4535 | 3.4535 | 0.0 | 69.50 +Neigh | 1.4688 | 1.4688 | 1.4688 | 0.0 | 29.56 +Comm | 0.015106 | 0.015106 | 0.015106 | 0.0 | 0.30 +Output | 0.00098944 | 0.00098944 | 0.00098944 | 0.0 | 0.02 +Modify | 0.021631 | 0.021631 | 0.021631 | 0.0 | 0.44 +Other | | 0.008734 | | | 0.18 Nlocal: 32640 ave 32640 max 32640 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/airebo/log.29Jun18.airebo-0-0.g++.4 b/examples/airebo/log.12Dec18.airebo-0-0.g++.4 similarity index 76% rename from examples/airebo/log.29Jun18.airebo-0-0.g++.4 rename to examples/airebo/log.12Dec18.airebo-0-0.g++.4 index 72d6fdd211..e2afb10452 100644 --- a/examples/airebo/log.29Jun18.airebo-0-0.g++.4 +++ b/examples/airebo/log.12Dec18.airebo-0-0.g++.4 @@ -1,5 +1,4 @@ -LAMMPS (29 Jun 2018) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) +LAMMPS (12 Dec 2018) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark @@ -16,7 +15,7 @@ replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 2 by 2 by 1 MPI processor grid 32640 atoms - Time spent = 0.000609159 secs + Time spent = 0.000664234 secs neighbor 0.5 bin neigh_modify delay 5 every 1 @@ -46,31 +45,31 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 11.75 | 11.94 | 12.13 Mbytes Step Temp E_pair E_mol TotEng Press - 0 300 -138442.83 0 -137177.16 2463.0756 - 10 179.38448 -137931.29 0 -137174.48 15656.689 - 20 206.89283 -138047.05 0 -137174.19 -24047.407 + 0 300 -138442.83 0 -137177.16 2463.0755 + 10 179.38448 -137931.29 0 -137174.48 15656.69 + 20 206.89283 -138047.06 0 -137174.19 -24047.407 30 150.81289 -137807.48 0 -137171.21 -16524.191 40 173.24289 -137902.32 0 -137171.42 -5721.7187 50 151.80722 -137812.37 0 -137171.91 3489.8954 - 60 199.06038 -138013.7 0 -137173.88 17887.024 + 60 199.06038 -138013.7 0 -137173.88 17887.025 70 217.84848 -138093.82 0 -137174.73 -12266.16 - 80 202.34667 -138029.28 0 -137175.59 -7623.6635 + 80 202.34667 -138029.28 0 -137175.59 -7623.6634 90 194.92367 -137997.12 0 -137174.75 -32277.173 100 185.2078 -137954.64 0 -137173.26 -6888.5104 -Loop time of 1.50369 on 4 procs for 100 steps with 32640 atoms +Loop time of 1.44469 on 4 procs for 100 steps with 32640 atoms -Performance: 2.873 ns/day, 8.354 hours/ns, 66.503 timesteps/s -98.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 2.990 ns/day, 8.026 hours/ns, 69.219 timesteps/s +99.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.92943 | 0.95749 | 0.97327 | 1.8 | 63.68 -Neigh | 0.456 | 0.46115 | 0.46657 | 0.7 | 30.67 -Comm | 0.048775 | 0.068415 | 0.10077 | 8.2 | 4.55 -Output | 0.00044918 | 0.00073665 | 0.0015814 | 0.0 | 0.05 -Modify | 0.0087936 | 0.0089477 | 0.0091038 | 0.1 | 0.60 -Other | | 0.006951 | | | 0.46 +Pair | 0.92215 | 0.93812 | 0.95363 | 1.6 | 64.94 +Neigh | 0.45592 | 0.45842 | 0.46002 | 0.2 | 31.73 +Comm | 0.016539 | 0.03352 | 0.050276 | 8.6 | 2.32 +Output | 0.00043154 | 0.00059217 | 0.001025 | 0.0 | 0.04 +Modify | 0.0087888 | 0.0090455 | 0.0095809 | 0.3 | 0.63 +Other | | 0.004989 | | | 0.35 Nlocal: 8160 ave 8163 max 8157 min Histogram: 1 1 0 0 0 0 0 0 1 1 diff --git a/examples/airebo/log.27Nov18.airebo-m.g++.1 b/examples/airebo/log.12Dec18.airebo-m.g++.1 similarity index 67% rename from examples/airebo/log.27Nov18.airebo-m.g++.1 rename to examples/airebo/log.12Dec18.airebo-m.g++.1 index 44d8b9d59c..8042130645 100644 --- a/examples/airebo/log.27Nov18.airebo-m.g++.1 +++ b/examples/airebo/log.12Dec18.airebo-m.g++.1 @@ -1,36 +1,36 @@ -LAMMPS (27 Nov 2018) +LAMMPS (12 Dec 2018) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark -units metal -atom_style atomic +units metal +atom_style atomic -read_data data.airebo +read_data data.airebo orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579) 1 by 1 by 1 MPI processor grid reading atoms ... 60 atoms -replicate 17 16 2 +replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 1 by 1 by 1 MPI processor grid 32640 atoms - Time spent = 0.00141144 secs + Time spent = 0.00136471 secs -neighbor 0.5 bin -neigh_modify delay 5 every 1 +neighbor 0.5 bin +neigh_modify delay 5 every 1 -pair_style airebo/morse 3.0 1 1 -pair_coeff * * ../../potentials/CH.airebo-m C H -Reading potential file ../../potentials/CH.airebo-m with DATE: 2016-03-15 +pair_style airebo/morse 3.0 1 1 +pair_coeff * * CH.airebo-m C H +Reading potential file CH.airebo-m with DATE: 2016-03-15 -velocity all create 300.0 761341 +velocity all create 300.0 761341 -fix 1 all nve -timestep 0.0005 +fix 1 all nve +timestep 0.0005 -thermo 10 -run 100 +thermo 10 +run 100 Neighbor list info ... update every 1 steps, delay 5 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -45,7 +45,7 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 106.4 | 106.4 | 106.4 Mbytes Step Temp E_pair E_mol TotEng Press - 0 300 -139283.82 0 -138018.14 152.25271 + 0 300 -139283.82 0 -138018.14 152.25266 10 166.76148 -138718.75 0 -138015.19 17412.343 20 207.7293 -138891.79 0 -138015.4 -19395.339 30 138.54469 -138596.42 0 -138011.92 -11909.248 @@ -55,21 +55,21 @@ Step Temp E_pair E_mol TotEng Press 70 185.72779 -138799.18 0 -138015.61 -10803.744 80 164.28396 -138709.5 0 -138016.4 -1524.7353 90 180.26403 -138776.42 0 -138015.9 -27143.467 - 100 164.05694 -138706.58 0 -138014.44 5157.5516 -Loop time of 64.6107 on 1 procs for 100 steps with 32640 atoms + 100 164.05694 -138706.58 0 -138014.44 5157.5517 +Loop time of 64.5779 on 1 procs for 100 steps with 32640 atoms -Performance: 0.067 ns/day, 358.948 hours/ns, 1.548 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 0.067 ns/day, 358.766 hours/ns, 1.549 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 | 59.916 | 59.916 | 59.916 | 0.0 | 92.73 -Neigh | 4.6347 | 4.6347 | 4.6347 | 0.0 | 7.17 -Comm | 0.025572 | 0.025572 | 0.025572 | 0.0 | 0.04 -Output | 0.00098896 | 0.00098896 | 0.00098896 | 0.0 | 0.00 -Modify | 0.022327 | 0.022327 | 0.022327 | 0.0 | 0.03 -Other | | 0.01076 | | | 0.02 +Pair | 59.905 | 59.905 | 59.905 | 0.0 | 92.76 +Neigh | 4.615 | 4.615 | 4.615 | 0.0 | 7.15 +Comm | 0.024453 | 0.024453 | 0.024453 | 0.0 | 0.04 +Output | 0.00099945 | 0.00099945 | 0.00099945 | 0.0 | 0.00 +Modify | 0.021971 | 0.021971 | 0.021971 | 0.0 | 0.03 +Other | | 0.01029 | | | 0.02 Nlocal: 32640 ave 32640 max 32640 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/airebo/log.27Nov18.airebo-m.g++.4 b/examples/airebo/log.12Dec18.airebo-m.g++.4 similarity index 67% rename from examples/airebo/log.27Nov18.airebo-m.g++.4 rename to examples/airebo/log.12Dec18.airebo-m.g++.4 index a4cc55211b..1aab3b3544 100644 --- a/examples/airebo/log.27Nov18.airebo-m.g++.4 +++ b/examples/airebo/log.12Dec18.airebo-m.g++.4 @@ -1,36 +1,36 @@ -LAMMPS (27 Nov 2018) +LAMMPS (12 Dec 2018) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark -units metal -atom_style atomic +units metal +atom_style atomic -read_data data.airebo +read_data data.airebo orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579) 1 by 1 by 4 MPI processor grid reading atoms ... 60 atoms -replicate 17 16 2 +replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 2 by 2 by 1 MPI processor grid 32640 atoms - Time spent = 0.000637531 secs + Time spent = 0.000692129 secs -neighbor 0.5 bin -neigh_modify delay 5 every 1 +neighbor 0.5 bin +neigh_modify delay 5 every 1 -pair_style airebo/morse 3.0 1 1 -pair_coeff * * ../../potentials/CH.airebo-m C H -Reading potential file ../../potentials/CH.airebo-m with DATE: 2016-03-15 +pair_style airebo/morse 3.0 1 1 +pair_coeff * * CH.airebo-m C H +Reading potential file CH.airebo-m with DATE: 2016-03-15 -velocity all create 300.0 761341 +velocity all create 300.0 761341 -fix 1 all nve -timestep 0.0005 +fix 1 all nve +timestep 0.0005 -thermo 10 -run 100 +thermo 10 +run 100 Neighbor list info ... update every 1 steps, delay 5 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -45,7 +45,7 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 29.37 | 29.75 | 30.13 Mbytes Step Temp E_pair E_mol TotEng Press - 0 300 -139283.82 0 -138018.14 152.25271 + 0 300 -139283.82 0 -138018.14 152.25266 10 166.76148 -138718.75 0 -138015.19 17412.343 20 207.7293 -138891.79 0 -138015.4 -19395.339 30 138.54469 -138596.42 0 -138011.92 -11909.248 @@ -55,21 +55,21 @@ Step Temp E_pair E_mol TotEng Press 70 185.72779 -138799.18 0 -138015.61 -10803.744 80 164.28396 -138709.5 0 -138016.4 -1524.7353 90 180.26403 -138776.42 0 -138015.9 -27143.467 - 100 164.05694 -138706.58 0 -138014.44 5157.5516 -Loop time of 18.1922 on 4 procs for 100 steps with 32640 atoms + 100 164.05694 -138706.58 0 -138014.44 5157.5517 +Loop time of 17.8093 on 4 procs for 100 steps with 32640 atoms -Performance: 0.237 ns/day, 101.068 hours/ns, 5.497 timesteps/s -98.9% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 0.243 ns/day, 98.940 hours/ns, 5.615 timesteps/s +99.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 | 15.968 | 16.084 | 16.308 | 3.4 | 88.41 -Neigh | 1.6017 | 1.6334 | 1.7006 | 3.1 | 8.98 -Comm | 0.1603 | 0.45122 | 0.59951 | 26.0 | 2.48 -Output | 0.00042605 | 0.00073195 | 0.0016003 | 0.0 | 0.00 -Modify | 0.0092106 | 0.010544 | 0.014411 | 2.2 | 0.06 -Other | | 0.01193 | | | 0.07 +Pair | 15.932 | 16.012 | 16.082 | 1.5 | 89.91 +Neigh | 1.5933 | 1.6063 | 1.6173 | 0.7 | 9.02 +Comm | 0.098741 | 0.17402 | 0.2676 | 16.8 | 0.98 +Output | 0.00044513 | 0.00074279 | 0.0016048 | 0.0 | 0.00 +Modify | 0.0088906 | 0.0089375 | 0.008992 | 0.0 | 0.05 +Other | | 0.007106 | | | 0.04 Nlocal: 8160 ave 8167 max 8153 min Histogram: 1 0 1 0 0 0 0 1 0 1 diff --git a/examples/airebo/log.27Nov18.airebo.g++.1 b/examples/airebo/log.12Dec18.airebo.g++.1 similarity index 67% rename from examples/airebo/log.27Nov18.airebo.g++.1 rename to examples/airebo/log.12Dec18.airebo.g++.1 index 3713c8a8f8..ccc156c15b 100644 --- a/examples/airebo/log.27Nov18.airebo.g++.1 +++ b/examples/airebo/log.12Dec18.airebo.g++.1 @@ -1,36 +1,36 @@ -LAMMPS (27 Nov 2018) +LAMMPS (12 Dec 2018) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark -units metal -atom_style atomic +units metal +atom_style atomic -read_data data.airebo +read_data data.airebo orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579) 1 by 1 by 1 MPI processor grid reading atoms ... 60 atoms -replicate 17 16 2 +replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 1 by 1 by 1 MPI processor grid 32640 atoms - Time spent = 0.00144172 secs + Time spent = 0.0013268 secs -neighbor 0.5 bin -neigh_modify delay 5 every 1 +neighbor 0.5 bin +neigh_modify delay 5 every 1 -pair_style airebo 3.0 1 1 -pair_coeff * * ../../potentials/CH.airebo C H -Reading potential file ../../potentials/CH.airebo with DATE: 2011-10-25 +pair_style airebo 3.0 1 1 +pair_coeff * * CH.airebo C H +Reading potential file CH.airebo with DATE: 2011-10-25 -velocity all create 300.0 761341 +velocity all create 300.0 761341 -fix 1 all nve -timestep 0.0005 +fix 1 all nve +timestep 0.0005 -thermo 10 -run 100 +thermo 10 +run 100 Neighbor list info ... update every 1 steps, delay 5 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -45,31 +45,31 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 106.4 | 106.4 | 106.4 Mbytes Step Temp E_pair E_mol TotEng Press - 0 300 -139300.72 0 -138035.04 7988.6647 + 0 300 -139300.72 0 -138035.04 7988.6646 10 161.34683 -138712.9 0 -138032.19 33228.921 20 208.59504 -138912.79 0 -138032.74 -3211.8806 30 139.7513 -138618.85 0 -138029.25 10878.143 40 142.14562 -138629.02 0 -138029.32 14601.302 - 50 114.23401 -138510.95 0 -138029 24691.125 + 50 114.23401 -138510.95 0 -138029 24691.124 60 164.92002 -138726 0 -138030.21 35125.541 70 162.15256 -138715.9 0 -138031.79 5658.7946 80 157.16184 -138695.77 0 -138032.72 19824.698 - 90 196.15907 -138860.65 0 -138033.07 -7950.8462 + 90 196.15907 -138860.65 0 -138033.07 -7950.8463 100 178.31875 -138784.89 0 -138032.57 30997.671 -Loop time of 57.9914 on 1 procs for 100 steps with 32640 atoms +Loop time of 57.482 on 1 procs for 100 steps with 32640 atoms -Performance: 0.074 ns/day, 322.174 hours/ns, 1.724 timesteps/s +Performance: 0.075 ns/day, 319.344 hours/ns, 1.740 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 | 53.275 | 53.275 | 53.275 | 0.0 | 91.87 -Neigh | 4.6548 | 4.6548 | 4.6548 | 0.0 | 8.03 -Comm | 0.026622 | 0.026622 | 0.026622 | 0.0 | 0.05 -Output | 0.00097251 | 0.00097251 | 0.00097251 | 0.0 | 0.00 -Modify | 0.022773 | 0.022773 | 0.022773 | 0.0 | 0.04 -Other | | 0.01089 | | | 0.02 +Pair | 52.796 | 52.796 | 52.796 | 0.0 | 91.85 +Neigh | 4.6286 | 4.6286 | 4.6286 | 0.0 | 8.05 +Comm | 0.024035 | 0.024035 | 0.024035 | 0.0 | 0.04 +Output | 0.00098443 | 0.00098443 | 0.00098443 | 0.0 | 0.00 +Modify | 0.021958 | 0.021958 | 0.021958 | 0.0 | 0.04 +Other | | 0.01014 | | | 0.02 Nlocal: 32640 ave 32640 max 32640 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -84,4 +84,4 @@ Total # of neighbors = 22217840 Ave neighs/atom = 680.694 Neighbor list builds = 8 Dangerous builds = 0 -Total wall time: 0:00:59 +Total wall time: 0:00:58 diff --git a/examples/airebo/log.27Nov18.airebo.g++.4 b/examples/airebo/log.12Dec18.airebo.g++.4 similarity index 66% rename from examples/airebo/log.27Nov18.airebo.g++.4 rename to examples/airebo/log.12Dec18.airebo.g++.4 index 335690684a..fbdd9ed2e1 100644 --- a/examples/airebo/log.27Nov18.airebo.g++.4 +++ b/examples/airebo/log.12Dec18.airebo.g++.4 @@ -1,36 +1,36 @@ -LAMMPS (27 Nov 2018) +LAMMPS (12 Dec 2018) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark -units metal -atom_style atomic +units metal +atom_style atomic -read_data data.airebo +read_data data.airebo orthogonal box = (-2.1 -2.1 0) to (2.1 2.1 25.579) 1 by 1 by 4 MPI processor grid reading atoms ... 60 atoms -replicate 17 16 2 +replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 2 by 2 by 1 MPI processor grid 32640 atoms - Time spent = 0.00262594 secs + Time spent = 0.000614405 secs -neighbor 0.5 bin -neigh_modify delay 5 every 1 +neighbor 0.5 bin +neigh_modify delay 5 every 1 -pair_style airebo 3.0 1 1 -pair_coeff * * ../../potentials/CH.airebo C H -Reading potential file ../../potentials/CH.airebo with DATE: 2011-10-25 +pair_style airebo 3.0 1 1 +pair_coeff * * CH.airebo C H +Reading potential file CH.airebo with DATE: 2011-10-25 -velocity all create 300.0 761341 +velocity all create 300.0 761341 -fix 1 all nve -timestep 0.0005 +fix 1 all nve +timestep 0.0005 -thermo 10 -run 100 +thermo 10 +run 100 Neighbor list info ... update every 1 steps, delay 5 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -45,31 +45,31 @@ Neighbor list info ... bin: standard Per MPI rank memory allocation (min/avg/max) = 29.37 | 29.75 | 30.13 Mbytes Step Temp E_pair E_mol TotEng Press - 0 300 -139300.72 0 -138035.04 7988.6647 + 0 300 -139300.72 0 -138035.04 7988.6646 10 161.34683 -138712.9 0 -138032.19 33228.921 20 208.59504 -138912.79 0 -138032.74 -3211.8806 30 139.7513 -138618.85 0 -138029.25 10878.143 40 142.14562 -138629.02 0 -138029.32 14601.302 - 50 114.23401 -138510.95 0 -138029 24691.125 + 50 114.23401 -138510.95 0 -138029 24691.124 60 164.92002 -138726 0 -138030.21 35125.541 70 162.15256 -138715.9 0 -138031.79 5658.7946 80 157.16184 -138695.77 0 -138032.72 19824.698 - 90 196.15907 -138860.65 0 -138033.07 -7950.8462 + 90 196.15907 -138860.65 0 -138033.07 -7950.8463 100 178.31875 -138784.89 0 -138032.57 30997.671 -Loop time of 16.4395 on 4 procs for 100 steps with 32640 atoms +Loop time of 15.9743 on 4 procs for 100 steps with 32640 atoms -Performance: 0.263 ns/day, 91.331 hours/ns, 6.083 timesteps/s -98.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 0.270 ns/day, 88.746 hours/ns, 6.260 timesteps/s +99.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 | 14.263 | 14.349 | 14.483 | 2.3 | 87.28 -Neigh | 1.6071 | 1.6283 | 1.6636 | 1.7 | 9.90 -Comm | 0.26261 | 0.43435 | 0.52323 | 16.1 | 2.64 -Output | 0.00042105 | 0.0007121 | 0.001538 | 0.0 | 0.00 -Modify | 0.00898 | 0.009112 | 0.0093675 | 0.2 | 0.06 -Other | | 0.0184 | | | 0.11 +Pair | 14.13 | 14.185 | 14.258 | 1.3 | 88.80 +Neigh | 1.5945 | 1.6093 | 1.6237 | 0.9 | 10.07 +Comm | 0.075436 | 0.16329 | 0.23273 | 14.3 | 1.02 +Output | 0.00041533 | 0.00069332 | 0.0014405 | 0.0 | 0.00 +Modify | 0.0089853 | 0.0090484 | 0.0091338 | 0.1 | 0.06 +Other | | 0.007319 | | | 0.05 Nlocal: 8160 ave 8174 max 8146 min Histogram: 1 0 1 0 0 0 0 1 0 1 diff --git a/examples/airebo/log.29Jun18.rebo2.g++.1 b/examples/airebo/log.12Dec18.rebo2.g++.1 similarity index 76% rename from examples/airebo/log.29Jun18.rebo2.g++.1 rename to examples/airebo/log.12Dec18.rebo2.g++.1 index 54c87ab474..83c3a8ebea 100644 --- a/examples/airebo/log.29Jun18.rebo2.g++.1 +++ b/examples/airebo/log.12Dec18.rebo2.g++.1 @@ -1,5 +1,4 @@ -LAMMPS (29 Jun 2018) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) +LAMMPS (12 Dec 2018) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark @@ -16,7 +15,7 @@ replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 1 by 1 by 1 MPI processor grid 32640 atoms - Time spent = 0.00153542 secs + Time spent = 0.0013907 secs neighbor 0.5 bin neigh_modify delay 5 every 1 @@ -50,27 +49,27 @@ Step Temp E_pair E_mol TotEng Press 10 179.37985 -137931.27 0 -137174.48 15655.936 20 206.87654 -138046.99 0 -137174.19 -24042.627 30 150.80122 -137807.43 0 -137171.21 -16524.118 - 40 173.24945 -137902.35 0 -137171.42 -5716.9118 + 40 173.24945 -137902.35 0 -137171.42 -5716.9119 50 151.80455 -137812.36 0 -137171.91 3480.4584 60 199.08777 -138013.82 0 -137173.88 17881.372 70 217.85748 -138093.86 0 -137174.73 -12270.999 - 80 202.37482 -138029.39 0 -137175.59 -7622.732 + 80 202.37482 -138029.39 0 -137175.59 -7622.7319 90 194.90628 -137997.05 0 -137174.75 -32267.471 100 185.17818 -137954.51 0 -137173.26 -6901.7499 -Loop time of 5.03541 on 1 procs for 100 steps with 32640 atoms +Loop time of 4.96341 on 1 procs for 100 steps with 32640 atoms -Performance: 0.858 ns/day, 27.975 hours/ns, 19.859 timesteps/s -99.0% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 0.870 ns/day, 27.574 hours/ns, 20.147 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 | 3.5083 | 3.5083 | 3.5083 | 0.0 | 69.67 -Neigh | 1.4785 | 1.4785 | 1.4785 | 0.0 | 29.36 -Comm | 0.016176 | 0.016176 | 0.016176 | 0.0 | 0.32 -Output | 0.0009644 | 0.0009644 | 0.0009644 | 0.0 | 0.02 -Modify | 0.02224 | 0.02224 | 0.02224 | 0.0 | 0.44 -Other | | 0.009286 | | | 0.18 +Pair | 3.4476 | 3.4476 | 3.4476 | 0.0 | 69.46 +Neigh | 1.4692 | 1.4692 | 1.4692 | 0.0 | 29.60 +Comm | 0.015226 | 0.015226 | 0.015226 | 0.0 | 0.31 +Output | 0.00098777 | 0.00098777 | 0.00098777 | 0.0 | 0.02 +Modify | 0.021646 | 0.021646 | 0.021646 | 0.0 | 0.44 +Other | | 0.008718 | | | 0.18 Nlocal: 32640 ave 32640 max 32640 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/airebo/log.29Jun18.rebo2.g++.4 b/examples/airebo/log.12Dec18.rebo2.g++.4 similarity index 76% rename from examples/airebo/log.29Jun18.rebo2.g++.4 rename to examples/airebo/log.12Dec18.rebo2.g++.4 index b7d63dd2e5..f38f484238 100644 --- a/examples/airebo/log.29Jun18.rebo2.g++.4 +++ b/examples/airebo/log.12Dec18.rebo2.g++.4 @@ -1,5 +1,4 @@ -LAMMPS (29 Jun 2018) -OMP_NUM_THREADS environment is not set. Defaulting to 1 thread. (src/comm.cpp:87) +LAMMPS (12 Dec 2018) using 1 OpenMP thread(s) per MPI task # AIREBO polyethelene benchmark @@ -16,7 +15,7 @@ replicate 17 16 2 orthogonal box = (-2.1 -2.1 0) to (69.3 65.1 51.158) 2 by 2 by 1 MPI processor grid 32640 atoms - Time spent = 0.00151467 secs + Time spent = 0.000644684 secs neighbor 0.5 bin neigh_modify delay 5 every 1 @@ -50,27 +49,27 @@ Step Temp E_pair E_mol TotEng Press 10 179.37985 -137931.27 0 -137174.48 15655.936 20 206.87654 -138046.99 0 -137174.19 -24042.627 30 150.80122 -137807.43 0 -137171.21 -16524.118 - 40 173.24945 -137902.35 0 -137171.42 -5716.9118 + 40 173.24945 -137902.35 0 -137171.42 -5716.9119 50 151.80455 -137812.36 0 -137171.91 3480.4584 60 199.08777 -138013.82 0 -137173.88 17881.372 70 217.85748 -138093.86 0 -137174.73 -12270.999 - 80 202.37482 -138029.39 0 -137175.59 -7622.732 + 80 202.37482 -138029.39 0 -137175.59 -7622.7319 90 194.90628 -137997.05 0 -137174.75 -32267.471 100 185.17818 -137954.51 0 -137173.26 -6901.7499 -Loop time of 1.49632 on 4 procs for 100 steps with 32640 atoms +Loop time of 1.4517 on 4 procs for 100 steps with 32640 atoms -Performance: 2.887 ns/day, 8.313 hours/ns, 66.831 timesteps/s -98.6% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 2.976 ns/day, 8.065 hours/ns, 68.885 timesteps/s +99.4% 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.93275 | 0.95717 | 0.97367 | 1.6 | 63.97 -Neigh | 0.45634 | 0.46084 | 0.46749 | 0.6 | 30.80 -Comm | 0.038283 | 0.062074 | 0.090508 | 7.6 | 4.15 -Output | 0.00046492 | 0.00072992 | 0.0015128 | 0.0 | 0.05 -Modify | 0.0088651 | 0.0090639 | 0.0093012 | 0.2 | 0.61 -Other | | 0.006436 | | | 0.43 +Pair | 0.92079 | 0.93883 | 0.95524 | 1.6 | 64.67 +Neigh | 0.45826 | 0.46013 | 0.46316 | 0.3 | 31.70 +Comm | 0.02183 | 0.038046 | 0.052974 | 7.5 | 2.62 +Output | 0.00044131 | 0.00057179 | 0.00093198 | 0.0 | 0.04 +Modify | 0.0088243 | 0.0089917 | 0.0092998 | 0.2 | 0.62 +Other | | 0.005127 | | | 0.35 Nlocal: 8160 ave 8163 max 8157 min Histogram: 1 1 0 0 0 0 0 0 1 1 From dced4c1fca7f30876bc376363289d7ae7c5585c2 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Fri, 4 Jan 2019 17:03:31 -0700 Subject: [PATCH 0082/1242] 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 0083/1242] 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 7a2d326103b111c6282e128d2c617a4af461237b Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 8 Jan 2019 09:19:49 -0700 Subject: [PATCH 0084/1242] Commit JT 010819 - commit before co --- examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp | 10 +- examples/SPIN/iron/in.spin.iron | 8 +- examples/SPIN/pppm_spin/in.spin.cut_comp | 26 +----- .../SPIN/pppm_spin/in.spin.spin_dipolar_cut | 26 +++--- src/KSPACE/ewald_dipole.cpp | 2 - src/KSPACE/ewald_dipole.h | 1 - src/SPIN/pair_spin_dipolar_long.cpp | 91 +++++++++++-------- 7 files changed, 80 insertions(+), 84 deletions(-) diff --git a/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp b/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp index 35aa1df86c..0efa52435d 100644 --- a/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp +++ b/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp @@ -25,16 +25,18 @@ velocity all create 100 4928459 rot yes dist gaussian #pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/neel 4.0 pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -pair_coeff * * eam/alloy Co_PurjaPun_2012.eam.alloy Co -pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * eam/alloy ../examples/SPIN/cobalt_hcp/Co_PurjaPun_2012.eam.alloy Co +#pair_coeff * * eam/alloy Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 -0.3593 1.135028015e-05 1.064568567 #pair_coeff * * spin/neel neel 4.0 0.0048 0.234 1.168 2.6905 0.705 0.652 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 -fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 +fix 1 all precession/spin anisotropy 0.01 0.0 0.0 1.0 +#fix 2 all langevin/spin 0.0 0.0 21 +fix 2 all langevin/spin 0.0 0.1 21 fix 3 all nve/spin lattice yes timestep 0.0001 diff --git a/examples/SPIN/iron/in.spin.iron b/examples/SPIN/iron/in.spin.iron index c2d5082cb6..dab1616e70 100644 --- a/examples/SPIN/iron/in.spin.iron +++ b/examples/SPIN/iron/in.spin.iron @@ -19,11 +19,13 @@ create_atoms 1 box mass 1 55.845 -set group all spin/random 31 2.2 +#set group all spin/random 31 2.2 +set group all spin 2.2 0.0 0.0 1.0 velocity all create 100 4928459 rot yes dist gaussian pair_style hybrid/overlay eam/alloy spin/exchange 3.5 -pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe +#pair_coeff * * eam/alloy Fe_Mishin2006.eam.alloy Fe +pair_coeff * * eam/alloy ../examples/SPIN/iron/Fe_Mishin2006.eam.alloy Fe pair_coeff * * spin/exchange exchange 3.4 0.02726 0.2171 1.841 neighbor 0.1 bin @@ -53,4 +55,4 @@ thermo 50 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -run 50000 +run 50 diff --git a/examples/SPIN/pppm_spin/in.spin.cut_comp b/examples/SPIN/pppm_spin/in.spin.cut_comp index 3d01c56878..373c485c94 100644 --- a/examples/SPIN/pppm_spin/in.spin.cut_comp +++ b/examples/SPIN/pppm_spin/in.spin.cut_comp @@ -29,12 +29,12 @@ neigh_modify delay 0 #neigh_modify every 1 delay 10 check yes page 100000000 one 10000000 #kspace_style pppm/dipole/spin 1.0e-4 -kspace_style ewald/dipole/spin 1.0e-4 -kspace_modify compute yes +#kspace_style ewald/dipole/spin 1.0e-4 +#kspace_modify compute yes #kspace_modify compute yes gewald 0.1 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.1 21 +fix 2 all langevin/spin 0.0 0.0 21 #fix 3 all nve/spin lattice yes fix 3 all nve/spin lattice no @@ -44,29 +44,9 @@ thermo_style custom step temp pe ke etotal press thermo_modify format float %20.16g thermo 50 -#compute peratom all pe/atom -#compute pe all reduce sum c_peratom -#thermo_style custom step temp pe c_pe - -#compute peratom2 all stress/atom -#compute peratom2 all stress/atom NULL -#compute p all reduce sum c_peratom2[1] c_peratom2[2] c_peratom2[3] c_peratom2[4] c_peratom2[5] c_peratom2[6] -#variable press equal -(c_p[1]+c_p[2]+c_p[3])/(3*vol) -#variable pxx equal -c_p[1]/vol -#variable pyy equal -c_p[2]/vol -#variable pzz equal -c_p[3]/vol -#variable pxy equal -c_p[4]/vol -#variable pxz equal -c_p[5]/vol -#variable pyz equal -c_p[6]/vol -#thermo_style custom step temp etotal pe c_pe press v_press pxx v_pxx pyy v_pyy pzz v_pzz pxy v_pxy pxz v_pxz pyz v_pyz -#thermo_style custom step etotal pe press v_press v_pxx v_pyy v_pzz v_pxy v_pxz v_pyz -#thermo_style custom step temp etotal press v_press - compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 50 all custom 1 dump.equil id type x y z c_outsp[1] c_outsp[2] c_outsp[3] #c_outsp[5] c_outsp[6] c_outsp[7] #dump_modify 1 format line "%d %d %20.15g %20.15g %20.15g %20.15g %20.15g %20.15g" scale yes -#pair_modify compute no - run 10000 diff --git a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut index b265c4413e..a3ca4288fc 100644 --- a/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut +++ b/examples/SPIN/pppm_spin/in.spin.spin_dipolar_cut @@ -21,16 +21,15 @@ mass 1 58.93 set group all spin/random 31 1.72 #set group all spin 1.72 0.0 0.0 1.0 -#velocity all create 100 4928459 rot yes dist gaussian +velocity all create 100 4928459 rot yes dist gaussian -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/long 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 -pair_style spin/dipolar/cut 8.0 -#pair_style hybrid/overlay eam/alloy spin/exchange 4.0 -#pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co -#pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 -pair_coeff * * long 8.0 -#pair_coeff * * spin/long long 8.0 +pair_style hybrid/overlay eam/alloy spin/exchange 4.0 spin/dipolar/cut 8.0 +#pair_style hybrid/overlay eam/alloy spin/dipolar/cut 8.0 +pair_coeff * * eam/alloy ../examples/SPIN/pppm_spin/Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * spin/exchange exchange 4.0 0.3593 1.135028015e-05 1.064568567 +pair_coeff * * spin/dipolar/cut long 8.0 +#pair_style spin/dipolar/cut 8.0 +#pair_coeff * * long 8.0 neighbor 0.1 bin neigh_modify every 10 check yes delay 20 @@ -38,8 +37,8 @@ neigh_modify every 10 check yes delay 20 #fix 1 all precession/spin zeeman 1.0 0.0 0.0 1.0 fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 fix 2 all langevin/spin 0.0 0.0 21 -#fix 3 all nve/spin lattice yes -fix 3 all nve/spin lattice no +fix 3 all nve/spin lattice yes +#fix 3 all nve/spin lattice no timestep 0.0001 @@ -55,10 +54,11 @@ variable emag equal c_out_mag[5] variable tmag equal c_out_mag[6] thermo_style custom step time v_magnorm v_emag temp etotal +thermo_modify format float %20.16g thermo 10 compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_cobalt_hcp.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -#run 20000 -run 10 +run 20000 +#run 10 diff --git a/src/KSPACE/ewald_dipole.cpp b/src/KSPACE/ewald_dipole.cpp index 0cd5c95a9b..ebe17c82dd 100644 --- a/src/KSPACE/ewald_dipole.cpp +++ b/src/KSPACE/ewald_dipole.cpp @@ -561,8 +561,6 @@ void EwaldDipole::eik_dot_r() // loop on different k-directions // loop on n kpoints and nlocal atoms - // store (n x nlocal) tab. of values of (mu_i dot k) - // store n values of sum_j[ (mu_j dot k) exp(-k dot r_j) ] // (k,0,0), (0,l,0), (0,0,m) diff --git a/src/KSPACE/ewald_dipole.h b/src/KSPACE/ewald_dipole.h index 77c0af11c2..09a2896b56 100644 --- a/src/KSPACE/ewald_dipole.h +++ b/src/KSPACE/ewald_dipole.h @@ -34,7 +34,6 @@ class EwaldDipole : public Ewald { protected: double musum,musqsum,mu2; - //double **muk; // mu_i dot k double **tk; // field for torque double **vc; // virial per k diff --git a/src/SPIN/pair_spin_dipolar_long.cpp b/src/SPIN/pair_spin_dipolar_long.cpp index 140b92700c..ef79717f63 100644 --- a/src/SPIN/pair_spin_dipolar_long.cpp +++ b/src/SPIN/pair_spin_dipolar_long.cpp @@ -181,10 +181,14 @@ void PairSpinDipolarLong::init_style() // insure use of KSpace long-range solver, set g_ewald - if (force->kspace == NULL) - error->all(FLERR,"Pair style requires a KSpace style"); + //if (force->kspace == NULL) + // error->all(FLERR,"Pair style requires a KSpace style"); + + //g_ewald = force->kspace->g_ewald; + + // test case + g_ewald = 0.1; - g_ewald = force->kspace->g_ewald; } @@ -233,10 +237,11 @@ void PairSpinDipolarLong::compute(int eflag, int vflag) int i,j,ii,jj,inum,jnum,itype,jtype; double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; - double bij[4]; double evdwl,ecoul; - double xi[3],rij[3]; - double spi[4],spj[4],fi[3],fmi[3]; + double bij[4]; + double xi[3],rij[3],eij[3]; + double spi[4],spj[4]; + double fi[3],fmi[3]; double local_cut2; double pre1,pre2,pre3; int *ilist,*jlist,*numneigh,**firstneigh; @@ -298,12 +303,16 @@ void PairSpinDipolarLong::compute(int eflag, int vflag) 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]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; if (rsq < local_cut2) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); + //rinv = sqrt(r2inv); r = sqrt(rsq); grij = g_ewald * r; @@ -316,18 +325,20 @@ void PairSpinDipolarLong::compute(int eflag, int vflag) bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - compute_long(i,j,rij,bij,fmi,spi,spj); - compute_long_mech(i,j,rij,bij,fmi,spi,spj); + compute_long(i,j,eij,bij,fmi,spi,spj); + compute_long_mech(i,j,eij,bij,fmi,spi,spj); + //compute_long(i,j,rij,bij,fmi,spi,spj); + //compute_long_mech(i,j,rij,bij,fmi,spi,spj); } // force accumulation - f[i][0] += fi[0] * mub2mu0; - f[i][1] += fi[1] * mub2mu0; - f[i][2] += fi[2] * mub2mu0; - fm[i][0] += fmi[0] * mub2mu0hbinv; - fm[i][1] += fmi[1] * mub2mu0hbinv; - fm[i][2] += fmi[2] * mub2mu0hbinv; + 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][2] += fmi[2]; if (newton_pair || j < nlocal) { f[j][0] -= fi[0]; @@ -360,7 +371,8 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) int i,j,jj,jnum,itype,jtype; double r,rinv,r2inv,rsq; double grij,expm2,t,erfc; - double bij[4],xi[3],rij[3]; + double bij[4]; + double xi[3],rij[3],eij[3]; double spi[4],spj[4]; double local_cut2; double pre1,pre2,pre3; @@ -411,12 +423,16 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) 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]; + rinv = 1.0/sqrt(rsq); + eij[0] = rij[0]*rinv; + eij[1] = rij[1]*rinv; + eij[2] = rij[2]*rinv; local_cut2 = cut_spin_long[itype][jtype]*cut_spin_long[itype][jtype]; if (rsq < local_cut2) { r2inv = 1.0/rsq; - rinv = sqrt(r2inv); + //rinv = sqrt(r2inv); r = sqrt(rsq); grij = g_ewald * r; @@ -429,7 +445,7 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) bij[2] = (3.0*bij[1] + pre2*expm2) * r2inv; bij[3] = (5.0*bij[2] + pre3*expm2) * r2inv; - compute_long(i,j,rij,bij,fmi,spi,spj); + compute_long(i,j,eij,bij,fmi,spi,spj); } } @@ -447,21 +463,22 @@ void PairSpinDipolarLong::compute_single_pair(int ii, double fmi[3]) compute dipolar interaction between spins i and j ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::compute_long(int i, int j, double rij[3], +void PairSpinDipolarLong::compute_long(int i, int j, double eij[3], double bij[4], double fmi[3], double spi[4], double spj[4]) { - double sjdotr; + double sjeij,pre; double b1,b2,gigj; gigj = spi[3] * spj[3]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + pre = gigj*mub2mu0hbinv; + sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; b1 = bij[1]; b2 = bij[2]; - fmi[0] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[0] - b1 * spj[0]); - fmi[1] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[1] - b1 * spj[1]); - fmi[2] += mub2mu0hbinv * gigj * (b2 * sjdotr *rij[2] - b1 * spj[2]); + fmi[0] += pre * (b2 * sjeij * eij[0] - b1 * spj[0]); + fmi[1] += pre * (b2 * sjeij * eij[1] - b1 * spj[1]); + fmi[2] += pre * (b2 * sjeij * eij[2] - b1 * spj[2]); } /* ---------------------------------------------------------------------- @@ -469,29 +486,27 @@ void PairSpinDipolarLong::compute_long(int i, int j, double rij[3], atom i and atom j ------------------------------------------------------------------------- */ -void PairSpinDipolarLong::compute_long_mech(int i, int j, double rij[3], +void PairSpinDipolarLong::compute_long_mech(int i, int j, double eij[3], double bij[4], double fi[3], double spi[3], double spj[3]) { - double sdots,sidotr,sjdotr,b2,b3; - double g1,g2,g1b2_g2b3,gigj; + double sisj,sieij,sjeij,b2,b3; + double g1,g2,g1b2_g2b3,gigj,pre; gigj = spi[3] * spj[3]; - sdots = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; - sidotr = spi[0]*rij[0] + spi[1]*rij[1] + spi[2]*rij[2]; - sjdotr = spj[0]*rij[0] + spj[1]*rij[1] + spj[2]*rij[2]; + pre = gigj*mub2mu0; + sisj = spi[0]*spj[0] + spi[1]*spj[1] + spi[2]*spj[2]; + sieij = spi[0]*eij[0] + spi[1]*eij[1] + spi[2]*eij[2]; + sjeij = spj[0]*eij[0] + spj[1]*eij[1] + spj[2]*eij[2]; b2 = bij[2]; b3 = bij[3]; - g1 = sdots; - g2 = -sidotr*sjdotr; + g1 = sisj; + g2 = -sieij*sjeij; g1b2_g2b3 = g1*b2 + g2*b3; - fi[0] += gigj * (rij[0] * g1b2_g2b3 + - b2 * (sjdotr*spi[0] + sidotr*spj[0])); - fi[1] += gigj * (rij[1] * g1b2_g2b3 + - b2 * (sjdotr*spi[1] + sidotr*spj[1])); - fi[2] += gigj * (rij[2] * g1b2_g2b3 + - b2 * (sjdotr*spi[2] + sidotr*spj[2])); + fi[0] += pre * (eij[0] * g1b2_g2b3 + b2 * (sjeij*spi[0] + sieij*spj[0])); + fi[1] += pre * (eij[1] * g1b2_g2b3 + b2 * (sjeij*spi[1] + sieij*spj[1])); + fi[2] += pre * (eij[2] * g1b2_g2b3 + b2 * (sjeij*spi[2] + sieij*spj[2])); } From 18f8f68e67502fd7bc9edeccf24bc1145c199662 Mon Sep 17 00:00:00 2001 From: Dan Stefan Bolintineanu Date: Tue, 8 Jan 2019 16:33:24 -0700 Subject: [PATCH 0085/1242] 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 0086/1242] 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 0087/1242] 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 0088/1242] 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 0089/1242] 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 0090/1242] 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 0091/1242] 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 0092/1242] 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 08b1728a963aac4361fcb5031f29f0640b0303e4 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 29 Jan 2019 13:05:03 -0700 Subject: [PATCH 0093/1242] Commit JT 012919 - commit tuesday evening, second day imp. - dev. fix_neb_spin --- examples/SPIN/gneb_bfo/README | 5 + examples/SPIN/gneb_bfo/Si.sw | 18 + examples/SPIN/gneb_bfo/final.hop1 | 2 + examples/SPIN/gneb_bfo/final.iron_spin | 68 + examples/SPIN/gneb_bfo/final.iron_spin_data | 82 ++ examples/SPIN/gneb_bfo/in.neb.hop1 | 66 + examples/SPIN/gneb_bfo/in.neb.spin_iron | 100 ++ examples/SPIN/gneb_bfo/in.spin.bfo | 56 + examples/SPIN/gneb_bfo/in.spin.iron | 56 + examples/SPIN/gneb_bfo/in.spin.single_spin | 57 + examples/SPIN/gneb_bfo/in.tad | 110 ++ examples/SPIN/gneb_bfo/initial.hop1 | 860 +++++++++++++ examples/SPIN/gneb_bfo/initial.iron_spin | 82 ++ src/REPLICA/fix_neb_spin.cpp | 1226 +++++++++++++++++++ src/REPLICA/fix_neb_spin.h | 115 ++ src/REPLICA/neb_spin.cpp | 722 +++++++++++ src/REPLICA/neb_spin.h | 137 +++ 17 files changed, 3762 insertions(+) create mode 100644 examples/SPIN/gneb_bfo/README create mode 100644 examples/SPIN/gneb_bfo/Si.sw create mode 100644 examples/SPIN/gneb_bfo/final.hop1 create mode 100644 examples/SPIN/gneb_bfo/final.iron_spin create mode 100644 examples/SPIN/gneb_bfo/final.iron_spin_data create mode 100644 examples/SPIN/gneb_bfo/in.neb.hop1 create mode 100644 examples/SPIN/gneb_bfo/in.neb.spin_iron create mode 100644 examples/SPIN/gneb_bfo/in.spin.bfo create mode 100644 examples/SPIN/gneb_bfo/in.spin.iron create mode 100644 examples/SPIN/gneb_bfo/in.spin.single_spin create mode 100644 examples/SPIN/gneb_bfo/in.tad create mode 100644 examples/SPIN/gneb_bfo/initial.hop1 create mode 100644 examples/SPIN/gneb_bfo/initial.iron_spin create mode 100644 src/REPLICA/fix_neb_spin.cpp create mode 100644 src/REPLICA/fix_neb_spin.h create mode 100644 src/REPLICA/neb_spin.cpp create mode 100644 src/REPLICA/neb_spin.h diff --git a/examples/SPIN/gneb_bfo/README b/examples/SPIN/gneb_bfo/README new file mode 100644 index 0000000000..eeb4aa4692 --- /dev/null +++ b/examples/SPIN/gneb_bfo/README @@ -0,0 +1,5 @@ +Run this example as: + +mpirun -np 3 lmp_g++ -partition 3x1 -in in.tad + +You should be able to use any number of replicas >= 3. diff --git a/examples/SPIN/gneb_bfo/Si.sw b/examples/SPIN/gneb_bfo/Si.sw new file mode 100644 index 0000000000..db4be100ef --- /dev/null +++ b/examples/SPIN/gneb_bfo/Si.sw @@ -0,0 +1,18 @@ +# DATE: 2007-06-11 CONTRIBUTOR: Aidan Thompson, athomps@sandia.gov CITATION: Stillinger and Weber, Phys Rev B, 31, 5262, (1985) +# Stillinger-Weber parameters for various elements and mixtures +# multiple entries can be added to this file, LAMMPS reads the ones it needs +# these entries are in LAMMPS "metal" units: +# epsilon = eV; sigma = Angstroms +# other quantities are unitless + +# format of a single entry (one or more lines): +# element 1, element 2, element 3, +# epsilon, sigma, a, lambda, gamma, costheta0, A, B, p, q, tol + +# Here are the original parameters in metal units, for Silicon from: +# +# Stillinger and Weber, Phys. Rev. B, v. 31, p. 5262, (1985) +# + +Si Si Si 2.1683 2.0951 1.80 21.0 1.20 -0.333333333333 + 7.049556277 0.6022245584 4.0 0.0 0.0 diff --git a/examples/SPIN/gneb_bfo/final.hop1 b/examples/SPIN/gneb_bfo/final.hop1 new file mode 100644 index 0000000000..338e674a9c --- /dev/null +++ b/examples/SPIN/gneb_bfo/final.hop1 @@ -0,0 +1,2 @@ +1 +412 14.0 20.5 0 diff --git a/examples/SPIN/gneb_bfo/final.iron_spin b/examples/SPIN/gneb_bfo/final.iron_spin new file mode 100644 index 0000000000..a921287ccb --- /dev/null +++ b/examples/SPIN/gneb_bfo/final.iron_spin @@ -0,0 +1,68 @@ +32 +2.2000000000000002e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 2.8664999999999998e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 5.7329999999999997e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 8.5994999999999990e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 0.0000000000000000e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 2.8664999999999998e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 5.7329999999999997e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 8.5994999999999990e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 1.4332499999999999e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 4.2997499999999995e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 7.1662499999999998e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 1.0032750000000000e+01 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 0.0000000000000000e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 1.4332499999999999e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 2.8664999999999998e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 4.2997499999999995e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 5.7329999999999997e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 7.1662499999999998e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 8.5994999999999990e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 1.0032750000000000e+01 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 0.0000000000000000e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 2.8664999999999998e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 5.7329999999999997e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 8.5994999999999990e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 1.4332499999999999e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 4.2997499999999995e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 7.1662499999999998e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2.2000000000000002e+00 1.0032750000000000e+01 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/SPIN/gneb_bfo/final.iron_spin_data b/examples/SPIN/gneb_bfo/final.iron_spin_data new file mode 100644 index 0000000000..b337bac188 --- /dev/null +++ b/examples/SPIN/gneb_bfo/final.iron_spin_data @@ -0,0 +1,82 @@ +LAMMPS data file via write_data, version 4 Jan 2019, timestep = 0 + +32 atoms +1 atom types + +0.0000000000000000e+00 1.1465999999999999e+01 xlo xhi +0.0000000000000000e+00 1.1465999999999999e+01 ylo yhi +0.0000000000000000e+00 2.8664999999999998e+00 zlo zhi + +Masses + +1 55.845 + +Atoms # spin + +1 1 2.2000000000000002e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +2 1 2.2000000000000002e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +3 1 2.2000000000000002e+00 2.8664999999999998e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +4 1 2.2000000000000002e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +5 1 2.2000000000000002e+00 5.7329999999999997e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +6 1 2.2000000000000002e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +7 1 2.2000000000000002e+00 8.5994999999999990e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +8 1 2.2000000000000002e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +9 1 2.2000000000000002e+00 0.0000000000000000e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +11 1 2.2000000000000002e+00 2.8664999999999998e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +13 1 2.2000000000000002e+00 5.7329999999999997e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +15 1 2.2000000000000002e+00 8.5994999999999990e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +10 1 2.2000000000000002e+00 1.4332499999999999e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +12 1 2.2000000000000002e+00 4.2997499999999995e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +14 1 2.2000000000000002e+00 7.1662499999999998e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +16 1 2.2000000000000002e+00 1.0032750000000000e+01 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +17 1 2.2000000000000002e+00 0.0000000000000000e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +18 1 2.2000000000000002e+00 1.4332499999999999e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +19 1 2.2000000000000002e+00 2.8664999999999998e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +20 1 2.2000000000000002e+00 4.2997499999999995e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +21 1 2.2000000000000002e+00 5.7329999999999997e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +22 1 2.2000000000000002e+00 7.1662499999999998e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +23 1 2.2000000000000002e+00 8.5994999999999990e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +24 1 2.2000000000000002e+00 1.0032750000000000e+01 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +25 1 2.2000000000000002e+00 0.0000000000000000e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +27 1 2.2000000000000002e+00 2.8664999999999998e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +29 1 2.2000000000000002e+00 5.7329999999999997e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +31 1 2.2000000000000002e+00 8.5994999999999990e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +26 1 2.2000000000000002e+00 1.4332499999999999e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +28 1 2.2000000000000002e+00 4.2997499999999995e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +30 1 2.2000000000000002e+00 7.1662499999999998e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +32 1 2.2000000000000002e+00 1.0032750000000000e+01 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 + +Velocities + +1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/examples/SPIN/gneb_bfo/in.neb.hop1 b/examples/SPIN/gneb_bfo/in.neb.hop1 new file mode 100644 index 0000000000..4e203afd82 --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.neb.hop1 @@ -0,0 +1,66 @@ +# 2d NEB surface simulation, hop from surface to become adatom + +dimension 2 +boundary p s p + +atom_style atomic +neighbor 0.3 bin +neigh_modify delay 5 +atom_modify map array sort 0 0.0 + +variable u uloop 20 + +# create geometry with flat surface + +lattice hex 0.9 +region box block 0 20 0 10 -0.25 0.25 + +#create_box 3 box +#create_atoms 1 box +#mass * 1.0 +#write_data initial.hop1 + +read_data ../examples/SPIN/gneb_bfo/initial.hop1 + +# LJ potentials + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_modify shift yes + +# initial minimization to relax surface + +minimize 1.0e-6 1.0e-4 1000 10000 +reset_timestep 0 + +# define groups + +region 1 block INF INF INF 1.25 INF INF +group lower region 1 +group mobile subtract all lower +set group lower type 2 + +timestep 0.05 + +# group of NEB atoms - either block or single atom ID 412 + +region surround block 10 18 17 20 0 0 units box +group nebatoms region surround +#group nebatoms id 412 +set group nebatoms type 3 +group nonneb subtract all nebatoms + +fix 1 lower setforce 0.0 0.0 0.0 +fix 2 nebatoms neb 1.0 parallel ideal +fix 3 all enforce2d + +thermo 100 + +#dump 1 nebatoms atom 10 dump.neb.$u +#dump 2 nonneb atom 10 dump.nonneb.$u + +# run NEB for 2000 steps or to force tolerance + +min_style quickmin + +neb 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.hop1 diff --git a/examples/SPIN/gneb_bfo/in.neb.spin_iron b/examples/SPIN/gneb_bfo/in.neb.spin_iron new file mode 100644 index 0000000000..6b99cd4639 --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.neb.spin_iron @@ -0,0 +1,100 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p f + +# 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 1.0 +#create_box 1 box +#create_atoms 1 box + +read_data ../examples/SPIN/gneb_bfo/initial.iron_spin + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +set group all spin 2.2 -1.0 0.0 0.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.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 +fix 2 nebatoms neb_spin 1.0 +#parallel ideal + +min_style quickmin +neb 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin + + +############################################################# + +# 2d NEB surface simulation, hop from surface to become adatom + + +variable u uloop 20 + +# create geometry with flat surface + +lattice hex 0.9 +region box block 0 20 0 10 -0.25 0.25 + +#create_box 3 box +#create_atoms 1 box +#mass * 1.0 +#write_data initial.hop1 + +read_data ../examples/SPIN/gneb_bfo/initial.hop1 + +# LJ potentials + +pair_style lj/cut 2.5 +pair_coeff * * 1.0 1.0 2.5 +pair_modify shift yes + +# initial minimization to relax surface + +minimize 1.0e-6 1.0e-4 1000 10000 +reset_timestep 0 + +# define groups + +region 1 block INF INF INF 1.25 INF INF +group lower region 1 +group mobile subtract all lower +set group lower type 2 + +timestep 0.05 + +# group of NEB atoms - either block or single atom ID 412 + +region surround block 10 18 17 20 0 0 units box +group nebatoms region surround +#group nebatoms id 412 +set group nebatoms type 3 +group nonneb subtract all nebatoms + +fix 1 lower setforce 0.0 0.0 0.0 +fix 2 nebatoms neb 1.0 parallel ideal +fix 3 all enforce2d + +thermo 100 + +#dump 1 nebatoms atom 10 dump.neb.$u +#dump 2 nonneb atom 10 dump.nonneb.$u + +# run NEB for 2000 steps or to force tolerance + +min_style quickmin + +neb 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.hop1 diff --git a/examples/SPIN/gneb_bfo/in.spin.bfo b/examples/SPIN/gneb_bfo/in.spin.bfo new file mode 100644 index 0000000000..e3c88b0f06 --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.spin.bfo @@ -0,0 +1,56 @@ +# layer sc iron atoms (in the [001] plane) in bismuth oxide + +clear +units metal +atom_style spin + +dimension 3 +boundary p p f + +# 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 5.0 +create_box 1 box +create_atoms 1 box + +# setting mass, mag. moments, and interactions for bfo + +mass 1 1.0 + +set group all spin/random 11 2.50 + +#pair_style hybrid/overlay spin/exchange 6.0 spin/magelec 4.5 +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/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 anisotropy 0.0000033 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.1 21 +fix 3 all nve/spin lattice no + +timestep 0.0002 + +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_style custom step time v_magnorm v_emag temp etotal +thermo_style custom step time v_magnorm pe ke v_emag temp etotal +thermo 10 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_bfo.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +run 2000 diff --git a/examples/SPIN/gneb_bfo/in.spin.iron b/examples/SPIN/gneb_bfo/in.spin.iron new file mode 100644 index 0000000000..6d291c633b --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.spin.iron @@ -0,0 +1,56 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary p p p + +# 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 1.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 2.2 -1.0 0.0 0.0 +#velocity all create 100 4928459 rot yes dist gaussian + +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.0 0.0 0.0 1.0 +fix 2 all langevin/spin 0.0 0.0 21 + +fix 3 all nve/spin lattice yes +timestep 0.0001 + +# compute and output options + +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_style custom step time v_magnorm v_tmag temp v_emag ke pe etotal +thermo 50 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +run 0 +write_data final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.spin.single_spin b/examples/SPIN/gneb_bfo/in.spin.single_spin new file mode 100644 index 0000000000..3a63c87b8c --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.spin.single_spin @@ -0,0 +1,57 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary f f f +#boundary p p p + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice sc 2.8665 +region box block 0.0 1.0 0.0 1.0 0.0 1.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 2.2 0.0 0.0 1.0 +#velocity all create 100 4928459 rot yes dist gaussian + +pair_style spin/exchange 3.5 +pair_coeff * * exchange 3.4 0.0 0.2171 1.841 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +fix 1 all precession/spin zeeman 0.01 0.0 1.0 0.0 anisotropy 0.005 0.0 0.0 1.0 +fix 2 all langevin/spin 50.0 0.1 21 + +fix 3 all nve/spin lattice no +timestep 0.0001 + +# compute and output options + +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_style custom step time v_magz v_magnorm v_tmag temp v_emag ke pe etotal +thermo 100 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +run 50000 +write_data final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.tad b/examples/SPIN/gneb_bfo/in.tad new file mode 100644 index 0000000000..674fdc8172 --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.tad @@ -0,0 +1,110 @@ +# temperature accelerated dynamics model for a single vacancy in bulk Si +# events occur when a neighboring atom diffuses to the vacant site +# run this on multiple partitions as +# mpirun -np 3 lmp_g++ -partition 3x1 -in in.tad + +units metal + +atom_style atomic +atom_modify map array +boundary p p p +atom_modify sort 0 0.0 + +# temperatures +variable tlo equal 1800.0 +variable thi equal 2400.0 + +# coordination number cutoff + +variable r equal 2.835 + +# minimization parameters + +variable etol equal 1.0e-5 +variable ftol equal 1.0e-5 +variable maxiter equal 100 +variable maxeval equal 100 +variable dmax equal 1.0e-1 + +# diamond unit cell + +variable a equal 5.431 +lattice custom $a & + a1 1.0 0.0 0.0 & + a2 0.0 1.0 0.0 & + a3 0.0 0.0 1.0 & + basis 0.0 0.0 0.0 & + basis 0.0 0.5 0.5 & + basis 0.5 0.0 0.5 & + basis 0.5 0.5 0.0 & + basis 0.25 0.25 0.25 & + basis 0.25 0.75 0.75 & + basis 0.75 0.25 0.75 & + basis 0.75 0.75 0.25 + +region myreg block 0 4 & + 0 4 & + 0 4 +create_box 1 myreg +create_atoms 1 region myreg + +mass 1 28.06 + +group Si type 1 + +velocity all create ${thi} 5287286 mom yes rot yes dist gaussian + +# make a vacancy + +group del id 300 +delete_atoms group del + +pair_style sw +pair_coeff * * ../examples/SPIN/gneb_bfo/Si.sw Si + +thermo 10 + +fix 1 all nve +fix 2 all langevin ${thi} ${thi} 0.1 48278 + +timestep 1.0e-3 +neighbor 1.0 bin +neigh_modify every 1 delay 10 check yes + +# equilibrate + +run 1000 + +# Eliminate COM motion +velocity all zero linear + +# only output atoms near vacancy + +compute coord all coord/atom cutoff $r + +#dump events all custom 1 dump.prd id type x y z +#dump_modify events thresh c_coord != 4 + +compute patom all pe/atom +compute pe all reduce sum c_patom +compute satom all stress/atom NULL +compute str all reduce sum c_satom[1] c_satom[2] c_satom[3] +variable press equal (c_str[1]+c_str[2]+c_str[3])/(3*vol) + +thermo_style custom step temp pe c_pe press v_press + +compute event all event/displace 1.0 + +unfix 1 +unfix 2 +fix 1 all nvt temp ${thi} ${thi} 0.1 + +# tad nsteps nevent tlo thi delta_conf tmax compute +# [min etol ftol niter neval] +# [neb etol_neb ftol_neb n1steps n2steps nevery] +# [neb_style min_style] +# [neb_log logfile] + +tad 2000 50 ${tlo} ${thi} 0.05 1.0 event & + min ${etol} ${ftol} ${maxiter} ${maxeval} & + neb 0.0 0.01 200 200 20 neb_style fire neb_log log.neb diff --git a/examples/SPIN/gneb_bfo/initial.hop1 b/examples/SPIN/gneb_bfo/initial.hop1 new file mode 100644 index 0000000000..228708c314 --- /dev/null +++ b/examples/SPIN/gneb_bfo/initial.hop1 @@ -0,0 +1,860 @@ +LAMMPS data file via write_data, version 27 Sep 2016, timestep = 0 + +420 atoms +3 atom types + +0.0000000000000000e+00 2.2653923264628304e+01 xlo xhi +-1.9618873042551413e-03 1.9620834929855668e+01 ylo yhi +-2.8317404080785380e-01 2.8317404080785380e-01 zlo zhi + +Masses + +1 1 +2 1 +3 1 + +Atoms # atomic + +1 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +2 1 5.6634808161570760e-01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +3 1 1.1326961632314152e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +4 1 1.6990442448471228e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +5 1 2.2653923264628304e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +6 1 2.8317404080785380e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +7 1 3.3980884896942456e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +8 1 3.9644365713099532e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +9 1 4.5307846529256608e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +10 1 5.0971327345413684e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +11 1 5.6634808161570760e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +12 1 6.2298288977727836e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +13 1 6.7961769793884912e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +14 1 7.3625250610041988e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +15 1 7.9288731426199064e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +16 1 8.4952212242356140e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +17 1 9.0615693058513216e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +18 1 9.6279173874670292e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +19 1 1.0194265469082737e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +20 1 1.0760613550698444e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +21 1 1.1326961632314152e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +22 1 1.1893309713929860e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +23 1 1.2459657795545567e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +24 1 1.3026005877161275e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +25 1 1.3592353958776982e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +26 1 1.4158702040392690e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +27 1 1.4725050122008398e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +28 1 1.5291398203624105e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +29 1 1.5857746285239813e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +30 1 1.6424094366855520e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +31 1 1.6990442448471228e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +32 1 1.7556790530086936e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +33 1 1.8123138611702643e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +34 1 1.8689486693318351e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +35 1 1.9255834774934058e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +36 1 1.9822182856549766e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +37 1 2.0388530938165474e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +38 1 2.0954879019781181e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +39 1 2.1521227101396889e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +40 1 2.2087575183012596e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 +41 1 0.0000000000000000e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +42 1 5.6634808161570760e-01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +43 1 1.1326961632314152e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +44 1 1.6990442448471228e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +45 1 2.2653923264628304e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +46 1 2.8317404080785380e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +47 1 3.3980884896942456e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +48 1 3.9644365713099532e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +49 1 4.5307846529256608e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +50 1 5.0971327345413684e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +51 1 5.6634808161570760e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +52 1 6.2298288977727836e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +53 1 6.7961769793884912e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +54 1 7.3625250610041988e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +55 1 7.9288731426199064e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +56 1 8.4952212242356140e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +57 1 9.0615693058513216e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +58 1 9.6279173874670292e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +59 1 1.0194265469082737e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +60 1 1.0760613550698444e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +61 1 1.1326961632314152e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +62 1 1.1893309713929860e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +63 1 1.2459657795545567e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +64 1 1.3026005877161275e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +65 1 1.3592353958776982e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +66 1 1.4158702040392690e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +67 1 1.4725050122008398e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +68 1 1.5291398203624105e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +69 1 1.5857746285239813e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +70 1 1.6424094366855520e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +71 1 1.6990442448471228e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +72 1 1.7556790530086936e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +73 1 1.8123138611702643e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +74 1 1.8689486693318351e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +75 1 1.9255834774934058e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +76 1 1.9822182856549766e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +77 1 2.0388530938165474e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +78 1 2.0954879019781181e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +79 1 2.1521227101396889e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 +80 1 2.2087575183012596e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 +81 1 0.0000000000000000e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +82 1 5.6634808161570760e-01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +83 1 1.1326961632314152e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +84 1 1.6990442448471228e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +85 1 2.2653923264628304e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +86 1 2.8317404080785380e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +87 1 3.3980884896942456e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +88 1 3.9644365713099532e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +89 1 4.5307846529256608e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +90 1 5.0971327345413684e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +91 1 5.6634808161570760e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +92 1 6.2298288977727836e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +93 1 6.7961769793884912e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +94 1 7.3625250610041988e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +95 1 7.9288731426199064e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +96 1 8.4952212242356140e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +97 1 9.0615693058513216e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +98 1 9.6279173874670292e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +99 1 1.0194265469082737e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +100 1 1.0760613550698444e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +101 1 1.1326961632314152e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +102 1 1.1893309713929860e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +103 1 1.2459657795545567e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +104 1 1.3026005877161275e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +105 1 1.3592353958776982e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +106 1 1.4158702040392690e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +107 1 1.4725050122008398e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +108 1 1.5291398203624105e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +109 1 1.5857746285239813e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +110 1 1.6424094366855520e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +111 1 1.6990442448471228e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +112 1 1.7556790530086936e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +113 1 1.8123138611702643e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +114 1 1.8689486693318351e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +115 1 1.9255834774934058e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +116 1 1.9822182856549766e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +117 1 2.0388530938165474e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +118 1 2.0954879019781181e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +119 1 2.1521227101396889e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 +120 1 2.2087575183012596e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 +121 1 0.0000000000000000e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +122 1 5.6634808161570760e-01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +123 1 1.1326961632314152e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +124 1 1.6990442448471228e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +125 1 2.2653923264628304e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +126 1 2.8317404080785380e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +127 1 3.3980884896942456e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +128 1 3.9644365713099532e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +129 1 4.5307846529256608e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +130 1 5.0971327345413684e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +131 1 5.6634808161570760e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +132 1 6.2298288977727836e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +133 1 6.7961769793884912e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +134 1 7.3625250610041988e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +135 1 7.9288731426199064e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +136 1 8.4952212242356140e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +137 1 9.0615693058513216e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +138 1 9.6279173874670292e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +139 1 1.0194265469082737e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +140 1 1.0760613550698444e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +141 1 1.1326961632314152e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +142 1 1.1893309713929860e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +143 1 1.2459657795545567e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +144 1 1.3026005877161275e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +145 1 1.3592353958776982e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +146 1 1.4158702040392690e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +147 1 1.4725050122008398e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +148 1 1.5291398203624105e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +149 1 1.5857746285239813e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +150 1 1.6424094366855520e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +151 1 1.6990442448471228e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +152 1 1.7556790530086936e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +153 1 1.8123138611702643e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +154 1 1.8689486693318351e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +155 1 1.9255834774934058e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +156 1 1.9822182856549766e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +157 1 2.0388530938165474e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +158 1 2.0954879019781181e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +159 1 2.1521227101396889e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 +160 1 2.2087575183012596e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 +161 1 0.0000000000000000e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +162 1 5.6634808161570760e-01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +163 1 1.1326961632314152e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +164 1 1.6990442448471228e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +165 1 2.2653923264628304e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +166 1 2.8317404080785380e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +167 1 3.3980884896942456e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +168 1 3.9644365713099532e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +169 1 4.5307846529256608e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +170 1 5.0971327345413684e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +171 1 5.6634808161570760e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +172 1 6.2298288977727836e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +173 1 6.7961769793884912e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +174 1 7.3625250610041988e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +175 1 7.9288731426199064e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +176 1 8.4952212242356140e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +177 1 9.0615693058513216e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +178 1 9.6279173874670292e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +179 1 1.0194265469082737e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +180 1 1.0760613550698444e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +181 1 1.1326961632314152e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +182 1 1.1893309713929860e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +183 1 1.2459657795545567e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +184 1 1.3026005877161275e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +185 1 1.3592353958776982e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +186 1 1.4158702040392690e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +187 1 1.4725050122008398e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +188 1 1.5291398203624105e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +189 1 1.5857746285239813e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +190 1 1.6424094366855520e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +191 1 1.6990442448471228e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +192 1 1.7556790530086936e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +193 1 1.8123138611702643e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +194 1 1.8689486693318351e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +195 1 1.9255834774934058e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +196 1 1.9822182856549766e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +197 1 2.0388530938165474e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +198 1 2.0954879019781181e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +199 1 2.1521227101396889e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 +200 1 2.2087575183012596e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 +201 1 0.0000000000000000e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +202 1 5.6634808161570760e-01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +203 1 1.1326961632314152e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +204 1 1.6990442448471228e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +205 1 2.2653923264628304e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +206 1 2.8317404080785380e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +207 1 3.3980884896942456e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +208 1 3.9644365713099532e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +209 1 4.5307846529256608e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +210 1 5.0971327345413684e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +211 1 5.6634808161570760e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +212 1 6.2298288977727836e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +213 1 6.7961769793884912e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +214 1 7.3625250610041988e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +215 1 7.9288731426199064e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +216 1 8.4952212242356140e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +217 1 9.0615693058513216e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +218 1 9.6279173874670292e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +219 1 1.0194265469082737e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +220 1 1.0760613550698444e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +221 1 1.1326961632314152e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +222 1 1.1893309713929860e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +223 1 1.2459657795545567e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +224 1 1.3026005877161275e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +225 1 1.3592353958776982e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +226 1 1.4158702040392690e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +227 1 1.4725050122008398e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +228 1 1.5291398203624105e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +229 1 1.5857746285239813e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +230 1 1.6424094366855520e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +231 1 1.6990442448471228e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +232 1 1.7556790530086936e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +233 1 1.8123138611702643e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +234 1 1.8689486693318351e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +235 1 1.9255834774934058e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +236 1 1.9822182856549766e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +237 1 2.0388530938165474e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +238 1 2.0954879019781181e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +239 1 2.1521227101396889e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 +240 1 2.2087575183012596e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 +241 1 0.0000000000000000e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +242 1 5.6634808161570760e-01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +243 1 1.1326961632314152e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +244 1 1.6990442448471228e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +245 1 2.2653923264628304e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +246 1 2.8317404080785380e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +247 1 3.3980884896942456e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +248 1 3.9644365713099532e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +249 1 4.5307846529256608e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +250 1 5.0971327345413684e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +251 1 5.6634808161570760e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +252 1 6.2298288977727836e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +253 1 6.7961769793884912e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +254 1 7.3625250610041988e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +255 1 7.9288731426199064e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +256 1 8.4952212242356140e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +257 1 9.0615693058513216e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +258 1 9.6279173874670292e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +259 1 1.0194265469082737e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +260 1 1.0760613550698444e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +261 1 1.1326961632314152e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +262 1 1.1893309713929860e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +263 1 1.2459657795545567e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +264 1 1.3026005877161275e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +265 1 1.3592353958776982e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +266 1 1.4158702040392690e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +267 1 1.4725050122008398e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +268 1 1.5291398203624105e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +269 1 1.5857746285239813e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +270 1 1.6424094366855520e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +271 1 1.6990442448471228e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +272 1 1.7556790530086936e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +273 1 1.8123138611702643e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +274 1 1.8689486693318351e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +275 1 1.9255834774934058e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +276 1 1.9822182856549766e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +277 1 2.0388530938165474e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +278 1 2.0954879019781181e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +279 1 2.1521227101396889e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 +280 1 2.2087575183012596e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 +281 1 0.0000000000000000e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +282 1 5.6634808161570760e-01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +283 1 1.1326961632314152e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +284 1 1.6990442448471228e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +285 1 2.2653923264628304e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +286 1 2.8317404080785380e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +287 1 3.3980884896942456e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +288 1 3.9644365713099532e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +289 1 4.5307846529256608e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +290 1 5.0971327345413684e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +291 1 5.6634808161570760e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +292 1 6.2298288977727836e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +293 1 6.7961769793884912e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +294 1 7.3625250610041988e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +295 1 7.9288731426199064e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +296 1 8.4952212242356140e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +297 1 9.0615693058513216e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +298 1 9.6279173874670292e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +299 1 1.0194265469082737e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +300 1 1.0760613550698444e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +301 1 1.1326961632314152e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +302 1 1.1893309713929860e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +303 1 1.2459657795545567e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +304 1 1.3026005877161275e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +305 1 1.3592353958776982e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +306 1 1.4158702040392690e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +307 1 1.4725050122008398e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +308 1 1.5291398203624105e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +309 1 1.5857746285239813e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +310 1 1.6424094366855520e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +311 1 1.6990442448471228e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +312 1 1.7556790530086936e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +313 1 1.8123138611702643e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +314 1 1.8689486693318351e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +315 1 1.9255834774934058e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +316 1 1.9822182856549766e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +317 1 2.0388530938165474e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +318 1 2.0954879019781181e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +319 1 2.1521227101396889e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 +320 1 2.2087575183012596e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 +321 1 0.0000000000000000e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +322 1 5.6634808161570760e-01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +323 1 1.1326961632314152e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +324 1 1.6990442448471228e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +325 1 2.2653923264628304e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +326 1 2.8317404080785380e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +327 1 3.3980884896942456e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +328 1 3.9644365713099532e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +329 1 4.5307846529256608e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +330 1 5.0971327345413684e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +331 1 5.6634808161570760e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +332 1 6.2298288977727836e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +333 1 6.7961769793884912e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +334 1 7.3625250610041988e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +335 1 7.9288731426199064e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +336 1 8.4952212242356140e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +337 1 9.0615693058513216e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +338 1 9.6279173874670292e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +339 1 1.0194265469082737e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +340 1 1.0760613550698444e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +341 1 1.1326961632314152e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +342 1 1.1893309713929860e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +343 1 1.2459657795545567e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +344 1 1.3026005877161275e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +345 1 1.3592353958776982e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +346 1 1.4158702040392690e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +347 1 1.4725050122008398e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +348 1 1.5291398203624105e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +349 1 1.5857746285239813e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +350 1 1.6424094366855520e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +351 1 1.6990442448471228e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +352 1 1.7556790530086936e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +353 1 1.8123138611702643e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +354 1 1.8689486693318351e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +355 1 1.9255834774934058e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +356 1 1.9822182856549766e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +357 1 2.0388530938165474e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +358 1 2.0954879019781181e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +359 1 2.1521227101396889e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 +360 1 2.2087575183012596e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 +361 1 0.0000000000000000e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +362 1 5.6634808161570760e-01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +363 1 1.1326961632314152e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +364 1 1.6990442448471228e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +365 1 2.2653923264628304e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +366 1 2.8317404080785380e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +367 1 3.3980884896942456e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +368 1 3.9644365713099532e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +369 1 4.5307846529256608e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +370 1 5.0971327345413684e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +371 1 5.6634808161570760e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +372 1 6.2298288977727836e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +373 1 6.7961769793884912e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +374 1 7.3625250610041988e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +375 1 7.9288731426199064e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +376 1 8.4952212242356140e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +377 1 9.0615693058513216e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +378 1 9.6279173874670292e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +379 1 1.0194265469082737e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +380 1 1.0760613550698444e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +381 1 1.1326961632314152e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +382 1 1.1893309713929860e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +383 1 1.2459657795545567e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +384 1 1.3026005877161275e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +385 1 1.3592353958776982e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +386 1 1.4158702040392690e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +387 1 1.4725050122008398e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +388 1 1.5291398203624105e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +389 1 1.5857746285239813e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +390 1 1.6424094366855520e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +391 1 1.6990442448471228e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +392 1 1.7556790530086936e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +393 1 1.8123138611702643e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +394 1 1.8689486693318351e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +395 1 1.9255834774934058e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +396 1 1.9822182856549766e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +397 1 2.0388530938165474e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +398 1 2.0954879019781181e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +399 1 2.1521227101396889e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 +400 1 2.2087575183012596e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 +401 1 0.0000000000000000e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +402 1 1.1326961632314152e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +403 1 2.2653923264628304e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +404 1 3.3980884896942456e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +405 1 4.5307846529256608e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +406 1 5.6634808161570760e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +407 1 6.7961769793884912e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +408 1 7.9288731426199064e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +409 1 9.0615693058513216e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +410 1 1.0194265469082737e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +411 1 1.1326961632314152e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +412 1 1.2459657795545567e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +413 1 1.3592353958776982e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +414 1 1.4725050122008398e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +415 1 1.5857746285239813e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +416 1 1.6990442448471228e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +417 1 1.8123138611702643e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +418 1 1.9255834774934058e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +419 1 2.0388530938165474e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 +420 1 2.1521227101396889e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 + +Velocities + +1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +50 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +54 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +56 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +64 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +65 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +66 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +67 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +68 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +69 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +70 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +71 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +72 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +73 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +74 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +75 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +76 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +77 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +78 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +79 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +80 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +81 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +82 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +83 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +84 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +85 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +86 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +87 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +88 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +89 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +90 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +91 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +92 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +93 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +94 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +95 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +96 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +97 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +98 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +99 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +100 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +101 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +102 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +103 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +104 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +105 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +106 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +107 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +108 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +109 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +110 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +111 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +112 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +113 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +114 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +115 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +116 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +117 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +118 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +119 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +120 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +121 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +122 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +123 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +124 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +125 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +126 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +127 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +128 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +129 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +130 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +131 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +132 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +133 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +134 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +135 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +136 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +137 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +138 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +139 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +140 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +141 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +142 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +143 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +144 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +145 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +146 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +147 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +148 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +149 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +150 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +151 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +152 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +153 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +154 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +155 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +156 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +157 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +158 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +159 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +160 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +161 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +162 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +163 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +164 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +165 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +166 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +167 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +168 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +169 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +170 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +171 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +172 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +173 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +174 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +175 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +176 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +177 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +178 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +179 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +180 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +181 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +182 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +183 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +184 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +185 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +186 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +187 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +188 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +189 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +190 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +191 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +192 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +193 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +194 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +195 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +196 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +197 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +198 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +199 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +200 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +201 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +202 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +203 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +204 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +205 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +206 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +207 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +208 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +209 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +210 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +211 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +212 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +213 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +214 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +215 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +216 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +217 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +218 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +219 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +220 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +221 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +222 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +223 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +224 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +225 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +226 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +227 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +228 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +229 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +230 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +231 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +232 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +233 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +234 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +235 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +236 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +237 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +238 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +239 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +240 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +241 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +242 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +243 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +244 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +245 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +246 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +247 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +248 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +249 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +250 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +251 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +252 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +253 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +254 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +255 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +256 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +257 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +258 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +259 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +260 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +261 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +262 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +263 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +264 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +265 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +266 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +267 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +268 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +269 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +270 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +271 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +272 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +273 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +274 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +275 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +276 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +277 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +278 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +279 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +280 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +281 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +282 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +283 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +284 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +285 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +286 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +287 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +288 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +289 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +290 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +291 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +292 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +293 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +294 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +295 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +296 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +297 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +298 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +299 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +300 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +301 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +302 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +303 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +304 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +305 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +306 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +307 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +308 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +309 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +310 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +311 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +312 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +313 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +314 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +315 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +316 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +317 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +318 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +319 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +320 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +321 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +322 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +323 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +324 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +325 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +326 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +327 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +328 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +329 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +330 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +331 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +332 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +333 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +334 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +335 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +336 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +337 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +338 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +339 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +340 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +341 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +342 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +343 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +344 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +345 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +346 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +347 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +348 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +349 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +350 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +351 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +352 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +353 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +354 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +355 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +356 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +357 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +358 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +359 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +360 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +361 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +362 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +363 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +364 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +365 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +366 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +367 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +368 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +369 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +370 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +371 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +372 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +373 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +374 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +375 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +376 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +377 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +378 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +379 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +380 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +381 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +382 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +383 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +384 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +385 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +386 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +387 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +388 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +389 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +390 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +391 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +392 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +393 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +394 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +395 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +396 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +397 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +398 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +399 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +400 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +401 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +402 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +403 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +404 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +405 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +406 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +407 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +408 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +409 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +410 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +411 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +412 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +413 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +414 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +415 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +416 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +417 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +418 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +419 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +420 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/examples/SPIN/gneb_bfo/initial.iron_spin b/examples/SPIN/gneb_bfo/initial.iron_spin new file mode 100644 index 0000000000..1d28afe400 --- /dev/null +++ b/examples/SPIN/gneb_bfo/initial.iron_spin @@ -0,0 +1,82 @@ +LAMMPS data file via write_data, version 4 Jan 2019, timestep = 0 + +32 atoms +1 atom types + +0.0000000000000000e+00 1.1465999999999999e+01 xlo xhi +0.0000000000000000e+00 1.1465999999999999e+01 ylo yhi +0.0000000000000000e+00 2.8664999999999998e+00 zlo zhi + +Masses + +1 55.845 + +Atoms # spin + +1 1 2.2000000000000002e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +2 1 2.2000000000000002e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +3 1 2.2000000000000002e+00 2.8664999999999998e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +4 1 2.2000000000000002e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +5 1 2.2000000000000002e+00 5.7329999999999997e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +6 1 2.2000000000000002e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +7 1 2.2000000000000002e+00 8.5994999999999990e+00 0.0000000000000000e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +8 1 2.2000000000000002e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +9 1 2.2000000000000002e+00 0.0000000000000000e+00 2.8664999999999998e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +11 1 2.2000000000000002e+00 2.8664999999999998e+00 2.8664999999999998e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +13 1 2.2000000000000002e+00 5.7329999999999997e+00 2.8664999999999998e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +15 1 2.2000000000000002e+00 8.5994999999999990e+00 2.8664999999999998e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +10 1 2.2000000000000002e+00 1.4332499999999999e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +12 1 2.2000000000000002e+00 4.2997499999999995e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +14 1 2.2000000000000002e+00 7.1662499999999998e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +16 1 2.2000000000000002e+00 1.0032750000000000e+01 4.2997499999999995e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +17 1 2.2000000000000002e+00 0.0000000000000000e+00 5.7329999999999997e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +18 1 2.2000000000000002e+00 1.4332499999999999e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +19 1 2.2000000000000002e+00 2.8664999999999998e+00 5.7329999999999997e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +20 1 2.2000000000000002e+00 4.2997499999999995e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +21 1 2.2000000000000002e+00 5.7329999999999997e+00 5.7329999999999997e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +22 1 2.2000000000000002e+00 7.1662499999999998e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +23 1 2.2000000000000002e+00 8.5994999999999990e+00 5.7329999999999997e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +24 1 2.2000000000000002e+00 1.0032750000000000e+01 7.1662499999999998e+00 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +25 1 2.2000000000000002e+00 0.0000000000000000e+00 8.5994999999999990e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +27 1 2.2000000000000002e+00 2.8664999999999998e+00 8.5994999999999990e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +29 1 2.2000000000000002e+00 5.7329999999999997e+00 8.5994999999999990e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +31 1 2.2000000000000002e+00 8.5994999999999990e+00 8.5994999999999990e+00 0.0000000000000000e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +26 1 2.2000000000000002e+00 1.4332499999999999e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +28 1 2.2000000000000002e+00 4.2997499999999995e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +30 1 2.2000000000000002e+00 7.1662499999999998e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 +32 1 2.2000000000000002e+00 1.0032750000000000e+01 1.0032750000000000e+01 1.4332499999999999e+00 1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 + +Velocities + +1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/REPLICA/fix_neb_spin.cpp new file mode 100644 index 0000000000..a96af45267 --- /dev/null +++ b/src/REPLICA/fix_neb_spin.cpp @@ -0,0 +1,1226 @@ +/* ---------------------------------------------------------------------- + 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 for: Emile Maras (CEA, France) + new options for inter-replica forces, first/last replica treatment +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +//#include "fix_neb.h" +#include "fix_neb_spin.h" +#include "universe.h" +#include "update.h" +#include "atom.h" +#include "domain.h" +#include "comm.h" +#include "modify.h" +#include "compute.h" +#include "group.h" +#include "memory.h" +#include "error.h" +#include "force.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace FixConst; +using namespace MathConst; + +enum{SINGLE_PROC_DIRECT,SINGLE_PROC_MAP,MULTI_PROC}; + +#define BUFSIZE 8 + +/* ---------------------------------------------------------------------- */ + +FixNEB_spin::FixNEB_spin(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg), + id_pe(NULL), pe(NULL), nlenall(NULL), xprev(NULL), xnext(NULL), + fnext(NULL), + spprev(NULL), spnext(NULL), fmnext(NULL), + springF(NULL), tangent(NULL), + xsend(NULL), xrecv(NULL), fsend(NULL), frecv(NULL), + spsend(NULL), sprecv(NULL), fmsend(NULL), fmrecv(NULL), + tagsend(NULL), tagrecv(NULL), + xsendall(NULL), xrecvall(NULL), fsendall(NULL), frecvall(NULL), + spsendall(NULL), sprecvall(NULL), fmsendall(NULL), fmrecvall(NULL), + tagsendall(NULL), tagrecvall(NULL), counts(NULL), + displacements(NULL) +{ + + if (narg < 4) error->all(FLERR,"Illegal fix neb_spin command"); + + kspring = force->numeric(FLERR,arg[3]); + if (kspring <= 0.0) error->all(FLERR,"Illegal fix neb command"); + + // optional params + + NEBLongRange = false; // see if needed (comb. with pppm/spin?) + StandardNEB = true; // only option for now + PerpSpring = FreeEndIni = FreeEndFinal = false; + FreeEndFinalWithRespToEIni = FinalAndInterWithRespToEIni = false; + kspringPerp = 0.0; + kspringIni = 1.0; + kspringFinal = 1.0; + // only regular neb for now + SpinLattice = false; + + + + int iarg = 4; + while (iarg < narg) { + if (strcmp(arg[iarg],"lattice") == 0) + error->all(FLERR,"Illegal fix neb command"); + } + + /* + if (strcmp(arg[iarg],"parallel") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix neb command"); + if (strcmp(arg[iarg+1],"ideal") == 0) { + NEBLongRange = true; + StandardNEB = false; + } else if (strcmp(arg[iarg+1],"neigh") == 0) { + NEBLongRange = false; + StandardNEB = true; + } else error->all(FLERR,"Illegal fix neb command"); + iarg += 2; + + } else if (strcmp(arg[iarg],"perp") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal fix neb command"); + PerpSpring = true; + kspringPerp = force->numeric(FLERR,arg[iarg+1]); + if (kspringPerp == 0.0) PerpSpring = false; + if (kspringPerp < 0.0) error->all(FLERR,"Illegal fix neb command"); + iarg += 2; + + } else if (strcmp (arg[iarg],"end") == 0) { + if (iarg+3 > narg) error->all(FLERR,"Illegal fix neb command"); + if (strcmp(arg[iarg+1],"first") == 0) { + FreeEndIni = true; + kspringIni = force->numeric(FLERR,arg[iarg+2]); + } else if (strcmp(arg[iarg+1],"last") == 0) { + FreeEndFinal = true; + FinalAndInterWithRespToEIni = false; + FreeEndFinalWithRespToEIni = false; + kspringFinal = force->numeric(FLERR,arg[iarg+2]); + } else if (strcmp(arg[iarg+1],"last/efirst") == 0) { + FreeEndFinal = false; + FinalAndInterWithRespToEIni = false; + FreeEndFinalWithRespToEIni = true; + kspringFinal = force->numeric(FLERR,arg[iarg+2]); + } else if (strcmp(arg[iarg+1],"last/efirst/middle") == 0) { + FreeEndFinal = false; + FinalAndInterWithRespToEIni = true; + FreeEndFinalWithRespToEIni = true; + kspringFinal = force->numeric(FLERR,arg[iarg+2]); + } else error->all(FLERR,"Illegal fix neb command"); + + iarg += 3; + + } else error->all(FLERR,"Illegal fix neb command"); + } + */ + + // nreplica = number of partitions + // ireplica = which world I am in universe + // nprocs_universe = # of procs in all replicase + // procprev,procnext = root proc in adjacent replicas + + me = comm->me; + nprocs = comm->nprocs; + + nprocs_universe = universe->nprocs; + nreplica = universe->nworlds; + ireplica = universe->iworld; + + if (ireplica > 0) procprev = universe->root_proc[ireplica-1]; + else procprev = -1; + if (ireplica < nreplica-1) procnext = universe->root_proc[ireplica+1]; + else procnext = -1; + + uworld = universe->uworld; + int *iroots = new int[nreplica]; + MPI_Group uworldgroup,rootgroup; + if (NEBLongRange) { + for (int i=0; iroot_proc[i]; + MPI_Comm_group(uworld, &uworldgroup); + MPI_Group_incl(uworldgroup, nreplica, iroots, &rootgroup); + MPI_Comm_create(uworld, rootgroup, &rootworld); + } + delete [] iroots; + + // create a new compute pe style + // id = fix-ID + pe, compute group = all + + int n = strlen(id) + 4; + id_pe = new char[n]; + strcpy(id_pe,id); + strcat(id_pe,"_pe"); + + char **newarg = new char*[3]; + newarg[0] = id_pe; + newarg[1] = (char *) "all"; + newarg[2] = (char *) "pe"; + modify->add_compute(3,newarg); + delete [] newarg; + + // might need a test + // => check if pe does not compute mech potentials + + + // initialize local storage + + maxlocal = -1; + ntotal = -1; +} + +/* ---------------------------------------------------------------------- */ + +FixNEB_spin::~FixNEB_spin() +{ + modify->delete_compute(id_pe); + delete [] id_pe; + + memory->destroy(xprev); + memory->destroy(xnext); + memory->destroy(tangent); + memory->destroy(fnext); + // spin quantities + memory->destroy(spprev); + memory->destroy(spnext); + memory->destroy(fmnext); + memory->destroy(springF); + memory->destroy(xsend); + memory->destroy(xrecv); + memory->destroy(fsend); + memory->destroy(frecv); + // spin quantities + memory->destroy(spsend); + memory->destroy(sprecv); + memory->destroy(fmsend); + memory->destroy(fmrecv); + memory->destroy(tagsend); + memory->destroy(tagrecv); + + memory->destroy(xsendall); + memory->destroy(xrecvall); + memory->destroy(fsendall); + memory->destroy(frecvall); + // spin quantities + memory->destroy(spsendall); + memory->destroy(sprecvall); + memory->destroy(fmsendall); + memory->destroy(fmrecvall); + memory->destroy(tagsendall); + memory->destroy(tagrecvall); + + memory->destroy(counts); + memory->destroy(displacements); + + if (NEBLongRange) { + if (rootworld != MPI_COMM_NULL) MPI_Comm_free(&rootworld); + memory->destroy(nlenall); + } +} + +/* ---------------------------------------------------------------------- */ + +int FixNEB_spin::setmask() +{ + int mask = 0; + mask |= MIN_POST_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixNEB_spin::init() +{ + int icompute = modify->find_compute(id_pe); + if (icompute < 0) + error->all(FLERR,"Potential energy ID for fix neb does not exist"); + pe = modify->compute[icompute]; + + // turn off climbing mode, NEB command turns it on after init() + + rclimber = -1; + + // nebatoms = # of atoms in fix group = atoms with inter-replica forces + + bigint count = group->count(igroup); + if (count > MAXSMALLINT) error->all(FLERR,"Too many active NEB atoms"); + nebatoms = count; + + // comm mode for inter-replica exchange of coords + + if (nreplica == nprocs_universe && + nebatoms == atom->natoms && atom->sortfreq == 0) + cmode = SINGLE_PROC_DIRECT; + else if (nreplica == nprocs_universe) cmode = SINGLE_PROC_MAP; + else cmode = MULTI_PROC; + + // ntotal = total # of atoms in system, NEB atoms or not + + if (atom->natoms > MAXSMALLINT) error->all(FLERR,"Too many atoms for NEB"); + ntotal = atom->natoms; + + if (atom->nmax > maxlocal) reallocate(); + + if (MULTI_PROC && counts == NULL) { + memory->create(xsendall,ntotal,3,"neb:xsendall"); + memory->create(xrecvall,ntotal,3,"neb:xrecvall"); + memory->create(fsendall,ntotal,3,"neb:fsendall"); + memory->create(frecvall,ntotal,3,"neb:frecvall"); + memory->create(tagsendall,ntotal,"neb:tagsendall"); + memory->create(tagrecvall,ntotal,"neb:tagrecvall"); + // spin quantities + memory->create(spsendall,ntotal,3,"neb:xsendall"); + memory->create(sprecvall,ntotal,3,"neb:xrecvall"); + memory->create(fmsendall,ntotal,3,"neb:fsendall"); + memory->create(fmrecvall,ntotal,3,"neb:frecvall"); + memory->create(counts,nprocs,"neb:counts"); + memory->create(displacements,nprocs,"neb:displacements"); + } +} + +/* ---------------------------------------------------------------------- */ + +void FixNEB_spin::min_setup(int vflag) +{ + min_post_force(vflag); + + // trigger potential energy computation on next timestep + + pe->addstep(update->ntimestep+1); +} + +/* ---------------------------------------------------------------------- */ + +void FixNEB_spin::min_post_force(int /*vflag*/) +{ + double vprev,vnext; + //double delxp,delyp,delzp,delxn,delyn,delzn; + // spin quantities + double delspxp,delspyp,delspzp; + double delspxn,delspyn,delspzn; + double templen; + double vIni=0.0; + + // local spin values for geo. dist. calc. + double spi[3],spj[3]; + + vprev = vnext = veng = pe->compute_scalar(); + + if (ireplica < nreplica-1 && me == 0) + MPI_Send(&veng,1,MPI_DOUBLE,procnext,0,uworld); + if (ireplica > 0 && me == 0) + MPI_Recv(&vprev,1,MPI_DOUBLE,procprev,0,uworld,MPI_STATUS_IGNORE); + + if (ireplica > 0 && me == 0) + MPI_Send(&veng,1,MPI_DOUBLE,procprev,0,uworld); + if (ireplica < nreplica-1 && me == 0) + MPI_Recv(&vnext,1,MPI_DOUBLE,procnext,0,uworld,MPI_STATUS_IGNORE); + + if (cmode == MULTI_PROC) { + MPI_Bcast(&vprev,1,MPI_DOUBLE,0,world); + MPI_Bcast(&vnext,1,MPI_DOUBLE,0,world); + } + + if (FreeEndFinal && ireplica == nreplica-1 && (update->ntimestep == 0)) EFinalIni = veng; + + if (ireplica == 0) vIni=veng; + + if (FreeEndFinalWithRespToEIni) { + if (cmode == SINGLE_PROC_DIRECT || cmode == SINGLE_PROC_MAP) { + int procFirst; + procFirst=universe->root_proc[0]; + MPI_Bcast(&vIni,1,MPI_DOUBLE,procFirst,uworld); + } else { + if (me == 0) + MPI_Bcast(&vIni,1,MPI_DOUBLE,0,rootworld); + + MPI_Bcast(&vIni,1,MPI_DOUBLE,0,world); + } + } + + if (FreeEndIni && ireplica == 0 && (update->ntimestep == 0)) EIniIni = veng; + /* if (FreeEndIni && ireplica == 0) { + // if (me == 0 ) + if (update->ntimestep == 0) { + EIniIni = veng; + // if (cmode == MULTI_PROC) + // MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); + } + }*/ + + // communicate atoms to/from adjacent replicas to fill xprev,xnext + + inter_replica_comm(); + + // trigger potential energy computation on next timestep + + pe->addstep(update->ntimestep+1); + + double **x = atom->x; + // spin quantities + double **sp = atom->sp; + int *mask = atom->mask; + double dot = 0.0; + double prefactor = 0.0; + + double **f = atom->f; + // spin quantities + double **fm = atom->fm; + int nlocal = atom->nlocal; + + //calculating separation between images + + plen = 0.0; + nlen = 0.0; + double tlen = 0.0; + double gradnextlen = 0.0; + + dotgrad = gradlen = dotpath = dottangrad = 0.0; + + + // computation of the tangent vector + + // final replica + if (ireplica == nreplica-1) { + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + // tangent vector + delspxp = sp[i][0] - spprev[i][0]; + delspyp = sp[i][1] - spprev[i][1]; + delspzp = sp[i][2] - spprev[i][2]; + domain->minimum_image(delspxp,delspyp,delspzp); // check what it does + delsqp = delspxp*delspxp+delspyp*delspyp+delspzp*delspzp; + + // calc. geodesic length + spi[0]=sp[i][0]; + spi[1]=sp[i][1]; + spi[2]=sp[i][2]; + spj[0]=spprev[i][0]; + spj[1]=spprev[i][1]; + spj[2]=spprev[i][2]; + templen = geodesic_distance(spi, spj); + plen += templen*templen; + dottangrad += delxp*fm[i][0]+ delyp*fm[i][1]+delzp*fm[i][2]; + gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; + + //plen += delxp*delxp + delyp*delyp + delzp*delzp; + //dottangrad += delxp* f[i][0]+ delyp*f[i][1]+delzp*f[i][2]; + //gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + + // final replica, no need for the tangent vector + // (unless FreeEnd option) + if (FreeEndFinal||FreeEndFinalWithRespToEIni) { + error->all(FLERR,"Free End option not yet active"); + tangent[i][0]=delspxp; + tangent[i][1]=delspyp; + tangent[i][2]=delspzp; + // if needed, tlen has to be modified + tlen += tangent[i][0]*tangent[i][0] + + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + dot += fm[i][0]*tangent[i][0] + fm[i][1]*tangent[i][1] + + fm[i][2]*tangent[i][2]; + } + + + //delxp = x[i][0] - xprev[i][0]; + //delyp = x[i][1] - xprev[i][1]; + //delzp = x[i][2] - xprev[i][2]; + //domain->minimum_image(delxp,delyp,delzp); + + //plen += delxp*delxp + delyp*delyp + delzp*delzp; + //dottangrad += delxp* f[i][0]+ delyp*f[i][1]+delzp*f[i][2]; + //gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + //if (FreeEndFinal||FreeEndFinalWithRespToEIni) { + // tangent[i][0]=delxp; + // tangent[i][1]=delyp; + // tangent[i][2]=delzp; + // tlen += tangent[i][0]*tangent[i][0] + + // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + // dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + + // f[i][2]*tangent[i][2]; + //} + } + + // initial replica + } else if (ireplica == 0) { + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + + // tangent vector + delspxn = spnext[i][0]- sp[i][0]; + delspyn = spnext[i][1]- sp[i][1]; + delspzn = spnext[i][2]- sp[i][2]; + domain->minimum_image(delspxn,delspyn,delspzn); // check what it does + delsqn = delspxn*delspxn+delspyn*delspyn+delspzn*delspzn; + + // calc. geodesic length + spi[0]=sp[i][0]; + spi[1]=sp[i][1]; + spi[2]=sp[i][2]; + spj[0]=spnext[i][0]; + spj[1]=spnext[i][1]; + spj[2]=spnext[i][2]; + templen = geodesic_distance(spi, spj); + nlen += templen*templen; + dottangrad += delspxn*fm[i][0] + delspyn*fm[i][1] + delspzp*fm[i][2]; + gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; + if (FreeEndIni) { + error->all(FLERR,"Free End option not yet active"); + tangent[i][0]=delxn; + tangent[i][1]=delyn; + tangent[i][2]=delzn; + // if needed, tlen has to be modified + tlen += tangent[i][0]*tangent[i][0] + + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + + f[i][2]*tangent[i][2]; + } + + //delxn = xnext[i][0] - x[i][0]; + //delyn = xnext[i][1] - x[i][1]; + //delzn = xnext[i][2] - x[i][2]; + //domain->minimum_image(delxn,delyn,delzn); + //nlen += delxn*delxn + delyn*delyn + delzn*delzn; + //gradnextlen += fnext[i][0]*fnext[i][0] + // + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + //dotgrad += f[i][0]*fnext[i][0] + // + f[i][1]*fnext[i][1] + f[i][2]*fnext[i][2]; + //dottangrad += delxn*f[i][0]+ delyn*f[i][1] + delzn*f[i][2]; + //gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + //if (FreeEndIni) { + // tangent[i][0]=delxn; + // tangent[i][1]=delyn; + // tangent[i][2]=delzn; + // tlen += tangent[i][0]*tangent[i][0] + + // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + // dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + + // f[i][2]*tangent[i][2]; + //} + } + + // in-between replica + } else { + + // not the first or last replica + + double vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); + double vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); + + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + delspxp = spx[i][0] - spxprev[i][0]; + delspyp = spx[i][1] - spxprev[i][1]; + delspzp = spx[i][2] - spxprev[i][2]; + domain->minimum_image(delspxp,delspyp,delspzp); + + // calc. geodesic length + spi[0]=sp[i][0]; + spi[1]=sp[i][1]; + spi[2]=sp[i][2]; + spj[0]=spprev[i][0]; + spj[1]=spprev[i][1]; + spj[2]=spprev[i][2]; + templen = geodesic_distance(spi, spj); + plen += templen*templen; + + delspxn = spxnext[i][0] - spx[i][0]; + delspyn = spxnext[i][1] - spx[i][1]; + delspzn = spxnext[i][2] - spx[i][2]; + domain->minimum_image(delspxn,delspyn,delspzn); + + if (vnext > veng && veng > vprev) { + tangent[i][0] = delspxn; + tangent[i][1] = delspyn; + tangent[i][2] = delspzn; + } else if (vnext < veng && veng < vprev) { + tangent[i][0] = delspxp; + tangent[i][1] = delspyp; + tangent[i][2] = delspzp; + } else { + if (vnext > vprev) { + tangent[i][0] = vmax*delspxn + vmin*delspxp; + tangent[i][1] = vmax*delspyn + vmin*delspyp; + tangent[i][2] = vmax*delspzn + vmin*delspzp; + } else if (vnext < vprev) { + tangent[i][0] = vmin*delspxn + vmax*delspxp; + tangent[i][1] = vmin*delspyn + vmax*delspyp; + tangent[i][2] = vmin*delspzn + vmax*delspzp; + } else { // vnext == vprev, e.g. for potentials that do not compute an energy + tangent[i][0] = delspxn + delspxp; + tangent[i][1] = delspyn + delspyp; + tangent[i][2] = delspzn + delspzp; + } + } + + // calc. geodesic length + spi[0]=sp[i][0]; + spi[1]=sp[i][1]; + spi[2]=sp[i][2]; + spj[0]=spnext[i][0]; + spj[1]=spnext[i][1]; + spj[2]=spnext[i][2]; + templen = geodesic_distance(spi, spj); + nlen += templen*templen; + //nlen += delxn*delxn + delyn*delyn + delzn*delzn; + tlen += tangent[i][0]*tangent[i][0] + + tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; + dotpath += delspxp*delspxn + delspyp*delspyn + delspzp*delspzn; + dottangrad += tangent[i][0]*fm[i][0] + + tangent[i][1]*fm[i][1] + tangent[i][2]*fm[i][2]; + gradnextlen += fnext[i][0]*fnext[i][0] + + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + dotgrad += fm[i][0]*fnext[i][0] + fm[i][1]*fnext[i][1] + + fm[i][2]*fnext[i][2]; + + // is this a perpandicular spring force? + if (kspringPerp != 0.0) + error->all(FLERR,"Perpendicular nudging force not yet active"); + //springF[i][0] = kspringPerp*(delxn-delxp); + //springF[i][1] = kspringPerp*(delyn-delyp); + //springF[i][2] = kspringPerp*(delzn-delzp); + + //delxp = x[i][0] - xprev[i][0]; + //delyp = x[i][1] - xprev[i][1]; + //delzp = x[i][2] - xprev[i][2]; + //domain->minimum_image(delxp,delyp,delzp); + //plen += delxp*delxp + delyp*delyp + delzp*delzp; + + //delxn = xnext[i][0] - x[i][0]; + //delyn = xnext[i][1] - x[i][1]; + //delzn = xnext[i][2] - x[i][2]; + //domain->minimum_image(delxn,delyn,delzn); + + //if (vnext > veng && veng > vprev) { + // tangent[i][0] = delxn; + // tangent[i][1] = delyn; + // tangent[i][2] = delzn; + //} else if (vnext < veng && veng < vprev) { + // tangent[i][0] = delxp; + // tangent[i][1] = delyp; + // tangent[i][2] = delzp; + //} else { + // if (vnext > vprev) { + // tangent[i][0] = vmax*delxn + vmin*delxp; + // tangent[i][1] = vmax*delyn + vmin*delyp; + // tangent[i][2] = vmax*delzn + vmin*delzp; + // } else if (vnext < vprev) { + // tangent[i][0] = vmin*delxn + vmax*delxp; + // tangent[i][1] = vmin*delyn + vmax*delyp; + // tangent[i][2] = vmin*delzn + vmax*delzp; + // } else { // vnext == vprev, e.g. for potentials that do not compute an energy + // tangent[i][0] = delxn + delxp; + // tangent[i][1] = delyn + delyp; + // tangent[i][2] = delzn + delzp; + // } + //} + + //nlen += delxn*delxn + delyn*delyn + delzn*delzn; + //tlen += tangent[i][0]*tangent[i][0] + + // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + //gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + //dotpath += delxp*delxn + delyp*delyn + delzp*delzn; + //dottangrad += tangent[i][0]*f[i][0] + + // tangent[i][1]*f[i][1] + tangent[i][2]*f[i][2]; + //gradnextlen += fnext[i][0]*fnext[i][0] + + // fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + //dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + + // f[i][2]*fnext[i][2]; + + //springF[i][0] = kspringPerp*(delxn-delxp); + //springF[i][1] = kspringPerp*(delyn-delyp); + //springF[i][2] = kspringPerp*(delzn-delzp); + } + } + + + // MPI reduce if more than one proc for world + + double bufin[BUFSIZE], bufout[BUFSIZE]; + bufin[0] = nlen; + bufin[1] = plen; + bufin[2] = tlen; + bufin[3] = gradlen; + bufin[4] = gradnextlen; + bufin[5] = dotpath; + bufin[6] = dottangrad; + bufin[7] = dotgrad; + MPI_Allreduce(bufin,bufout,BUFSIZE,MPI_DOUBLE,MPI_SUM,world); + nlen = sqrt(bufout[0]); + plen = sqrt(bufout[1]); + tlen = sqrt(bufout[2]); + gradlen = sqrt(bufout[3]); + gradnextlen = sqrt(bufout[4]); + dotpath = bufout[5]; + dottangrad = bufout[6]; + dotgrad = bufout[7]; + + // normalize tangent vector + + if (tlen > 0.0) { + double tleninv = 1.0/tlen; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + tangent[i][0] *= tleninv; + tangent[i][1] *= tleninv; + tangent[i][2] *= tleninv; + } + } + +//////////////////////////////////////////////////////// + + // first or last replica has no change to forces, just return + + if (ireplica > 0 && ireplica < nreplica-1) + dottangrad = dottangrad/(tlen*gradlen); + if (ireplica == 0) + dottangrad = dottangrad/(nlen*gradlen); + if (ireplica == nreplica-1) + dottangrad = dottangrad/(plen*gradlen); + if (ireplica < nreplica-1) + dotgrad = dotgrad /(gradlen*gradnextlen); + + if (FreeEndIni && ireplica == 0) { + if (tlen > 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall/tlen; + + if (dot<0) prefactor = -dot - kspringIni*(veng-EIniIni); + else prefactor = -dot + kspringIni*(veng-EIniIni); + + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + f[i][0] += prefactor *tangent[i][0]; + f[i][1] += prefactor *tangent[i][1]; + f[i][2] += prefactor *tangent[i][2]; + } + } + } + + if (FreeEndFinal && ireplica == nreplica -1) { + if (tlen > 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall/tlen; + + if (veng 0.0) { + double dotall; + MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); + dot=dotall/tlen; + if (veng0) { + for (int i = 0; i < rclimber; i++) + lenuntilClimber += nlenall[i]; + double meanDistBeforeClimber = lenuntilClimber/rclimber; + double meanDistAfterClimber = + (lentot-lenuntilClimber)/(nreplica-rclimber-1); + if (ireplicanmax > maxlocal) reallocate(); + + double **x = atom->x; + double **f = atom->f; + // spin quantities + double **sp = atom->sp; + double **fm = atom->fm; + tagint *tag = atom->tag; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + // ----------------------------------------------------- + // 3 cases: two for single proc per replica + // one for multiple procs per replica + // ----------------------------------------------------- + + + // case 1 => to be done + + // single proc per replica + // all atoms are NEB atoms and no atom sorting + // direct comm of x -> xprev and x -> xnext + + if (cmode == SINGLE_PROC_DIRECT) { + if (ireplica > 0) + MPI_Irecv(xprev[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld,&request); + if (ireplica < nreplica-1) + MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld); + if (ireplica > 0) MPI_Wait(&request,MPI_STATUS_IGNORE); + if (ireplica < nreplica-1) + MPI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + if (ireplica > 0) + MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); + if (ireplica < nreplica-1) MPI_Wait(&request,MPI_STATUS_IGNORE); + + if (ireplica < nreplica-1) + MPI_Irecv(fnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + if (ireplica > 0) + MPI_Send(f[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); + if (ireplica < nreplica-1) MPI_Wait(&request,MPI_STATUS_IGNORE); + + return; + } + + // single proc per replica + // but only some atoms are NEB atoms or atom sorting is enabled + // send atom IDs and coords of only NEB atoms to prev/next proc + // recv procs use atom->map() to match received coords to owned atoms + + if (cmode == SINGLE_PROC_MAP) { + m = 0; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + tagsend[m] = tag[i]; + xsend[m][0] = x[i][0]; + xsend[m][1] = x[i][1]; + xsend[m][2] = x[i][2]; + fsend[m][0] = f[i][0]; + fsend[m][1] = f[i][1]; + fsend[m][2] = f[i][2]; + // spin quantities + spsend[m][0] = sp[i][0]; + spsend[m][1] = sp[i][1]; + spsend[m][2] = sp[i][2]; + fmsend[m][0] = fm[i][0]; + fmsend[m][1] = fm[i][1]; + fmsend[m][2] = fm[i][2]; + m++; + } + + if (ireplica > 0) { + MPI_Irecv(xrecv[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); + // spin quantities + MPI_Irecv(sprecv[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); + MPI_Irecv(tagrecv,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld,&requests[1]); + } + if (ireplica < nreplica-1) { + MPI_Send(xsend[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld); + // spin quantities + MPI_Send(spsend[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld); + MPI_Send(tagsend,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld); + } + + if (ireplica > 0) { + MPI_Waitall(2,requests,statuses); + for (i = 0; i < nebatoms; i++) { + m = atom->map(tagrecv[i]); + xprev[m][0] = xrecv[i][0]; + xprev[m][1] = xrecv[i][1]; + xprev[m][2] = xrecv[i][2]; + // spin quantities + spprev[m][0] = sprecv[i][0]; + spprev[m][1] = sprecv[i][1]; + spprev[m][2] = sprecv[i][2]; + } + } + if (ireplica < nreplica-1) { + MPI_Irecv(xrecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + MPI_Irecv(frecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + // spin quantities + MPI_Irecv(sprecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + MPI_Irecv(fmrecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + MPI_Irecv(tagrecv,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld,&requests[1]); + } + if (ireplica > 0) { + MPI_Send(xsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(fsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + // spin quantities + MPI_Send(spsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(fmsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(tagsend,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld); + } + + if (ireplica < nreplica-1) { + MPI_Waitall(2,requests,statuses); + for (i = 0; i < nebatoms; i++) { + m = atom->map(tagrecv[i]); + xnext[m][0] = xrecv[i][0]; + xnext[m][1] = xrecv[i][1]; + xnext[m][2] = xrecv[i][2]; + fnext[m][0] = frecv[i][0]; + fnext[m][1] = frecv[i][1]; + fnext[m][2] = frecv[i][2]; + // spin quantities + spnext[m][0] = sprecv[i][0]; + spnext[m][1] = sprecv[i][1]; + spnext[m][2] = sprecv[i][2]; + fmnext[m][0] = fmrecv[i][0]; + fmnext[m][1] = fmrecv[i][1]; + fmnext[m][2] = fmrecv[i][2]; + } + } + + return; + } + + // multiple procs per replica + // MPI_Gather all coords and atom IDs to root proc of each replica + // send to root of adjacent replicas + // bcast within each replica + // each proc extracts info for atoms it owns via atom->map() + + m = 0; + for (i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + tagsend[m] = tag[i]; + xsend[m][0] = x[i][0]; + xsend[m][1] = x[i][1]; + xsend[m][2] = x[i][2]; + fsend[m][0] = f[i][0]; + fsend[m][1] = f[i][1]; + fsend[m][2] = f[i][2]; + // spin quantities + spsend[m][0] = sp[i][0]; + spsend[m][1] = sp[i][1]; + spsend[m][2] = sp[i][2]; + fmsend[m][0] = fm[i][0]; + fmsend[m][1] = fm[i][1]; + fmsend[m][2] = fm[i][2]; + m++; + } + + MPI_Gather(&m,1,MPI_INT,counts,1,MPI_INT,0,world); + displacements[0] = 0; + for (i = 0; i < nprocs-1; i++) + displacements[i+1] = displacements[i] + counts[i]; + MPI_Gatherv(tagsend,m,MPI_LMP_TAGINT, + tagsendall,counts,displacements,MPI_LMP_TAGINT,0,world); + for (i = 0; i < nprocs; i++) counts[i] *= 3; + for (i = 0; i < nprocs-1; i++) + displacements[i+1] = displacements[i] + counts[i]; + if (xsend) { + MPI_Gatherv(xsend[0],3*m,MPI_DOUBLE, + xsendall[0],counts,displacements,MPI_DOUBLE,0,world); + MPI_Gatherv(fsend[0],3*m,MPI_DOUBLE, + fsendall[0],counts,displacements,MPI_DOUBLE,0,world); + } else { + MPI_Gatherv(NULL,3*m,MPI_DOUBLE, + xsendall[0],counts,displacements,MPI_DOUBLE,0,world); + MPI_Gatherv(NULL,3*m,MPI_DOUBLE, + fsendall[0],counts,displacements,MPI_DOUBLE,0,world); + } + // spin quantities + if (spsend) { + MPI_Gatherv(spsend[0],3*m,MPI_DOUBLE, + spsendall[0],counts,displacements,MPI_DOUBLE,0,world); + MPI_Gatherv(fmsend[0],3*m,MPI_DOUBLE, + fmsendall[0],counts,displacements,MPI_DOUBLE,0,world); + } else { + MPI_Gatherv(NULL,3*m,MPI_DOUBLE, + xsendall[0],counts,displacements,MPI_DOUBLE,0,world); + MPI_Gatherv(NULL,3*m,MPI_DOUBLE, + fmsendall[0],counts,displacements,MPI_DOUBLE,0,world); + } + + if (ireplica > 0 && me == 0) { + MPI_Irecv(xrecvall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); + // spin quantities + MPI_Irecv(sprecvall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); + MPI_Irecv(tagrecvall,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld, + &requests[1]); + } + if (ireplica < nreplica-1 && me == 0) { + MPI_Send(xsendall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld); + // spin quantities + MPI_Send(spsendall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld); + MPI_Send(tagsendall,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld); + } + + if (ireplica > 0) { + if (me == 0) MPI_Waitall(2,requests,statuses); + + MPI_Bcast(tagrecvall,nebatoms,MPI_INT,0,world); + MPI_Bcast(xrecvall[0],3*nebatoms,MPI_DOUBLE,0,world); + // spin quantities + MPI_Bcast(sprecvall[0],3*nebatoms,MPI_DOUBLE,0,world); + + for (i = 0; i < nebatoms; i++) { + m = atom->map(tagrecvall[i]); + if (m < 0 || m >= nlocal) continue; + xprev[m][0] = xrecvall[i][0]; + xprev[m][1] = xrecvall[i][1]; + xprev[m][2] = xrecvall[i][2]; + // spin quantities + spprev[m][0] = sprecvall[i][0]; + spprev[m][1] = sprecvall[i][1]; + spprev[m][2] = sprecvall[i][2]; + } + } + + if (ireplica < nreplica-1 && me == 0) { + MPI_Irecv(xrecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + MPI_Irecv(frecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + // spin quantities + MPI_Irecv(sprecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + MPI_Irecv(sprecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); + MPI_Irecv(tagrecvall,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld, + &requests[1]); + } + if (ireplica > 0 && me == 0) { + MPI_Send(xsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(fsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + // spin quantities + MPI_Send(spsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(fmsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(tagsendall,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld); + } + + if (ireplica < nreplica-1) { + if (me == 0) MPI_Waitall(2,requests,statuses); + + MPI_Bcast(tagrecvall,nebatoms,MPI_INT,0,world); + MPI_Bcast(xrecvall[0],3*nebatoms,MPI_DOUBLE,0,world); + MPI_Bcast(frecvall[0],3*nebatoms,MPI_DOUBLE,0,world); + // spin quantities + MPI_Bcast(sprecvall[0],3*nebatoms,MPI_DOUBLE,0,world); + MPI_Bcast(fmrecvall[0],3*nebatoms,MPI_DOUBLE,0,world); + + for (i = 0; i < nebatoms; i++) { + m = atom->map(tagrecvall[i]); + if (m < 0 || m >= nlocal) continue; + xnext[m][0] = xrecvall[i][0]; + xnext[m][1] = xrecvall[i][1]; + xnext[m][2] = xrecvall[i][2]; + fnext[m][0] = frecvall[i][0]; + fnext[m][1] = frecvall[i][1]; + fnext[m][2] = frecvall[i][2]; + // spin quantities + spnext[m][0] = sprecvall[i][0]; + spnext[m][1] = sprecvall[i][1]; + spnext[m][2] = sprecvall[i][2]; + fmnext[m][0] = fmrecvall[i][0]; + fmnext[m][1] = fmrecvall[i][1]; + fmnext[m][2] = fmrecvall[i][2]; + } + } +} + +/* ---------------------------------------------------------------------- + reallocate xprev,xnext,tangent arrays if necessary + reallocate communication arrays if necessary +------------------------------------------------------------------------- */ + +void FixNEB_spin::reallocate() +{ + maxlocal = atom->nmax; + + memory->destroy(xprev); + memory->destroy(xnext); + memory->destroy(tangent); + memory->destroy(fnext); + memory->destroy(springF); + // spin quantities + memory->destroy(spprev); + memory->destroy(spnext); + memory->destroy(fmnext); + + memory->create(xprev,maxlocal,3,"neb:xprev"); + memory->create(xnext,maxlocal,3,"neb:xnext"); + memory->create(tangent,maxlocal,3,"neb:tangent"); + memory->create(fnext,maxlocal,3,"neb:fnext"); + memory->create(springF,maxlocal,3,"neb:springF"); + // spin quantities + memory->create(spprev,maxlocal,3,"neb:xprev"); + memory->create(spnext,maxlocal,3,"neb:xnext"); + memory->create(fmnext,maxlocal,3,"neb:fnext"); + + if (cmode != SINGLE_PROC_DIRECT) { + memory->destroy(xsend); + memory->destroy(fsend); + memory->destroy(xrecv); + memory->destroy(frecv); + // spin quantities + memory->destroy(spsend); + memory->destroy(fmsend); + memory->destroy(sprecv); + memory->destroy(fmrecv); + memory->destroy(tagsend); + memory->destroy(tagrecv); + memory->create(xsend,maxlocal,3,"neb:xsend"); + memory->create(fsend,maxlocal,3,"neb:fsend"); + memory->create(xrecv,maxlocal,3,"neb:xrecv"); + memory->create(frecv,maxlocal,3,"neb:frecv"); + // spin quantities + memory->create(spsend,maxlocal,3,"neb:xsend"); + memory->create(fmsend,maxlocal,3,"neb:fsend"); + memory->create(sprecv,maxlocal,3,"neb:xrecv"); + memory->create(fmrecv,maxlocal,3,"neb:frecv"); + memory->create(tagsend,maxlocal,"neb:tagsend"); + memory->create(tagrecv,maxlocal,"neb:tagrecv"); + } + + if (NEBLongRange) { + memory->destroy(nlenall); + memory->create(nlenall,nreplica,"neb:nlenall"); + } +} diff --git a/src/REPLICA/fix_neb_spin.h b/src/REPLICA/fix_neb_spin.h new file mode 100644 index 0000000000..e3bdd6889d --- /dev/null +++ b/src/REPLICA/fix_neb_spin.h @@ -0,0 +1,115 @@ +/* -*- 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(neb,FixNEB) +FixStyle(neb_spin,FixNEB_spin) + +#else + +#ifndef LMP_FIX_NEB_SPIN_H +#define LMP_FIX_NEB_SPIN_H + +#include "fix.h" + +namespace LAMMPS_NS { + +class FixNEB_spin : public Fix { + public: + double veng,plen,nlen,dotpath,dottangrad,gradlen,dotgrad; + int rclimber; + + FixNEB_spin(class LAMMPS *, int, char **); + ~FixNEB_spin(); + int setmask(); + void init(); + void min_setup(int); + void min_post_force(int); + + private: + int me,nprocs,nprocs_universe; + double kspring,kspringIni,kspringFinal,kspringPerp,EIniIni,EFinalIni; + bool StandardNEB,NEBLongRange,PerpSpring,FreeEndIni,FreeEndFinal; + bool FreeEndFinalWithRespToEIni,FinalAndInterWithRespToEIni; + bool SpinLattice; + int ireplica,nreplica; + int procnext,procprev; + int cmode; + MPI_Comm uworld; + MPI_Comm rootworld; + + + char *id_pe; + class Compute *pe; + + int nebatoms; + int ntotal; // total # of atoms, NEB or not + int maxlocal; // size of xprev,xnext,tangent arrays + double *nlenall; + double **xprev,**xnext,**fnext; + // spin quantities + double **spprev,**spnext,**fmnext; + double **springF; + double **tangent; + double **xsend,**xrecv; // coords to send/recv to/from other replica + double **fsend,**frecv; // coords to send/recv to/from other replica + // spin quantities + double **spsend,**sprecv; // sp to send/recv to/from other replica + double **fmsend,**fmrecv; // fm to send/recv to/from other replica + tagint *tagsend,*tagrecv; // ditto for atom IDs + + // info gathered from all procs in my replica + double **xsendall,**xrecvall; // coords to send/recv to/from other replica + double **fsendall,**frecvall; // force to send/recv to/from other replica + // spin quantities + double **spsendall,**sprecvall; // sp to send/recv to/from other replica + double **fmsendall,**fmrecvall; // fm to send/recv to/from other replica + tagint *tagsendall,*tagrecvall; // ditto for atom IDs + + int *counts,*displacements; // used for MPI_Gather + + void inter_replica_comm(); + void reallocate(); +}; + +} + +#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: Potential energy ID for fix neb does not exist + +Self-explanatory. + +E: Too many active NEB atoms + +UNDOCUMENTED + +E: Too many atoms for NEB + +UNDOCUMENTED + +U: Atom count changed in fix neb + +This is not allowed in a NEB calculation. + +*/ diff --git a/src/REPLICA/neb_spin.cpp b/src/REPLICA/neb_spin.cpp new file mode 100644 index 0000000000..7860553532 --- /dev/null +++ b/src/REPLICA/neb_spin.cpp @@ -0,0 +1,722 @@ +/* ---------------------------------------------------------------------- + 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. +------------------------------------------------------------------------- */ + +// lmptype.h must be first b/c this file uses MAXBIGINT and includes mpi.h +// due to OpenMPI bug which sets INT64_MAX via its mpi.h +// before lmptype.h can set flags to insure it is done correctly + +#include "lmptype.h" +#include +#include +#include +#include +//#include "neb.h" +#include "neb_spin.h" +#include "universe.h" +#include "atom.h" +#include "update.h" +#include "domain.h" +#include "comm.h" +#include "min.h" +#include "modify.h" +#include "fix.h" +#include "fix_neb.h" +#include "output.h" +#include "thermo.h" +#include "finish.h" +#include "timer.h" +#include "memory.h" +#include "error.h" +#include "force.h" +#include "math_const.h" + +using namespace LAMMPS_NS; +using namespace MathConst; + +#define MAXLINE 256 +#define CHUNK 1024 +//#define ATTRIBUTE_PERLINE 4 +// 8 attributes: tag number, coords, spin norm, spin dir. +#define ATTRIBUTE_PERLINE 8 + +/* ---------------------------------------------------------------------- */ + +NEB_spin::NEB_spin(LAMMPS *lmp) : Pointers(lmp) {} + +/* ---------------------------------------------------------------------- + internal NEB_spin constructor, called from TAD +------------------------------------------------------------------------- */ + +NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, + int n2steps_in, int nevery_in, double *buf_init, double *buf_final) + : Pointers(lmp) +{ + double delx,dely,delz; + + etol = etol_in; + ftol = ftol_in; + n1steps = n1steps_in; + n2steps = n2steps_in; + nevery = nevery_in; + + // replica info + + nreplica = universe->nworlds; + ireplica = universe->iworld; + me_universe = universe->me; + uworld = universe->uworld; + MPI_Comm_rank(world,&me); + + // generate linear interpolate replica + + double fraction = ireplica/(nreplica-1.0); + + double **x = atom->x; + double **sp = atom->sp; + int nlocal = atom->nlocal; + + // modif interp. + int ii = 0; + for (int i = 0; i < nlocal; i++) { + delx = buf_final[ii] - buf_init[ii]; + dely = buf_final[ii+1] - buf_init[ii+1]; + delz = buf_final[ii+2] - buf_init[ii+2]; + domain->minimum_image(delx,dely,delz); + x[i][0] = buf_init[ii] + fraction*delx; + x[i][1] = buf_init[ii+1] + fraction*dely; + x[i][2] = buf_init[ii+2] + fraction*delz; + ii += 3; + } +} + +/* ---------------------------------------------------------------------- */ + +NEB_spin::~NEB_spin() +{ + MPI_Comm_free(&roots); + memory->destroy(all); + delete [] rdist; +} + +/* ---------------------------------------------------------------------- + perform NEB_spin on multiple replicas +------------------------------------------------------------------------- */ + +void NEB_spin::command(int narg, char **arg) +{ + if (domain->box_exist == 0) + error->all(FLERR,"NEB_spin command before simulation box is defined"); + + if (narg < 6) error->universe_all(FLERR,"Illegal NEB_spin command"); + + etol = force->numeric(FLERR,arg[0]); + ftol = force->numeric(FLERR,arg[1]); + n1steps = force->inumeric(FLERR,arg[2]); + n2steps = force->inumeric(FLERR,arg[3]); + nevery = force->inumeric(FLERR,arg[4]); + + // error checks + + if (etol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); + if (ftol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); + if (nevery <= 0) error->universe_all(FLERR,"Illegal NEB_spin command"); + if (n1steps % nevery || n2steps % nevery) + error->universe_all(FLERR,"Illegal NEB_spin command"); + + // replica info + + nreplica = universe->nworlds; + ireplica = universe->iworld; + me_universe = universe->me; + uworld = universe->uworld; + MPI_Comm_rank(world,&me); + + // error checks + + if (nreplica == 1) error->all(FLERR,"Cannot use NEB_spin with a single replica"); + if (atom->map_style == 0) + error->all(FLERR,"Cannot use NEB_spin unless atom map exists"); + + // process file-style setting to setup initial configs for all replicas + + if (strcmp(arg[5],"final") == 0) { + if (narg != 7 && narg !=8) error->universe_all(FLERR,"Illegal NEB_spin command"); + infile = arg[6]; + readfile(infile,0); + } else if (strcmp(arg[5],"each") == 0) { + if (narg != 7 && narg !=8) error->universe_all(FLERR,"Illegal NEB_spin command"); + infile = arg[6]; + readfile(infile,1); + } else if (strcmp(arg[5],"none") == 0) { + if (narg != 6 && narg !=7) error->universe_all(FLERR,"Illegal NEB_spin command"); + } else error->universe_all(FLERR,"Illegal NEB_spin command"); + + verbose=false; + if (strcmp(arg[narg-1],"verbose") == 0) verbose=true; + // run the NEB_spin calculation + + run(); +} + +/* ---------------------------------------------------------------------- + run NEB_spin on multiple replicas +------------------------------------------------------------------------- */ + +void NEB_spin::run() +{ + // create MPI communicator for root proc from each world + + int color; + if (me == 0) color = 0; + else color = 1; + MPI_Comm_split(uworld,color,0,&roots); + + int ineb; + for (ineb = 0; ineb < modify->nfix; ineb++) + if (strcmp(modify->fix[ineb]->style,"neb_spin") == 0) break; + if (ineb == modify->nfix) error->all(FLERR,"NEB_spin requires use of fix neb_spin"); + //int ineb; + //for (ineb = 0; ineb < modify->nfix; ineb++) + // if (strcmp(modify->fix[ineb]->style,"neb") == 0) break; + //if (ineb == modify->nfix) error->all(FLERR,"NEB_spin requires use of fix neb"); + + //fneb = (FixNEB_spin *) modify->fix[ineb]; + fneb_spin = (FixNEB_spin *) modify->fix[ineb]; + if (verbose) numall =7; + else numall = 4; + memory->create(all,nreplica,numall,"neb:all"); + rdist = new double[nreplica]; + + // initialize LAMMPS + + update->whichflag = 2; + update->etol = etol; + update->ftol = ftol; + update->multireplica = 1; + + lmp->init(); + + if (update->minimize->searchflag) + error->all(FLERR,"NEB_spin requires damped dynamics minimizer"); + + // setup regular NEB_spin minimization + FILE *uscreen = universe->uscreen; + FILE *ulogfile = universe->ulogfile; + + if (me_universe == 0 && uscreen) + fprintf(uscreen,"Setting up regular NEB_spin ...\n"); + + update->beginstep = update->firststep = update->ntimestep; + update->endstep = update->laststep = update->firststep + n1steps; + update->nsteps = n1steps; + update->max_eval = n1steps; + if (update->laststep < 0) + error->all(FLERR,"Too many timesteps for NEB_spin"); + + update->minimize->setup(); + + if (me_universe == 0) { + if (uscreen) { + if (verbose) { + fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " + "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + "... ReplicaForceN MaxAtomForceN\n"); + } else { + fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + "RDN PEN\n"); + } + } + + if (ulogfile) { + if (verbose) { + fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " + "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + "... ReplicaForceN MaxAtomForceN\n"); + } else { + fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + "RDN PEN\n"); + } + } + } + print_status(); + + // perform regular NEB_spin for n1steps or until replicas converge + // retrieve PE values from fix NEB_spin and print every nevery iterations + // break out of while loop early if converged + // damped dynamic min styles insure all replicas converge together + + timer->init(); + timer->barrier_start(); + + while (update->minimize->niter < n1steps) { + update->minimize->run(nevery); + print_status(); + if (update->minimize->stop_condition) break; + } + + timer->barrier_stop(); + + update->minimize->cleanup(); + + Finish finish(lmp); + finish.end(1); + + // switch fix NEB_spin to climbing mode + // top = replica that becomes hill climber + + double vmax = all[0][0]; + int top = 0; + for (int m = 1; m < nreplica; m++) + if (vmax < all[m][0]) { + vmax = all[m][0]; + top = m; + } + + // setup climbing NEB_spin minimization + // must reinitialize minimizer so it re-creates its fix MINIMIZE + + if (me_universe == 0 && uscreen) + fprintf(uscreen,"Setting up climbing ...\n"); + + if (me_universe == 0) { + if (uscreen) + fprintf(uscreen,"Climbing replica = %d\n",top+1); + if (ulogfile) + fprintf(ulogfile,"Climbing replica = %d\n",top+1); + } + + update->beginstep = update->firststep = update->ntimestep; + update->endstep = update->laststep = update->firststep + n2steps; + update->nsteps = n2steps; + update->max_eval = n2steps; + if (update->laststep < 0) + error->all(FLERR,"Too many timesteps"); + + update->minimize->init(); + //fneb->rclimber = top; + fneb_spin->rclimber = top; + update->minimize->setup(); + + if (me_universe == 0) { + if (uscreen) { + if (verbose) { + fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "pathangle1 angletangrad1 anglegrad1 gradV1 " + "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + "... ReplicaForceN MaxAtomForceN\n"); + } else { + fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + } + } + if (ulogfile) { + if (verbose) { + fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "pathangle1 angletangrad1 anglegrad1 gradV1 " + "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + "... ReplicaForceN MaxAtomForceN\n"); + } else { + fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + "GradV0 GradV1 GradVc " + "EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN\n"); + } + } + } + print_status(); + + // perform climbing NEB_spin for n2steps or until replicas converge + // retrieve PE values from fix NEB_spin and print every nevery iterations + // break induced if converged + // damped dynamic min styles insure all replicas converge together + + timer->init(); + timer->barrier_start(); + + while (update->minimize->niter < n2steps) { + update->minimize->run(nevery); + print_status(); + if (update->minimize->stop_condition) break; + } + + timer->barrier_stop(); + + update->minimize->cleanup(); + + finish.end(1); + + update->whichflag = 0; + update->multireplica = 0; + update->firststep = update->laststep = 0; + update->beginstep = update->endstep = 0; +} + +/* ---------------------------------------------------------------------- + read initial config atom coords from file + flag = 0 + only first replica opens file and reads it + first replica bcasts lines to all replicas + final replica stores coords + intermediate replicas interpolate from coords + new coord = replica fraction between current and final state + initial replica does nothing + flag = 1 + each replica (except first) opens file and reads it + each replica stores coords + initial replica does nothing +------------------------------------------------------------------------- */ + +void NEB_spin::readfile(char *file, int flag) +{ + int i,j,m,nchunk,eofflag,nlines; + tagint tag; + char *eof,*start,*next,*buf; + char line[MAXLINE]; + double xx,yy,zz,delx,dely,delz; + // creating new temp. sp + double spx,spy,spz,delspx,delspy,delspz; + + if (me_universe == 0 && screen) + fprintf(screen,"Reading NEB_spin coordinate file(s) ...\n"); + + // flag = 0, universe root reads header of file, bcast to universe + // flag = 1, each replica's root reads header of file, bcast to world + // but explicitly skip first replica + + if (flag == 0) { + if (me_universe == 0) { + open(file); + while (1) { + eof = fgets(line,MAXLINE,fp); + if (eof == NULL) error->one(FLERR,"Unexpected end of neb file"); + start = &line[strspn(line," \t\n\v\f\r")]; + if (*start != '\0' && *start != '#') break; + } + sscanf(line,"%d",&nlines); + } + MPI_Bcast(&nlines,1,MPI_INT,0,uworld); + + } else { + if (me == 0) { + if (ireplica) { + open(file); + while (1) { + eof = fgets(line,MAXLINE,fp); + if (eof == NULL) error->one(FLERR,"Unexpected end of neb file"); + start = &line[strspn(line," \t\n\v\f\r")]; + if (*start != '\0' && *start != '#') break; + } + sscanf(line,"%d",&nlines); + } else nlines = 0; + } + MPI_Bcast(&nlines,1,MPI_INT,0,world); + } + + char *buffer = new char[CHUNK*MAXLINE]; + char **values = new char*[ATTRIBUTE_PERLINE]; + + double fraction = ireplica/(nreplica-1.0); + + double **x = atom->x; + // spin table + double **sp = atom->sp; + int nlocal = atom->nlocal; + + // loop over chunks of lines read from file + // two versions of read_lines_from_file() for world vs universe bcast + // count # of atom coords changed so can check for invalid atom IDs in file + + int ncount = 0; + + int nread = 0; + while (nread < nlines) { + nchunk = MIN(nlines-nread,CHUNK); + if (flag == 0) + eofflag = comm->read_lines_from_file_universe(fp,nchunk,MAXLINE,buffer); + else + eofflag = comm->read_lines_from_file(fp,nchunk,MAXLINE,buffer); + if (eofflag) error->all(FLERR,"Unexpected end of neb file"); + + buf = buffer; + next = strchr(buf,'\n'); + *next = '\0'; + int nwords = atom->count_words(buf); + *next = '\n'; + + if (nwords != ATTRIBUTE_PERLINE) + error->all(FLERR,"Incorrect atom format in neb file"); + + // loop over lines of atom coords + // tokenize the line into values + + for (i = 0; i < nchunk; i++) { + next = strchr(buf,'\n'); + + values[0] = strtok(buf," \t\n\r\f"); + for (j = 1; j < nwords; j++) + values[j] = strtok(NULL," \t\n\r\f"); + + // adjust atom coord based on replica fraction + // for flag = 0, interpolate for intermediate and final replicas + // for flag = 1, replace existing coord with new coord + // ignore image flags of final x + // for interpolation: + // new x is displacement from old x via minimum image convention + // if final x is across periodic boundary: + // new x may be outside box + // will be remapped back into box when simulation starts + // its image flags will then be adjusted + + tag = ATOTAGINT(values[0]); + m = atom->map(tag); + if (m >= 0 && m < nlocal) { + ncount++; + xx = atof(values[1]); + yy = atof(values[2]); + zz = atof(values[3]); + + if (flag == 0) { + delx = xx - x[m][0]; + dely = yy - x[m][1]; + delz = zz - x[m][2]; + domain->minimum_image(delx,dely,delz); + x[m][0] += fraction*delx; + x[m][1] += fraction*dely; + x[m][2] += fraction*delz; + } else { + x[m][0] = xx; + x[m][1] = yy; + x[m][2] = zz; + } + } + + buf = next + 1; + } + + nread += nchunk; + } + + // check that all atom IDs in file were found by a proc + + if (flag == 0) { + int ntotal; + MPI_Allreduce(&ncount,&ntotal,1,MPI_INT,MPI_SUM,uworld); + if (ntotal != nreplica*nlines) + error->universe_all(FLERR,"Invalid atom IDs in neb file"); + } else { + int ntotal; + MPI_Allreduce(&ncount,&ntotal,1,MPI_INT,MPI_SUM,world); + if (ntotal != nlines) + error->all(FLERR,"Invalid atom IDs in neb file"); + } + + // clean up + + delete [] buffer; + delete [] values; + + if (flag == 0) { + if (me_universe == 0) { + if (compressed) pclose(fp); + else fclose(fp); + } + } else { + if (me == 0 && ireplica) { + if (compressed) pclose(fp); + else fclose(fp); + } + } +} + +/* ---------------------------------------------------------------------- + universe proc 0 opens NEB_spin data file + test if gzipped +------------------------------------------------------------------------- */ + +void NEB_spin::open(char *file) +{ + compressed = 0; + char *suffix = file + strlen(file) - 3; + if (suffix > file && strcmp(suffix,".gz") == 0) compressed = 1; + if (!compressed) fp = fopen(file,"r"); + else { +#ifdef LAMMPS_GZIP + char gunzip[128]; + snprintf(gunzip,128,"gzip -c -d %s",file); + +#ifdef _WIN32 + fp = _popen(gunzip,"rb"); +#else + fp = popen(gunzip,"r"); +#endif + +#else + error->one(FLERR,"Cannot open gzipped file"); +#endif + } + + if (fp == NULL) { + char str[128]; + snprintf(str,128,"Cannot open file %s",file); + error->one(FLERR,str); + } +} + +/* ---------------------------------------------------------------------- + query fix NEB_spin for info on each replica + universe proc 0 prints current NEB_spin status +------------------------------------------------------------------------- */ + +void NEB_spin::print_status() +{ + double fnorm2 = sqrt(update->minimize->fnorm_sqr()); + double fmaxreplica; + MPI_Allreduce(&fnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); + double fnorminf = update->minimize->fnorm_inf(); + double fmaxatom; + MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); + + if (verbose) { + freplica = new double[nreplica]; + MPI_Allgather(&fnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); + fmaxatomInRepl = new double[nreplica]; + MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); + } + + double one[7]; + //one[0] = fneb->veng; + //one[1] = fneb->plen; + //one[2] = fneb->nlen; + //one[3] = fneb->gradlen; + one[0] = fneb_neb->veng; + one[1] = fneb_neb->plen; + one[2] = fneb_neb->nlen; + one[3] = fneb_neb->gradlen; + + if (verbose) { + //one[4] = fneb->dotpath; + //one[5] = fneb->dottangrad; + //one[6] = fneb->dotgrad; + one[4] = fneb_spin->dotpath; + one[5] = fneb_spin->dottangrad; + one[6] = fneb_spin->dotgrad; + } + + if (output->thermo->normflag) one[0] /= atom->natoms; + if (me == 0) + MPI_Allgather(one,numall,MPI_DOUBLE,&all[0][0],numall,MPI_DOUBLE,roots); + MPI_Bcast(&all[0][0],numall*nreplica,MPI_DOUBLE,0,world); + + rdist[0] = 0.0; + for (int i = 1; i < nreplica; i++) + rdist[i] = rdist[i-1] + all[i][1]; + double endpt = rdist[nreplica-1] = rdist[nreplica-2] + all[nreplica-2][2]; + for (int i = 1; i < nreplica; i++) + rdist[i] /= endpt; + + // look up GradV for the initial, final, and climbing replicas + // these are identical to fnorm2, but to be safe we + // take them straight from fix_neb + + double gradvnorm0, gradvnorm1, gradvnormc; + + int irep; + irep = 0; + gradvnorm0 = all[irep][3]; + irep = nreplica-1; + gradvnorm1 = all[irep][3]; + irep = fneb->rclimber; + if (irep > -1) { + gradvnormc = all[irep][3]; + ebf = all[irep][0]-all[0][0]; + ebr = all[irep][0]-all[nreplica-1][0]; + } else { + double vmax = all[0][0]; + int top = 0; + for (int m = 1; m < nreplica; m++) + if (vmax < all[m][0]) { + vmax = all[m][0]; + top = m; + } + irep = top; + gradvnormc = all[irep][3]; + ebf = all[irep][0]-all[0][0]; + ebr = all[irep][0]-all[nreplica-1][0]; + } + + if (me_universe == 0) { + const double todeg=180.0/MY_PI; + FILE *uscreen = universe->uscreen; + FILE *ulogfile = universe->ulogfile; + if (uscreen) { + fprintf(uscreen,BIGINT_FORMAT " %12.8g %12.8g ", + update->ntimestep,fmaxreplica,fmaxatom); + fprintf(uscreen,"%12.8g %12.8g %12.8g ", + gradvnorm0,gradvnorm1,gradvnormc); + fprintf(uscreen,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); + for (int i = 0; i < nreplica; i++) + fprintf(uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); + if (verbose) { + fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + NAN,180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, + all[0][3],freplica[0],fmaxatomInRepl[0]); + for (int i = 1; i < nreplica-1; i++) + fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + 180-acos(all[i][4])*todeg,180-acos(all[i][5])*todeg, + 180-acos(all[i][6])*todeg,all[i][3],freplica[i], + fmaxatomInRepl[i]); + fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + NAN,180-acos(all[nreplica-1][5])*todeg,NAN,all[nreplica-1][3], + freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + } + fprintf(uscreen,"\n"); + } + + if (ulogfile) { + fprintf(ulogfile,BIGINT_FORMAT " %12.8g %12.8g ", + update->ntimestep,fmaxreplica,fmaxatom); + fprintf(ulogfile,"%12.8g %12.8g %12.8g ", + gradvnorm0,gradvnorm1,gradvnormc); + fprintf(ulogfile,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); + for (int i = 0; i < nreplica; i++) + fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); + if (verbose) { + fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + NAN,180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, + all[0][3],freplica[0],fmaxatomInRepl[0]); + for (int i = 1; i < nreplica-1; i++) + fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + 180-acos(all[i][4])*todeg,180-acos(all[i][5])*todeg, + 180-acos(all[i][6])*todeg,all[i][3],freplica[i], + fmaxatomInRepl[i]); + fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", + NAN,180-acos(all[nreplica-1][5])*todeg,NAN,all[nreplica-1][3], + freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + } + fprintf(ulogfile,"\n"); + fflush(ulogfile); + } + } +} diff --git a/src/REPLICA/neb_spin.h b/src/REPLICA/neb_spin.h new file mode 100644 index 0000000000..3fa19460fc --- /dev/null +++ b/src/REPLICA/neb_spin.h @@ -0,0 +1,137 @@ +/* -*- 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 COMMAND_CLASS + +CommandStyle(neb_spin,NEB_SPIN) + +#else + +#ifndef LMP_NEB_SPIN_H +#define LMP_NEB_SPIN_H + +#include +#include "pointers.h" + +namespace LAMMPS_NS { + +class NEB_spin : protected Pointers { + public: + NEB_spin(class LAMMPS *); + NEB_spin(class LAMMPS *, double, double, int, int, int, double *, double *); + ~NEB_spin(); + void command(int, char **); // process neb command + void run(); // run NEB_spin + + double ebf,ebr; // forward and reverse energy barriers + + private: + int me,me_universe; // my proc ID in world and universe + int ireplica,nreplica; + bool verbose; + MPI_Comm uworld; + MPI_Comm roots; // MPI comm with 1 root proc from each world + FILE *fp; + int compressed; + double etol; // energy tolerance convergence criterion + double ftol; // force tolerance convergence criterion + int n1steps, n2steps; // number of steps in stage 1 and 2 + int nevery; // output interval + char *infile; // name of file containing final state + + class FixNEB_spin *fneb; + int numall; // per-replica dimension of array all + double **all; // PE,plen,nlen,gradvnorm from each replica + double *rdist; // normalize reaction distance, 0 to 1 + double *freplica; // force on an image + double *fmaxatomInRepl; // force on an image + + void readfile(char *, int); + void open(char *); + void print_status(); +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: NEB_spin command before simulation box is defined + +Self-explanatory. + +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: Cannot use NEB_spin with a single replica + +Self-explanatory. + +E: Cannot use NEB_spin unless atom map exists + +Use the atom_modify command to create an atom map. + +E: NEB_spin requires use of fix neb + +Self-explanatory. + +E: NEB_spin requires damped dynamics minimizer + +Use a different minimization style. + +E: Too many timesteps for NEB_spin + +You must use a number of timesteps that fit in a 32-bit integer +for NEB_spin. + +E: Too many timesteps + +The cumulative timesteps must fit in a 64-bit integer. + +E: Unexpected end of neb file + +A read operation from the file failed. + +E: Incorrect atom format in neb file + +The number of fields per line is not what expected. + +E: Invalid atom IDs in neb file + +An ID in the file was not found in the system. + +E: Cannot open gzipped file + +LAMMPS was compiled without support for reading and writing gzipped +files through a pipeline to the gzip program with -DLAMMPS_GZIP. + +E: Cannot open file %s + +The specified file cannot be opened. Check that the path and name are +correct. If the file is a compressed file, also check that the gzip +executable can be found and run. + +U: Can only use NEB_spin with 1-processor replicas + +This is current restriction for NEB_spin as implemented in LAMMPS. + +U: Cannot use NEB_spin with atom_modify sort enabled + +This is current restriction for NEB_spin implemented in LAMMPS. + +*/ From e195d6faee7346034d234b620bae670c52a11425 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Wed, 30 Jan 2019 08:37:04 -0700 Subject: [PATCH 0094/1242] 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 682b456aae90f9e4a1867e460a7c71ea55de2491 Mon Sep 17 00:00:00 2001 From: casievers Date: Fri, 1 Feb 2019 16:18:17 -0800 Subject: [PATCH 0095/1242] Optimized (but not working) Dynamical Matrix command) --- src/USER-PHONON/Install.sh | 4 + src/USER-PHONON/dynamical_matrix.cpp | 489 +++++++++++++++++++++++++ src/USER-PHONON/dynamical_matrix.h | 72 ++++ src/USER-PHONON/third_order.cpp | 529 +++++++++++++++++++++++++++ src/USER-PHONON/third_order.h | 71 ++++ 5 files changed, 1165 insertions(+) create mode 100644 src/USER-PHONON/dynamical_matrix.cpp create mode 100644 src/USER-PHONON/dynamical_matrix.h create mode 100644 src/USER-PHONON/third_order.cpp create mode 100644 src/USER-PHONON/third_order.h diff --git a/src/USER-PHONON/Install.sh b/src/USER-PHONON/Install.sh index 3428415443..a73f529cfa 100755 --- a/src/USER-PHONON/Install.sh +++ b/src/USER-PHONON/Install.sh @@ -40,3 +40,7 @@ fi action fix_phonon.cpp fft3d_wrap.h action fix_phonon.h fft3d_wrap.h +action dynamical_matrix.cpp +action dynamical_matrix.h +action third_order.cpp +action third_order.h diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp new file mode 100644 index 0000000000..d1b53eee01 --- /dev/null +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -0,0 +1,489 @@ +// +// Created by charlie sievers on 6/21/18. +// + +#include +#include +#include "dynamical_matrix.h" +#include "atom.h" +#include "modify.h" +#include "domain.h" +#include "comm.h" +#include "group.h" +#include "force.h" +#include "math_extra.h" +#include "memory.h" +#include "bond.h" +#include "angle.h" +#include "dihedral.h" +#include "improper.h" +#include "kspace.h" +#include "update.h" +#include "neighbor.h" +#include "pair.h" +#include "timer.h" +#include "finish.h" + + +using namespace LAMMPS_NS; +enum{REGULAR,ESKM}; + +/* ---------------------------------------------------------------------- */ + +DynamicalMatrix::DynamicalMatrix(LAMMPS *lmp) : Pointers(lmp), fp(NULL) +{ + external_force_clear = 1; +} + +/* ---------------------------------------------------------------------- */ + +DynamicalMatrix::~DynamicalMatrix() +{ + if (fp && me == 0) fclose(fp); + memory->destroy(dynmat); + memory->destroy(final_dynmat); + fp = NULL; +} + +/* ---------------------------------------------------------------------- + setup without output or one-time post-init setup + flag = 0 = just force calculation + flag = 1 = reneighbor and force calculation +------------------------------------------------------------------------- */ + +void DynamicalMatrix::setup() +{ + // setup domain, communication and neighboring + // acquire ghosts + // build neighbor lists + if (triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + domain->reset_box(); + comm->setup(); + if (neighbor->style) neighbor->setup_bins(); + comm->exchange(); + comm->borders(); + if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + domain->image_check(); + domain->box_too_small_check(); + neighbor->build(1); + neighbor->ncalls = 0; + neighbor->every = 2; // build every this many steps + neighbor->delay = 1; + neighbor->ago = 0; + neighbor->ndanger = 0; + + // compute all forces + force_clear(); + external_force_clear = 0; + + eflag=0; + vflag=0; + if (pair_compute_flag) force->pair->compute(eflag,vflag); + else if (force->pair) force->pair->compute_dummy(eflag,vflag); + + if (atom->molecular) { + if (force->bond) force->bond->compute(eflag,vflag); + if (force->angle) force->angle->compute(eflag,vflag); + if (force->dihedral) force->dihedral->compute(eflag,vflag); + if (force->improper) force->improper->compute(eflag,vflag); + } + + if (force->kspace) { + force->kspace->setup(); + if (kspace_compute_flag) force->kspace->compute(eflag,vflag); + else force->kspace->compute_dummy(eflag,vflag); + } + + //modify->setup_pre_reverse(eflag,vflag); + if (force->newton) comm->reverse_comm(); +} + +/* ---------------------------------------------------------------------- */ + +void DynamicalMatrix::command(int narg, char **arg) +{ + MPI_Comm_rank(world,&me); + + if (domain->box_exist == 0) + error->all(FLERR,"Dynamical_matrix command before simulation box is defined"); + if (narg < 2) error->all(FLERR,"Illegal dynamical_matrix command"); + + lmp->init(); + + // orthogonal vs triclinic simulation box + + triclinic = domain->triclinic; + + if (force->pair && force->pair->compute_flag) pair_compute_flag = 1; + else pair_compute_flag = 0; + if (force->kspace && force->kspace->compute_flag) kspace_compute_flag = 1; + else kspace_compute_flag = 0; + + // group and style + + igroup = group->find(arg[0]); + if (igroup == -1) error->all(FLERR,"Could not find dynamical matrix group ID"); + groupbit = group->bitmask[igroup]; + dynlen = (group->count(igroup))*3; + memory->create(dynmat,int(dynlen),int(dynlen),"dynamic_matrix:dynmat"); + update->setupflag = 1; + + int style = -1; + if (strcmp(arg[1],"regular") == 0) style = REGULAR; + else if (strcmp(arg[1],"eskm") == 0) style = ESKM; + else error->all(FLERR,"Illegal Dynamical Matrix command"); + del = force->numeric(FLERR, arg[2]); + + // set option defaults + + binaryflag = 0; + scaleflag = 0; + compressed = 0; + file_flag = 0; + file_opened = 0; + conversion = 1; + + // read options from end of input line + if (style == REGULAR) options(narg-3,&arg[3]); //COME BACK + else if (style == ESKM) options(narg-3,&arg[3]); //COME BACK + else if (comm->me == 0 && screen) fprintf(screen,"Illegal Dynamical Matrix command\n"); + + // move atoms by 3-vector or specified variable(s) + + if (style == REGULAR) { + setup(); + calculateMatrix(); + if (me ==0) writeMatrix(); + } + + if (style == ESKM) { + setup(); + convert_units(update->unit_style); + conversion = conv_energy/conv_distance/conv_mass; + calculateMatrix(); + if (me ==0) writeMatrix(); + } + + Finish finish(lmp); + finish.end(1); +} + +/* ---------------------------------------------------------------------- + parse optional parameters +------------------------------------------------------------------------- */ + +void DynamicalMatrix::options(int narg, char **arg) +{ + if (narg < 0) error->all(FLERR,"Illegal dynamical_matrix command"); + int iarg = 0; + const char* filename = "dynmat.dyn"; + while (iarg < narg) { + if (strcmp(arg[iarg],"binary") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal dynamical_matrix command"); + if (strcmp(arg[iarg+1],"gzip") == 0) { + compressed = 1; + } + else if (strcmp(arg[iarg+1],"yes") == 0) { + binaryflag = 1; + } + iarg += 2; + } + else if (strcmp(arg[iarg],"file") == 0) { + if (iarg+2 > narg) error->all(FLERR, "Illegal dynamical_matrix command"); + filename = arg[iarg + 1]; + file_flag = 1; + iarg += 2; + } else error->all(FLERR,"Illegal dynamical_matrix command"); + } + if (file_flag == 1) { + openfile(filename); + } +} + +/* ---------------------------------------------------------------------- + generic opening of a file + ASCII or binary or gzipped + some derived classes override this function +------------------------------------------------------------------------- */ + +void DynamicalMatrix::openfile(const char* filename) +{ + // if file already opened, return + if (me!=0) return; + if (file_opened) return; + + if (compressed) { +#ifdef LAMMPS_GZIP + char gzip[128]; + sprintf(gzip,"gzip -6 > %s",filename); +#ifdef _WIN32 + fp = _popen(gzip,"wb"); +#else + fp = popen(gzip,"w"); +#endif +#else + error->one(FLERR,"Cannot open gzipped file"); +#endif + } else if (binaryflag) { + fp = fopen(filename,"wb"); + } else { + fp = fopen(filename,"w"); + } + + if (fp == NULL) error->one(FLERR,"Cannot open dump file"); + + file_opened = 1; +} + +/* ---------------------------------------------------------------------- + create dynamical matrix +------------------------------------------------------------------------- */ + +void DynamicalMatrix::calculateMatrix() +{ + int local_idx; // local index + int local_jdx; // second local index + int natoms = atom->natoms; + int *mask = atom->mask; + int *type = atom->type; + double imass; // dynamical matrix element + double *m = atom->mass; + double **f = atom->f; + + //initialize dynmat to all zeros + for (int i=0; i < dynlen; i++) + for (int j=0; j < dynlen; j++) + dynmat[i][j] = 0.; + + energy_force(0); + + if (comm->me == 0 && screen) fprintf(screen,"Calculating Dynamical Matrix...\n"); + + for (int i=1; i<=natoms; i++){ + local_idx = atom->map(i); + if (local_idx >= 0){ + for (int alpha=0; alpha<3; alpha++){ + displace_atom(local_idx, alpha, 1); + energy_force(0); + for (int j=1; j<=natoms; j++){ + local_jdx = atom->map(j); + if (local_jdx >= 0){ + for (int beta=0; beta<3; beta++){ + dynmat[(i-1)*3+alpha][(j-1)*3+beta] += -f[j-1][beta]; + } + } + } + displace_atom(local_idx,alpha,-2); + energy_force(0); + for (int j=1; j<=natoms; j++){ + local_jdx = atom->map(j); + if (local_jdx >= 0){ + for (int beta=0; beta<3; beta++){ + if (atom->rmass_flag == 1) + imass = sqrt(m[i] * m[j]); + else + imass = sqrt(m[type[i]] * m[type[j]]); + //dynmat has length dynlen + //dynlen = (group->count(igroup))*3; + //currently dynmat is being called to natoms*3 + //Also with this implementation + //I am not recovering the correct dynamical matrix + //if I have more than 1 core + dynmat[(i-1)*3+alpha][(j-1)*3+beta] -= -f[j-1][beta]; + dynmat[(i-1)*3+alpha][(j-1)*3+beta] /= (2 * del * imass); + dynmat[(i-1)*3+alpha][(j-1)*3+beta] *= conversion; + } + } + } + displace_atom(local_idx,alpha,1); + } + } + } + + + memory->create(final_dynmat,int(dynlen),int(dynlen),"dynamic_matrix_buffer:buf"); + for (int i = 0; i < dynlen; i++) + MPI_Reduce(dynmat[i], final_dynmat[i], int(dynlen), MPI_DOUBLE, MPI_SUM, 0, world); + + if (screen && me ==0 ) fprintf(screen,"Finished Calculating Dynamical Matrix\n"); +} + +/* ---------------------------------------------------------------------- + write dynamical matrix +------------------------------------------------------------------------- */ + +void DynamicalMatrix::writeMatrix() +{ + // print file comment lines + if (!binaryflag && fp) { + clearerr(fp); + for (int i = 0; i < dynlen; i++) { + for (int j = 0; j < dynlen; j++) { + if ((j+1)%3==0) fprintf(fp, "%4.8f\n", final_dynmat[j][i]); + else fprintf(fp, "%4.8f ",final_dynmat[j][i]); + } + } + } + if (ferror(fp)) + error->one(FLERR,"Error writing to file"); + + if (binaryflag && fp) { + clearerr(fp); + fwrite(&final_dynmat[0], sizeof(double), dynlen * dynlen, fp); + if (ferror(fp)) + error->one(FLERR, "Error writing to binary file"); + } +} + +/* ---------------------------------------------------------------------- + Displace atoms + ---------------------------------------------------------------------- */ + +void DynamicalMatrix::displace_atom(int local_idx, int direction, int magnitude) +{ + double **x = atom->x; + int *sametag = atom->sametag; + int j = local_idx; + + x[local_idx][direction] += del*magnitude; + + while (sametag[j] >= 0){ + j = sametag[j]; + x[j][direction] += del*magnitude; + } +} + + +/* ---------------------------------------------------------------------- + evaluate potential energy and forces + may migrate atoms due to reneighboring + return new energy, which should include nextra_global dof + return negative gradient stored in atom->f + return negative gradient for nextra_global dof in fextra +------------------------------------------------------------------------- */ + +void DynamicalMatrix::energy_force(int resetflag) +{ + // check for reneighboring + // always communicate since atoms move + int nflag = neighbor->check_distance(); + + if (nflag == 0) { + //if (comm->me == 0 && screen) fprintf(screen,"b\n"); + timer->stamp(); + comm->forward_comm(); + timer->stamp(Timer::COMM); + //if (comm->me == 0 && screen) fprintf(screen,"c\n"); + } else { + if (triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + if (domain->box_change) { + domain->reset_box(); + comm->setup(); + if (neighbor->style) neighbor->setup_bins(); + } + timer->stamp(); + comm->borders(); + if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + timer->stamp(Timer::COMM); + neighbor->build(1); + timer->stamp(Timer::NEIGH); + } + force_clear(); + + if (pair_compute_flag) { + force->pair->compute(eflag,vflag); + timer->stamp(Timer::PAIR); + } + if (atom->molecular) { + if (force->bond) force->bond->compute(eflag,vflag); + if (force->angle) force->angle->compute(eflag,vflag); + if (force->dihedral) force->dihedral->compute(eflag,vflag); + if (force->improper) force->improper->compute(eflag,vflag); + timer->stamp(Timer::BOND); + } + if (kspace_compute_flag) { + force->kspace->compute(eflag,vflag); + timer->stamp(Timer::KSPACE); + } + if (force->newton) { + comm->reverse_comm(); + timer->stamp(Timer::COMM); + } +} + +/* ---------------------------------------------------------------------- + clear force on own & ghost atoms + clear other arrays as needed +------------------------------------------------------------------------- */ + +void DynamicalMatrix::force_clear() +{ + if (external_force_clear) return; + + // clear global force array + // if either newton flag is set, also include ghosts + + size_t nbytes = sizeof(double) * atom->nlocal; + if (force->newton) nbytes += sizeof(double) * atom->nghost; + + if (nbytes) { + memset(&atom->f[0][0],0,3*nbytes); + } +} + +/* ---------------------------------------------------------------------- */ + +void DynamicalMatrix::convert_units(const char *style) +{ + // physical constants from: + // http://physics.nist.gov/cuu/Constants/Table/allascii.txt + // using thermochemical calorie = 4.184 J + + if (strcmp(style,"lj") == 0) { + error->all(FLERR,"Conversion Not Set"); + //conversion = 1; // lj -> 10 J/mol + + } else if (strcmp(style,"real") == 0) { + conv_energy = 418.4; // kcal/mol -> 10 J/mol + conv_mass = 1; // g/mol -> g/mol + conv_distance = 1; // angstrom -> angstrom + + } else if (strcmp(style,"metal") == 0) { + conv_energy = 9648.5; // eV -> 10 J/mol + conv_mass = 1; // g/mol -> g/mol + conv_distance = 1; // angstrom -> angstrom + + } else if (strcmp(style,"si") == 0) { + if (comm->me) error->warning(FLERR,"Conversion Warning: Multiplication by Large Float"); + conv_energy = 6.022E22; // J -> 10 J/mol + conv_mass = 6.022E26; // kg -> g/mol + conv_distance = 1E-10; // meter -> angstrom + + } else if (strcmp(style,"cgs") == 0) { + if (comm->me) error->warning(FLERR,"Conversion Warning: Multiplication by Large Float"); + conv_energy = 6.022E12; // Erg -> 10 J/mol + conv_mass = 6.022E23; // g -> g/mol + conv_distance = 1E-7; // centimeter -> angstrom + + } else if (strcmp(style,"electron") == 0) { + conv_energy = 262550; // Hartree -> 10 J/mol + conv_mass = 1; // amu -> g/mol + conv_distance = 0.529177249; // bohr -> angstrom + + } else if (strcmp(style,"micro") == 0) { + if (comm->me) error->warning(FLERR,"Conversion Warning: Untested Conversion"); + conv_energy = 6.022E10; // picogram-micrometer^2/microsecond^2 -> 10 J/mol + conv_mass = 6.022E11; // pg -> g/mol + conv_distance = 1E-4; // micrometer -> angstrom + + } else if (strcmp(style,"nano") == 0) { + if (comm->me) error->warning(FLERR,"Conversion Warning: Untested Conversion"); + conv_energy = 6.022E4; // attogram-nanometer^2/nanosecond^2 -> 10 J/mol + conv_mass = 6.022E5; // ag -> g/mol + conv_distance = 0.1; // angstrom -> angstrom + + } else error->all(FLERR,"Units Type Conversion Not Found"); + +} diff --git a/src/USER-PHONON/dynamical_matrix.h b/src/USER-PHONON/dynamical_matrix.h new file mode 100644 index 0000000000..237c3f7d27 --- /dev/null +++ b/src/USER-PHONON/dynamical_matrix.h @@ -0,0 +1,72 @@ +// +// Created by charlie sievers on 6/21/18. +// + +#ifdef COMMAND_CLASS + +CommandStyle(dynamical_matrix,DynamicalMatrix) + +#else + +#ifndef LMP_DYNAMICAL_MATRIX_H +#define LMP_DYNAMICAL_MATRIX_H + +#include "pointers.h" + +namespace LAMMPS_NS { + + class DynamicalMatrix : protected Pointers { + public: + DynamicalMatrix(class LAMMPS *); + virtual ~DynamicalMatrix(); + void command(int, char **); + void setup(); + + protected: + int eflag,vflag; // flags for energy/virial computation + int external_force_clear; // clear forces locally or externally + + + int triclinic; // 0 if domain is orthog, 1 if triclinic + int pairflag; + + int pair_compute_flag; // 0 if pair->compute is skipped + int kspace_compute_flag; // 0 if kspace->compute is skipped + + int nvec; // local atomic dof = length of xvec + + void energy_force(int); + void force_clear(); + virtual void openfile(const char* filename); + + private: + void options(int, char **); + void calculateMatrix(); + void writeMatrix(); + void convert_units(const char *style); + void displace_atom(int local_idx, int direction, int magnitude); + + double conversion; + double conv_energy; + double conv_distance; + double conv_mass; + double del; + int igroup,groupbit; + int scaleflag; + int me; + bigint dynlen; + double **dynmat; + double **final_dynmat; + + int compressed; // 1 if dump file is written compressed, 0 no + int binaryflag; // 1 if dump file is written binary, 0 no + int file_opened; // 1 if openfile method has been called, 0 no + int file_flag; // 1 custom file name, 0 dynmat.dat + + FILE *fp; + }; +} + + +#endif //LMP_DYNAMICAL_MATRIX_H +#endif \ No newline at end of file diff --git a/src/USER-PHONON/third_order.cpp b/src/USER-PHONON/third_order.cpp new file mode 100644 index 0000000000..6fb8589c3b --- /dev/null +++ b/src/USER-PHONON/third_order.cpp @@ -0,0 +1,529 @@ +// +// Created by charlie sievers on 7/5/18. +// + + +#include +#include +#include "third_order.h" +#include "atom.h" +#include "complex" +#include "domain.h" +#include "comm.h" +#include "group.h" +#include "force.h" +#include "math_extra.h" +#include "bond.h" +#include "angle.h" +#include "dihedral.h" +#include "improper.h" +#include "kspace.h" +#include "update.h" +#include "neighbor.h" +#include "pair.h" +#include "timer.h" +#include "finish.h" + + +using namespace LAMMPS_NS; +enum{REGULAR,BALLISTICO}; + +/* ---------------------------------------------------------------------- */ + +ThirdOrder::ThirdOrder(LAMMPS *lmp) : Pointers(lmp), fp(NULL) +{ + external_force_clear = 1; +} + +/* ---------------------------------------------------------------------- */ + +ThirdOrder::~ThirdOrder() +{ + if (fp) fclose(fp); + fp = NULL; +} + +/* ---------------------------------------------------------------------- + setup without output or one-time post-init setup + flag = 0 = just force calculation + flag = 1 = reneighbor and force calculation +------------------------------------------------------------------------- */ + +void ThirdOrder::setup() +{ + // setup domain, communication and neighboring + // acquire ghosts + // build neighbor lists + if (triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + domain->reset_box(); + comm->setup(); + if (neighbor->style) neighbor->setup_bins(); + comm->exchange(); + comm->borders(); + if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + domain->image_check(); + domain->box_too_small_check(); + neighbor->build(1); + neighbor->ncalls = 0; + neighbor->every = 3; // build every this many steps + neighbor->delay = 1; + neighbor->ago = 0; + neighbor->ndanger = 0; + + // compute all forces + force_clear(); + external_force_clear = 0; + + eflag=0; + vflag=0; + if (pair_compute_flag) force->pair->compute(eflag,vflag); + else if (force->pair) force->pair->compute_dummy(eflag,vflag); + + if (atom->molecular) { + if (force->bond) force->bond->compute(eflag,vflag); + if (force->angle) force->angle->compute(eflag,vflag); + if (force->dihedral) force->dihedral->compute(eflag,vflag); + if (force->improper) force->improper->compute(eflag,vflag); + } + + if (force->kspace) { + force->kspace->setup(); + if (kspace_compute_flag) force->kspace->compute(eflag,vflag); + else force->kspace->compute_dummy(eflag,vflag); + } + + if (force->newton) comm->reverse_comm(); +} + +/* ---------------------------------------------------------------------- */ + +void ThirdOrder::command(int narg, char **arg) +{ + MPI_Comm_rank(world,&me); + + if (domain->box_exist == 0) + error->all(FLERR,"Dynamical_matrix command before simulation box is defined"); + if (narg < 2) error->all(FLERR,"Illegal dynamical_matrix command"); + + lmp->init(); + + // orthogonal vs triclinic simulation box + + triclinic = domain->triclinic; + + if (force->pair && force->pair->compute_flag) pair_compute_flag = 1; + else pair_compute_flag = 0; + if (force->kspace && force->kspace->compute_flag) kspace_compute_flag = 1; + else kspace_compute_flag = 0; + + // group and style + + igroup = group->find(arg[0]); + if (igroup == -1) error->all(FLERR,"Could not find dynamical matrix group ID"); + groupbit = group->bitmask[igroup]; + update->setupflag = 1; + + int style = -1; + if (strcmp(arg[1],"regular") == 0) style = REGULAR; + else if (strcmp(arg[1],"ballistico") == 0) style = BALLISTICO; + else error->all(FLERR,"Illegal Dynamical Matrix command"); + + // set option defaults + + binaryflag = 0; + scaleflag = 0; + compressed = 0; + file_flag = 0; + file_opened = 0; + conversion = 1; + + // read options from end of input line + if (style == REGULAR) options(narg-3,&arg[3]); //COME BACK + else if (style == BALLISTICO) options(narg-3,&arg[3]); //COME BACK + else if (comm->me == 0 && screen) fprintf(screen,"Illegal Dynamical Matrix command\n"); + del = force->numeric(FLERR, arg[2]); + + // move atoms by 3-vector or specified variable(s) + + if (style == REGULAR) { + setup(); + calculateMatrix(); + } + + if (style == BALLISTICO) { + setup(); + convert_units(update->unit_style); + conversion = conv_energy/conv_distance/conv_distance; + calculateMatrix(); + } + + Finish finish(lmp); + finish.end(1); +} + +/* ---------------------------------------------------------------------- + parse optional parameters +------------------------------------------------------------------------- */ + +void ThirdOrder::options(int narg, char **arg) +{ + if (narg < 0) error->all(FLERR,"Illegal dynamical_matrix command"); + int iarg = 0; + const char *filename = "third_order.txt"; + std::stringstream fss; + + while (iarg < narg) { + if (strcmp(arg[iarg],"file") == 0) { + if (iarg+2 > narg) error->all(FLERR, "Illegal dynamical_matrix command"); + fss << arg[iarg + 1] << me; + filename = fss.str().c_str(); + file_flag = 1; + iarg += 2; + } + else if (strcmp(arg[iarg],"binary") == 0) { + if (iarg + 2 > narg) error->all(FLERR, "Illegal dynamical_matrix command"); + if (strcmp(arg[iarg+1],"gzip") == 0) { + compressed = 1; + } + else if (strcmp(arg[iarg+1],"yes") == 0) { + binaryflag = 1; + } + iarg += 2; + } else error->all(FLERR,"Illegal dynamical_matrix command"); + } + if (file_flag == 1) { + openfile(filename); + } +} + +/* ---------------------------------------------------------------------- + generic opening of a file + ASCII or binary or gzipped + some derived classes override this function +------------------------------------------------------------------------- */ + +void ThirdOrder::openfile(const char* filename) +{ + // if file already opened, return + if (file_opened) return; + + if (compressed) { +#ifdef LAMMPS_GZIP + char gzip[128]; + sprintf(gzip,"gzip -6 > %s",filename); +#ifdef _WIN32 + fp = _popen(gzip,"wb"); +#else + fp = popen(gzip,"w"); +#endif +#else + error->one(FLERR,"Cannot open gzipped file"); +#endif + } else if (binaryflag) { + fp = fopen(filename,"wb"); + } else { + fp = fopen(filename,"w"); + } + + if (fp == NULL) error->one(FLERR,"Cannot open dump file"); + + file_opened = 1; +} + +/* ---------------------------------------------------------------------- + create dynamical matrix +------------------------------------------------------------------------- */ + +void ThirdOrder::calculateMatrix() +{ + int local_idx; // local index + int local_jdx; // second local index + int local_kdx; // third local index + int natoms = atom->natoms; + int *mask = atom->mask; + double **f = atom->f; + + energy_force(0); + + if (comm->me == 0 && screen) fprintf(screen,"Calculating Anharmonic Dynamical Matrix...\n"); + + for (int i=1; i<=natoms; i++){ + local_idx = atom->map(i); + if (local_idx >= 0 && mask[local_idx] && groupbit){ + for (int alpha=0; alpha<3; alpha++){ + displace_atom(local_idx, alpha, 1); + for (int j=1; j<=natoms; j++){ + local_jdx = atom->map(j); + if (local_jdx >= 0&& mask[local_jdx] && groupbit){ + for (int beta=0; beta<3; beta++){ + } + } + } + displace_atom(local_idx,alpha,-2); + for (int j=1; j<=natoms; j++){ + local_jdx = atom->map(j); + if (local_jdx >= 0 && mask[local_jdx] && groupbit){ + for (int beta=0; beta<3; beta++){ + + } + } + } + displace_atom(local_idx,alpha,1); + } + } + } + + //for (int proc1=0; proc1 < comm->nprocs; proc1++) { + // plocal1 = atom->nlocal; // 1 proc nlocal = 8 + // MPI_Bcast(&plocal1, 1, MPI_INT, proc1, MPI_COMM_WORLD); // plocal1 = 8 + // for (int i = 0; i < plocal1; i++) { + // if (me==proc1 & mask[i] & groupbit) + // group_flag_1 = 1; + // MPI_Bcast(&group_flag_1, 1, MPI_INT, proc1, MPI_COMM_WORLD); + // if (group_flag_1) { + // if (me == proc1) id1 = aid[i]; + // MPI_Bcast(&id1, 1, MPI_INT, proc1, MPI_COMM_WORLD); + // for (int alpha = 0; alpha < 3; alpha++) { + // for (int proc2 = 0; proc2 < comm->nprocs; proc2++) { + // plocal2 = atom->nlocal; + // MPI_Bcast(&plocal2, 1, MPI_INT, proc2, MPI_COMM_WORLD); + // for (int j = 0; j < plocal2; j++) { + // if (me==proc2 & mask[j] & groupbit) + // group_flag_2 = 1; + // MPI_Bcast(&group_flag_2, 1, MPI_INT, proc2, MPI_COMM_WORLD); + // if (mask[j] & groupbit) { + // if (me == proc2) id2 = aid[j]; + // MPI_Bcast(&id2, 1, MPI_INT, proc2, MPI_COMM_WORLD); + // for (int beta = 0; beta < 3; beta++) { +// + // if (me == proc1) x[i][alpha] += del; +// + // if (me == proc2) x[j][beta] += del; + // energy_force(0); +//// + // for (int gamma = 0; gamma < 3; gamma++) { + // for (int k = 0; k < nlocal; k++) + // if (mask[k] & groupbit) { + // first_derv[k*3+gamma] = f[k][gamma]; + // } + // } +// + // if (me == proc2) x[j][beta] -= 2 * del; + // energy_force(0); +//// + // for (int gamma = 0; gamma < 3; gamma++) { + // for (int k = 0; k < nlocal; k++) + // if (mask[k] & groupbit) { + // first_derv[k*3+gamma] -= f[k][gamma]; + // } + // } +// + // if (me == proc2) x[j][beta] += 2 * del; +// + // if (me == proc1) x[i][alpha] -= 2 * del; +// + // energy_force(0); +//// + // for (int gamma = 0; gamma < 3; gamma++) { + // for (int k = 0; k < nlocal; k++) + // if (mask[k] & groupbit) { + // first_derv[k*3+gamma] -= f[k][gamma]; + // } + // } +//// + // if (me == proc2) x[j][beta] -= 2 * del; + // energy_force(0); +//// + // for (int k = 0; k < nlocal; k++) + // if (mask[k] & groupbit) { + // for (int gamma = 0; gamma < 3; gamma++) { + // first_derv[k*3+gamma] += f[k][gamma]; + // first_derv[k*3+gamma] /= -4*del*del; + // } + // double norm = pow(first_derv[k*3], 2) + // + pow(first_derv[k*3+1], 2) + // + pow(first_derv[k+3+2], 2); + // if (fp && norm > 1.0e-16) + // fprintf(fp, + // "%d %d %d %d %d %7.8f %7.8f %7.8f\n", + // id1, alpha + 1, id2, beta + 1, aid[k], + // first_derv[k*3] * conversion, + // first_derv[k*3+1] * conversion, + // first_derv[k*3+2] * conversion); + // } +//// + // if (me == proc2) x[j][beta] += del; +// + // if (me == proc1) x[i][alpha] += del; + // } + // } + // } + // } +//// + // } + // } + // } + //} +// + + if (screen && me ==0 ) fprintf(screen,"Finished Calculating Third Order Tensor\n"); + +} + +/* ---------------------------------------------------------------------- + Displace atoms + ---------------------------------------------------------------------- */ + +void ThirdOrder::displace_atom(int local_idx, int direction, int magnitude) +{ + double **x = atom->x; + int *sametag = atom->sametag; + int j = local_idx; + + x[local_idx][direction] += del*magnitude; + + while (sametag[j] >= 0){ + j = sametag[j]; + x[j][direction] += del*magnitude; + } +} + +/* ---------------------------------------------------------------------- + evaluate potential energy and forces + may migrate atoms due to reneighboring + return new energy, which should include nextra_global dof + return negative gradient stored in atom->f + return negative gradient for nextra_global dof in fextra +------------------------------------------------------------------------- */ + +void ThirdOrder::energy_force(int resetflag) +{ + // check for reneighboring + // always communicate since atoms move + int nflag = neighbor->decide(); + + if (nflag == 0) { + timer->stamp(); + comm->forward_comm(); + timer->stamp(Timer::COMM); + } else { + if (triclinic) domain->x2lamda(atom->nlocal); + domain->pbc(); + if (domain->box_change) { + domain->reset_box(); + comm->setup(); + if (neighbor->style) neighbor->setup_bins(); + } + timer->stamp(); + + comm->borders(); + if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + timer->stamp(Timer::COMM); + + neighbor->build(1); + timer->stamp(Timer::NEIGH); + } + + force_clear(); + + timer->stamp(); + + if (pair_compute_flag) { + force->pair->compute(eflag,vflag); + timer->stamp(Timer::PAIR); + } + + if (atom->molecular) { + if (force->bond) force->bond->compute(eflag,vflag); + if (force->angle) force->angle->compute(eflag,vflag); + if (force->dihedral) force->dihedral->compute(eflag,vflag); + if (force->improper) force->improper->compute(eflag,vflag); + timer->stamp(Timer::BOND); + } + + if (kspace_compute_flag) { + force->kspace->compute(eflag,vflag); + timer->stamp(Timer::KSPACE); + } + + if (force->newton) { + comm->reverse_comm(); + timer->stamp(Timer::COMM); + } +} + +/* ---------------------------------------------------------------------- + clear force on own & ghost atoms + clear other arrays as needed +------------------------------------------------------------------------- */ + +void ThirdOrder::force_clear() +{ + if (external_force_clear) return; + + // clear global force array + // if either newton flag is set, also include ghosts + + size_t nbytes = sizeof(double) * atom->nlocal; + if (force->newton) nbytes += sizeof(double) * atom->nghost; + + if (nbytes) { + memset(&atom->f[0][0],0,3*nbytes); + } +} + +/* ---------------------------------------------------------------------- */ + +void ThirdOrder::convert_units(const char *style) +{ + // physical constants from: + // http://physics.nist.gov/cuu/Constants/Table/allascii.txt + // using thermochemical calorie = 4.184 J + + if (strcmp(style,"lj") == 0) { + error->all(FLERR,"Conversion Not Set"); + //conversion = 1; // lj -> 10 J/mol + + } else if (strcmp(style,"real") == 0) { + conv_energy = 418.4; // kcal/mol -> 10 J/mol + conv_mass = 1; // g/mol -> g/mol + conv_distance = 1; // angstrom -> angstrom + + } else if (strcmp(style,"metal") == 0) { + conv_energy = 9648.5; // eV -> 10 J/mol + conv_mass = 1; // g/mol -> g/mol + conv_distance = 1; // angstrom -> angstrom + + } else if (strcmp(style,"si") == 0) { + if (comm->me) error->warning(FLERR,"Conversion Warning: Multiplication by Large Float"); + conv_energy = 6.022E22; // J -> 10 J/mol + conv_mass = 6.022E26; // kg -> g/mol + conv_distance = 1E-10; // meter -> angstrom + + } else if (strcmp(style,"cgs") == 0) { + if (comm->me) error->warning(FLERR,"Conversion Warning: Multiplication by Large Float"); + conv_energy = 6.022E12; // Erg -> 10 J/mol + conv_mass = 6.022E23; // g -> g/mol + conv_distance = 1E-7; // centimeter -> angstrom + + } else if (strcmp(style,"electron") == 0) { + conv_energy = 262550; // Hartree -> 10 J/mol + conv_mass = 1; // amu -> g/mol + conv_distance = 0.529177249; // bohr -> angstrom + + } else if (strcmp(style,"micro") == 0) { + if (comm->me) error->warning(FLERR,"Conversion Warning: Untested Conversion"); + conv_energy = 6.022E10; // picogram-micrometer^2/microsecond^2 -> 10 J/mol + conv_mass = 6.022E11; // pg -> g/mol + conv_distance = 1E-4; // micrometer -> angstrom + + } else if (strcmp(style,"nano") == 0) { + if (comm->me) error->warning(FLERR,"Conversion Warning: Untested Conversion"); + conv_energy = 6.022E4; // attogram-nanometer^2/nanosecond^2 -> 10 J/mol + conv_mass = 6.022E5; // ag -> g/mol + conv_distance = 0.1; // angstrom -> angstrom + + } else error->all(FLERR,"Units Type Conversion Not Found"); + +} diff --git a/src/USER-PHONON/third_order.h b/src/USER-PHONON/third_order.h new file mode 100644 index 0000000000..0bbdc21939 --- /dev/null +++ b/src/USER-PHONON/third_order.h @@ -0,0 +1,71 @@ +// +// Created by charlie sievers on 7/5/18. +// + + +#ifdef COMMAND_CLASS + +CommandStyle(third_order,ThirdOrder) + +#else + +#ifndef LMP_THIRD_ORDER_H +#define LMP_THIRD_ORDER_H + +#include "pointers.h" + +namespace LAMMPS_NS { + + class ThirdOrder : protected Pointers { + public: + ThirdOrder(class LAMMPS *); + virtual ~ThirdOrder(); + void command(int, char **); + void setup(); + + protected: + int eflag,vflag; // flags for energy/virial computation + int external_force_clear; // clear forces locally or externally + + + int triclinic; // 0 if domain is orthog, 1 if triclinic + int pairflag; + + int pair_compute_flag; // 0 if pair->compute is skipped + int kspace_compute_flag; // 0 if kspace->compute is skipped + + int nvec; // local atomic dof = length of xvec + + void energy_force(int); + void force_clear(); + virtual void openfile(const char* filename); + + + private: + void options(int, char **); + void calculateMatrix(); + void convert_units(const char *style); + void displace_atom(int local_idx, int direction, int magnitude); + + double conversion; + double conv_energy; + double conv_distance; + double conv_mass; + double del; + int igroup,groupbit; + int scaleflag; + int me; + + int compressed; // 1 if dump file is written compressed, 0 no + int binaryflag; // 1 if dump file is written binary, 0 no + int file_opened; // 1 if openfile method has been called, 0 no + int file_flag; // 1 custom file name, 0 dynmat.dat + + FILE *fp; + }; +} + + +#endif //LMP_THIRD_ORDER_H +#endif + From adebe90315bfdf6190848b0cba3d55365e3f90a4 Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Fri, 1 Feb 2019 21:55:29 -0800 Subject: [PATCH 0096/1242] Optimized Dynamical Matrix --- .../phonon/dynamical_matrix_command/Manual.md | 48 + .../phonon/dynamical_matrix_command/README.md | 21 + .../dynamical_matrix_command/Si.opt.tersoff | 66 + .../dynamical_matrix_command/ff-silicon.lmp | 19 + .../dynamical_matrix_command/in.silicon | 89 + .../lmp_bank/amorphous_silicon.lmp | 534 ++ .../lmp_bank/silicon_216.lmp | 238 + .../lmp_bank/silicon_512.lmp | 534 ++ .../lmp_bank/silicon_8.lmp | 29 + .../results/dynmat.dat | 192 + .../results/out.silicon | 58 + .../silicon_input_file.lmp | 29 + .../USER/phonon/third_order_command/Manual.md | 48 + .../USER/phonon/third_order_command/README.md | 25 + .../phonon/third_order_command/Si.opt.tersoff | 66 + .../phonon/third_order_command/combine.sh | 17 + .../phonon/third_order_command/ff-silicon.lmp | 19 + .../phonon/third_order_command/in.silicon | 84 + .../lmp_bank/silicon_216.lmp | 238 + .../lmp_bank/silicon_512.lmp | 534 ++ .../lmp_bank/silicon_8.lmp | 29 + .../third_order_command/results/out.silicon | 58 + .../third_order_command/results/third_order | 4608 +++++++++++++++++ .../silicon_input_file.lmp | 29 + src/USER-PHONON/dynamical_matrix.cpp | 58 +- 25 files changed, 7642 insertions(+), 28 deletions(-) create mode 100755 examples/USER/phonon/dynamical_matrix_command/Manual.md create mode 100755 examples/USER/phonon/dynamical_matrix_command/README.md create mode 100755 examples/USER/phonon/dynamical_matrix_command/Si.opt.tersoff create mode 100755 examples/USER/phonon/dynamical_matrix_command/ff-silicon.lmp create mode 100755 examples/USER/phonon/dynamical_matrix_command/in.silicon create mode 100755 examples/USER/phonon/dynamical_matrix_command/lmp_bank/amorphous_silicon.lmp create mode 100755 examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_216.lmp create mode 100755 examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_512.lmp create mode 100755 examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_8.lmp create mode 100755 examples/USER/phonon/dynamical_matrix_command/results/dynmat.dat create mode 100755 examples/USER/phonon/dynamical_matrix_command/results/out.silicon create mode 100755 examples/USER/phonon/dynamical_matrix_command/silicon_input_file.lmp create mode 100755 examples/USER/phonon/third_order_command/Manual.md create mode 100755 examples/USER/phonon/third_order_command/README.md create mode 100755 examples/USER/phonon/third_order_command/Si.opt.tersoff create mode 100755 examples/USER/phonon/third_order_command/combine.sh create mode 100755 examples/USER/phonon/third_order_command/ff-silicon.lmp create mode 100755 examples/USER/phonon/third_order_command/in.silicon create mode 100755 examples/USER/phonon/third_order_command/lmp_bank/silicon_216.lmp create mode 100755 examples/USER/phonon/third_order_command/lmp_bank/silicon_512.lmp create mode 100755 examples/USER/phonon/third_order_command/lmp_bank/silicon_8.lmp create mode 100755 examples/USER/phonon/third_order_command/results/out.silicon create mode 100755 examples/USER/phonon/third_order_command/results/third_order create mode 100755 examples/USER/phonon/third_order_command/silicon_input_file.lmp diff --git a/examples/USER/phonon/dynamical_matrix_command/Manual.md b/examples/USER/phonon/dynamical_matrix_command/Manual.md new file mode 100755 index 0000000000..c361f80325 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/Manual.md @@ -0,0 +1,48 @@ +# dynamical_matrix command + +## Syntax + +``` +dynamical_matrix group-ID style args keyword value ... +``` + +* group-ID = ID of group of atoms to displace +* style = *regular* or *eskm* +``` +*regular* args = gamma + gamma = finite difference displacement length +*eskm* args = gamma + gamma = finite difference displacement length +``` +* zero or more keyword/value pairs may be appended +* keyword = *file* or *binary* +``` +*file* value = output_file + output_file = name of file to dump the dynamical matrix into +*binary* values = *yes* or *no* or *gzip* +``` + +## Examples + +``` +dynamical_matrix 1 regular 0.000001 +dynamical_matrix 1 eskm 0.000001 +dynamical_matrix 3 regular 0.00004 file dynmat.dat +dynamical_matrix 5 eskm 0.00000001 file dynamical.dat binary yes +``` + +## Description + +Calculate the dynamical matrix of the selected group. + +## Restrictions + +None + +## Related commands + +None + +## Default + +The option defaults are file = "dynmat.dyn", binary = no diff --git a/examples/USER/phonon/dynamical_matrix_command/README.md b/examples/USER/phonon/dynamical_matrix_command/README.md new file mode 100755 index 0000000000..8981c1e63a --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/README.md @@ -0,0 +1,21 @@ +# LAMMPS LATTICE DYNAMICS COMMANDS + +## DYNAMICAL MATRIX CALCULATOR + +This directory contains the ingredients to calculate a dynamical matrix. + +Example: +``` +NP=4 #number of processors +mpirun -np $NP lmp_mpi < in.silicon > out.silicon +``` + +To test out a different silicon example: +``` +LMP_FILE=amorphous_silicon.lmp +cp lmp_bank/$LMP_FILE ./silicon_input_file.lmp +NP=4 #number of processors +mpirun -np $NP lmp_mpi < in.silicon > out.silicon +``` + +## Requires: MANYBODY and MOLECULE packages diff --git a/examples/USER/phonon/dynamical_matrix_command/Si.opt.tersoff b/examples/USER/phonon/dynamical_matrix_command/Si.opt.tersoff new file mode 100755 index 0000000000..3bc19f0581 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/Si.opt.tersoff @@ -0,0 +1,66 @@ +# Tersoff parameters for various elements and mixtures +# multiple entries can be added to this file, LAMMPS reads the ones it needs +# these entries are in LAMMPS "metal" units: +# A,B = eV; lambda1,lambda2,lambda3 = 1/Angstroms; R,D = Angstroms +# other quantities are unitless + +# Aidan Thompson (athomps at sandia.gov) takes full blame for this +# file. It specifies various potentials published by J. Tersoff for +# silicon, carbon and germanium. Since Tersoff published several +# different silicon potentials, I refer to them using atom types +# Si(B), Si(C) and Si(D). The last two are almost almost identical but +# refer to two different publications. These names should be used in +# the LAMMPS command when the file is invoked. For example: +# pair_coeff * * SiCGe.tersoff Si(B). The Si(D), C and Ge potentials +# can be used pure silicon, pure carbon, pure germanium, binary SiC, +# and binary SiGe, but not binary GeC or ternary SiGeC. LAMMPS will +# generate an error if this file is used with any combination +# involving C and Ge, since there are no entries for the GeC +# interactions (Tersoff did not publish parameters for this +# cross-interaction.) + +# format of a single entry (one or more lines): +# element 1, element 2, element 3, +# m, gamma, lambda3, c, d, costheta0, n, beta, lambda2, B, R, D, lambda1, A + +# The original Tersoff potential for Silicon, Si(B) +# J. Tersoff, PRB, 37, 6991 (1988) + +Si(B) Si(B) Si(B) 3.0 1.0 1.3258 4.8381 2.0417 0.0000 22.956 + 0.33675 1.3258 95.373 3.0 0.2 3.2394 3264.7 + +# The later Tersoff potential for Silicon, Si(C) +# J. Tersoff, PRB, 38, 9902 (1988) + +Si(C) Si(C) Si(C) 3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 + 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8 + +# The later Tersoff potential for Carbon, Silicon, and Germanium +# J. Tersoff, PRB, 39, 5566 (1989) + errata (PRB 41, 3248) +# The Si and C parameters are very close to those in SiC.tersoff + +C C C 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 1.5724e-7 2.2119 346.74 1.95 0.15 3.4879 1393.6 +Si(D) Si(D) Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8 +Ge Ge Ge 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 9.0166e-7 1.7047 419.23 2.95 0.15 2.4451 1769.0 + +C Si(D) Si(D) 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 1.5724e-7 1.97205 395.1451 2.3573 0.1527 2.9839 1597.3111 +C Si(D) C 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 0.0 0.0 0.0 1.95 0.15 0.0 0.0 +C C Si(D) 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 0.0 0.0 0.0 2.3573 0.1527 0.0 0.0 + +Si(D) C C 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.97205 395.1451 2.3573 0.1527 2.9839 1597.3111 +Si(D) Si(D) C 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.3573 0.1527 0.0 0.0 +Si(D) C Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.85 0.15 0.0 0.0 + +Si(D) Ge Ge 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.71845 444.7177 2.8996 0.1500 2.4625 1799.6347 +Si(D) Si(D) Ge 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.8996 0.1500 0.0 0.0 +Si(D) Ge Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.85 0.15 0.0 0.0 + +Ge Si(D) Si(D) 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 9.0166e-7 1.71845 444.7177 2.8996 0.1500 2.4625 1799.6347 +Ge Si(D) Ge 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 0.0 0.0 0.0 2.95 0.15 0.0 0.0 +Ge Ge Si(D) 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 0.0 0.0 0.0 2.8996 0.1500 0.0 0.0 + +# Optimized Tersoff for Carbon: Lindsay and Broido PRB 81, 205441 (2010) +# element 1, element 2, element 3, +# m, gamma, lambda3, c, d, costheta0, n, beta, lambda2, B, R, D, lambda1, A +C(O) C(O) C(O) 3.0 1.0 0.0 3.8049e4 4.3484 -0.930 0.72751 1.5724e-7 2.2119 430.0 1.95 0.15 3.4879 1393.6 + diff --git a/examples/USER/phonon/dynamical_matrix_command/ff-silicon.lmp b/examples/USER/phonon/dynamical_matrix_command/ff-silicon.lmp new file mode 100755 index 0000000000..f3b895f168 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/ff-silicon.lmp @@ -0,0 +1,19 @@ +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Si equal 1 + +############# +#Atom Masses# +############# + +mass ${Si} 28.08550 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style tersoff +pair_coeff * * Si.opt.tersoff Si(D) diff --git a/examples/USER/phonon/dynamical_matrix_command/in.silicon b/examples/USER/phonon/dynamical_matrix_command/in.silicon new file mode 100755 index 0000000000..cda0ee8c58 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/in.silicon @@ -0,0 +1,89 @@ +###############################mm +# Atom style - charge/vdw/bonded# +################################# +atom_style full + +############################################## +#Units Metal : eV - ps - angstrom - bar# +# Real : kcal/mol - fs - angstrom - atm# +############################################## +units metal + +############ +#Run number# +############ +variable run_no equal 0 # is it a restart? +variable res_no equal ${run_no}-1 # restart file number + +####################################### +#Random Seeds and Domain Decomposition# +####################################### +variable iseed0 equal 2357 +variable iseed1 equal 26488 +variable iseed2 equal 10669 +processors * * * + +########### +#Data File# +########### +variable inpfile string silicon_input_file.lmp +variable resfile string final_restart.${res_no} +variable ff_file string ff-silicon.lmp + +########## +#Run Type# +########## +variable minimise equal 0 #Energy Minimization + +############################### +#Molecular Dynamics Parameters# +############################### +neighbor 1 bin + +################################ +#Energy Minimization Parameters# +################################ +variable mtraj equal 1 # trajectory output frequency - all system +variable etol equal 1e-5 # % change in energy +variable ftol equal 1e-5 # max force threshold (force units) +variable maxiter equal 10000 # max # of iterations + +######################## +#3D Periodic Simulation# +######################## +boundary p p p + +############################# +#Reading the input structure# +############################# +if "${run_no} == 0" then "read_data ${inpfile}" else "read_restart ${resfile}" + +############# +#Force Field# +############# +include ${ff_file} + +###################### +#Thermodynamic Output# +###################### +variable str_basic string 'step time pe temp press' + +##################### +#Energy Minimization# +##################### +if "${minimise} <= 0 || ${run_no} > 0" then "jump SELF end_minimise" + print "Doing CG minimisation" + dump mdcd all dcd ${mtraj} min.dcd + dump_modify mdcd unwrap yes + min_style cg + min_modify line quadratic + minimize ${etol} ${ftol} ${maxiter} ${maxiter} + reset_timestep 0 + undump mdcd +label end_minimise + +################## +#Dynamical Matrix# +################## +dynamical_matrix all eskm 0.000001 file dynmat.dat binary no + diff --git a/examples/USER/phonon/dynamical_matrix_command/lmp_bank/amorphous_silicon.lmp b/examples/USER/phonon/dynamical_matrix_command/lmp_bank/amorphous_silicon.lmp new file mode 100755 index 0000000000..036ece0279 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/lmp_bank/amorphous_silicon.lmp @@ -0,0 +1,534 @@ +LAMMPS description + + 512 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 21.848000 xlo xhi + 0.0000000 21.848000 ylo yhi + 0.0000000 21.848000 zlo zhi + + Atoms + + 1 1 1 0.0000000 6.2030000 5.5980000 12.9980000 + 2 2 1 0.0000000 21.3100000 5.6310000 21.1380000 + 3 3 1 0.0000000 19.5320000 6.1170000 3.6940000 + 4 4 1 0.0000000 4.3700000 14.0260000 0.0900000 + 5 5 1 0.0000000 10.1930000 7.4590000 2.3530000 + 6 6 1 0.0000000 17.5070000 14.1860000 3.6790000 + 7 7 1 0.0000000 11.2050000 15.9160000 15.0480000 + 8 8 1 0.0000000 8.6050000 19.8970000 21.0040000 + 9 9 1 0.0000000 15.0360000 17.5650000 1.3640000 + 10 10 1 0.0000000 12.0450000 3.3600000 7.2720000 + 11 11 1 0.0000000 7.1330000 17.4130000 18.0480000 + 12 12 1 0.0000000 8.7340000 6.3830000 3.8480000 + 13 13 1 0.0000000 13.0940000 3.2490000 3.5840000 + 14 14 1 0.0000000 11.3200000 7.2770000 20.4120000 + 15 15 1 0.0000000 19.7770000 8.9110000 0.3000000 + 16 16 1 0.0000000 11.9710000 20.8500000 1.5140000 + 17 17 1 0.0000000 10.4480000 10.3650000 15.4040000 + 18 18 1 0.0000000 9.2060000 9.4670000 10.2240000 + 19 19 1 0.0000000 8.4360000 13.6240000 17.6570000 + 20 20 1 0.0000000 18.2020000 21.1230000 0.1380000 + 21 21 1 0.0000000 3.2970000 19.5740000 14.7410000 + 22 22 1 0.0000000 12.5330000 17.3580000 7.5960000 + 23 23 1 0.0000000 1.4040000 18.1060000 3.1510000 + 24 24 1 0.0000000 17.7440000 13.1530000 16.7940000 + 25 25 1 0.0000000 12.1070000 12.6630000 18.0340000 + 26 26 1 0.0000000 8.7270000 17.1140000 10.4200000 + 27 27 1 0.0000000 13.2330000 16.0380000 13.9210000 + 28 28 1 0.0000000 15.2360000 14.8650000 7.0150000 + 29 29 1 0.0000000 5.5190000 20.8660000 19.9260000 + 30 30 1 0.0000000 16.5810000 9.7460000 15.1710000 + 31 31 1 0.0000000 2.0500000 13.8550000 21.8010000 + 32 32 1 0.0000000 21.2670000 20.8970000 13.6740000 + 33 33 1 0.0000000 9.6900000 6.7650000 0.1950000 + 34 34 1 0.0000000 11.2570000 13.2440000 2.8190000 + 35 35 1 0.0000000 10.7810000 12.7310000 12.1920000 + 36 36 1 0.0000000 16.2630000 7.4100000 1.5360000 + 37 37 1 0.0000000 19.6100000 18.1440000 19.6830000 + 38 38 1 0.0000000 8.1790000 0.1200000 10.1620000 + 39 39 1 0.0000000 17.0520000 20.4210000 15.0450000 + 40 40 1 0.0000000 12.3690000 12.6710000 4.8320000 + 41 41 1 0.0000000 7.8300000 16.6790000 14.2470000 + 42 42 1 0.0000000 1.6790000 9.9500000 1.2660000 + 43 43 1 0.0000000 16.6160000 14.6580000 13.2790000 + 44 44 1 0.0000000 13.7430000 11.9730000 21.5360000 + 45 45 1 0.0000000 5.2590000 15.1850000 9.5720000 + 46 46 1 0.0000000 20.5980000 14.7930000 20.4140000 + 47 47 1 0.0000000 1.5640000 16.8080000 13.0450000 + 48 48 1 0.0000000 21.3670000 11.4610000 20.6420000 + 49 49 1 0.0000000 14.5890000 5.9510000 7.1950000 + 50 50 1 0.0000000 1.0870000 13.5410000 11.3300000 + 51 51 1 0.0000000 6.2040000 4.8970000 16.9420000 + 52 52 1 0.0000000 0.4800000 4.1450000 0.8710000 + 53 53 1 0.0000000 2.0120000 5.7530000 1.8950000 + 54 54 1 0.0000000 9.8460000 19.1320000 7.3060000 + 55 55 1 0.0000000 18.3760000 21.3430000 4.0940000 + 56 56 1 0.0000000 5.2900000 6.5400000 5.3620000 + 57 57 1 0.0000000 1.4110000 6.5750000 4.0580000 + 58 58 1 0.0000000 16.1600000 15.1390000 11.0380000 + 59 59 1 0.0000000 21.0670000 18.3830000 8.6900000 + 60 60 1 0.0000000 18.0250000 17.7750000 1.4340000 + 61 61 1 0.0000000 19.0570000 16.2190000 6.6410000 + 62 62 1 0.0000000 5.1170000 16.5510000 11.5540000 + 63 63 1 0.0000000 14.4810000 7.8720000 12.6320000 + 64 64 1 0.0000000 11.7990000 10.9690000 13.5430000 + 65 65 1 0.0000000 11.2980000 18.5410000 1.5740000 + 66 66 1 0.0000000 16.1280000 19.0390000 19.6440000 + 67 67 1 0.0000000 6.0950000 7.0580000 9.6530000 + 68 68 1 0.0000000 5.3890000 20.2540000 10.7060000 + 69 69 1 0.0000000 17.9160000 18.9070000 21.1540000 + 70 70 1 0.0000000 13.0780000 2.1790000 17.4030000 + 71 71 1 0.0000000 8.0450000 14.3440000 14.0640000 + 72 72 1 0.0000000 14.4380000 6.8780000 14.6950000 + 73 73 1 0.0000000 0.4570000 21.6180000 8.3670000 + 74 74 1 0.0000000 6.4350000 16.9720000 21.7330000 + 75 75 1 0.0000000 8.0530000 4.0310000 20.1860000 + 76 76 1 0.0000000 6.8130000 19.7870000 12.5790000 + 77 77 1 0.0000000 19.0490000 10.8480000 6.0760000 + 78 78 1 0.0000000 2.2540000 7.7370000 0.5320000 + 79 79 1 0.0000000 16.3920000 9.0880000 3.1430000 + 80 80 1 0.0000000 2.3620000 2.5500000 7.5690000 + 81 81 1 0.0000000 16.4560000 18.5670000 3.1120000 + 82 82 1 0.0000000 8.9560000 21.0830000 12.3020000 + 83 83 1 0.0000000 20.5540000 8.9280000 5.9480000 + 84 84 1 0.0000000 13.5930000 8.4890000 16.2370000 + 85 85 1 0.0000000 9.5270000 18.0720000 3.0190000 + 86 86 1 0.0000000 11.3690000 15.3870000 7.1310000 + 87 87 1 0.0000000 8.3670000 13.3960000 11.8610000 + 88 88 1 0.0000000 14.6370000 11.4110000 11.4870000 + 89 89 1 0.0000000 8.4720000 16.0650000 2.4300000 + 90 90 1 0.0000000 8.2360000 5.2200000 18.1710000 + 91 91 1 0.0000000 11.0620000 2.8760000 0.4170000 + 92 92 1 0.0000000 14.0830000 1.3550000 14.0190000 + 93 93 1 0.0000000 20.5600000 4.1900000 19.4660000 + 94 94 1 0.0000000 4.6340000 13.0980000 10.3670000 + 95 95 1 0.0000000 19.9860000 15.5670000 11.7860000 + 96 96 1 0.0000000 21.5070000 4.1860000 14.8350000 + 97 97 1 0.0000000 3.3000000 11.2060000 2.5350000 + 98 98 1 0.0000000 19.2680000 21.0240000 10.9110000 + 99 99 1 0.0000000 12.2370000 19.4650000 19.9000000 + 100 100 1 0.0000000 8.3790000 9.6670000 14.5440000 + 101 101 1 0.0000000 5.4520000 19.1660000 5.6940000 + 102 102 1 0.0000000 15.8720000 15.4140000 0.3070000 + 103 103 1 0.0000000 6.9830000 19.1480000 0.5830000 + 104 104 1 0.0000000 7.9760000 18.3420000 8.5250000 + 105 105 1 0.0000000 13.9710000 6.7570000 1.1860000 + 106 106 1 0.0000000 18.7050000 7.2110000 9.2350000 + 107 107 1 0.0000000 3.2430000 13.6330000 12.1990000 + 108 108 1 0.0000000 1.9830000 10.8340000 5.4640000 + 109 109 1 0.0000000 16.5770000 5.0400000 11.4490000 + 110 110 1 0.0000000 9.5130000 6.2390000 14.3030000 + 111 111 1 0.0000000 14.1990000 4.0910000 16.7750000 + 112 112 1 0.0000000 8.0160000 3.5600000 2.0280000 + 113 113 1 0.0000000 7.9650000 12.1700000 7.8050000 + 114 114 1 0.0000000 0.3770000 0.0320000 15.5780000 + 115 115 1 0.0000000 19.0860000 17.5690000 12.6230000 + 116 116 1 0.0000000 17.2970000 16.8030000 13.9660000 + 117 117 1 0.0000000 6.7180000 10.5880000 19.5790000 + 118 118 1 0.0000000 21.3930000 21.2940000 6.2410000 + 119 119 1 0.0000000 16.0260000 18.7640000 13.6100000 + 120 120 1 0.0000000 3.1880000 2.1990000 18.5690000 + 121 121 1 0.0000000 20.7860000 13.7840000 4.4870000 + 122 122 1 0.0000000 18.3540000 11.7960000 11.0710000 + 123 123 1 0.0000000 19.3210000 0.4960000 5.9630000 + 124 124 1 0.0000000 3.7260000 13.4120000 18.4840000 + 125 125 1 0.0000000 4.4280000 4.9270000 18.4730000 + 126 126 1 0.0000000 2.7040000 21.7660000 15.2940000 + 127 127 1 0.0000000 9.3640000 14.3230000 3.7130000 + 128 128 1 0.0000000 20.5800000 3.3360000 7.9310000 + 129 129 1 0.0000000 2.4060000 4.1320000 17.3120000 + 130 130 1 0.0000000 0.9210000 2.6080000 11.0930000 + 131 131 1 0.0000000 13.7900000 9.5610000 8.2490000 + 132 132 1 0.0000000 5.5210000 8.6760000 2.5590000 + 133 133 1 0.0000000 11.1320000 11.1160000 6.1310000 + 134 134 1 0.0000000 1.6180000 6.5650000 10.7690000 + 135 135 1 0.0000000 21.0480000 17.3880000 3.1250000 + 136 136 1 0.0000000 2.5950000 13.3430000 3.3870000 + 137 137 1 0.0000000 1.8600000 4.7830000 14.1190000 + 138 138 1 0.0000000 1.2420000 12.9340000 9.0760000 + 139 139 1 0.0000000 2.2650000 8.2300000 7.4350000 + 140 140 1 0.0000000 10.9360000 17.8140000 10.9520000 + 141 141 1 0.0000000 10.3160000 13.8030000 14.5060000 + 142 142 1 0.0000000 11.0500000 2.5760000 12.8090000 + 143 143 1 0.0000000 18.3430000 15.3950000 10.0190000 + 144 144 1 0.0000000 8.2990000 0.3320000 5.4980000 + 145 145 1 0.0000000 17.9730000 3.4330000 17.4260000 + 146 146 1 0.0000000 0.8080000 7.5530000 20.4740000 + 147 147 1 0.0000000 20.6320000 14.4730000 6.7080000 + 148 148 1 0.0000000 19.3400000 2.8450000 5.9340000 + 149 149 1 0.0000000 5.2100000 0.9290000 6.2580000 + 150 150 1 0.0000000 8.6370000 4.0920000 9.2870000 + 151 151 1 0.0000000 16.5730000 2.0050000 1.7720000 + 152 152 1 0.0000000 14.6570000 14.1440000 14.4910000 + 153 153 1 0.0000000 11.1610000 6.0610000 15.8870000 + 154 154 1 0.0000000 3.8100000 4.2040000 2.1350000 + 155 155 1 0.0000000 18.6920000 11.8180000 18.5170000 + 156 156 1 0.0000000 20.4240000 10.6340000 10.7960000 + 157 157 1 0.0000000 8.9050000 9.9220000 20.2310000 + 158 158 1 0.0000000 7.7940000 19.5410000 2.7410000 + 159 159 1 0.0000000 2.7600000 18.2100000 9.0140000 + 160 160 1 0.0000000 11.7480000 5.0280000 4.3170000 + 161 161 1 0.0000000 20.6470000 3.0010000 2.1470000 + 162 162 1 0.0000000 6.5680000 11.9510000 11.1410000 + 163 163 1 0.0000000 18.0300000 5.6700000 13.1650000 + 164 164 1 0.0000000 15.8950000 17.4810000 17.7940000 + 165 165 1 0.0000000 0.6840000 12.2180000 4.0930000 + 166 166 1 0.0000000 0.9170000 0.0080000 0.9710000 + 167 167 1 0.0000000 1.5850000 18.4470000 16.1470000 + 168 168 1 0.0000000 13.1970000 2.0830000 5.6040000 + 169 169 1 0.0000000 13.4220000 1.6690000 19.6280000 + 170 170 1 0.0000000 7.2980000 15.5410000 6.4330000 + 171 171 1 0.0000000 11.8930000 0.1240000 5.2450000 + 172 172 1 0.0000000 21.5410000 5.4260000 7.3690000 + 173 173 1 0.0000000 6.2310000 17.4900000 7.1340000 + 174 174 1 0.0000000 20.3880000 18.7320000 14.2000000 + 175 175 1 0.0000000 15.0410000 20.5060000 3.2370000 + 176 176 1 0.0000000 19.8180000 7.0070000 7.1800000 + 177 177 1 0.0000000 8.4660000 2.7180000 5.7470000 + 178 178 1 0.0000000 5.4480000 10.4180000 6.1220000 + 179 179 1 0.0000000 10.8570000 0.2910000 3.1650000 + 180 180 1 0.0000000 7.1820000 12.9370000 19.5560000 + 181 181 1 0.0000000 21.6620000 11.8360000 12.5450000 + 182 182 1 0.0000000 10.9080000 11.2050000 1.6360000 + 183 183 1 0.0000000 11.2840000 8.4420000 16.6070000 + 184 184 1 0.0000000 8.0040000 7.5690000 15.4890000 + 185 185 1 0.0000000 8.0790000 6.2840000 8.6400000 + 186 186 1 0.0000000 18.9520000 12.1530000 4.0530000 + 187 187 1 0.0000000 10.3010000 12.0820000 8.1320000 + 188 188 1 0.0000000 14.4560000 11.6780000 4.7170000 + 189 189 1 0.0000000 7.1020000 21.2750000 15.8180000 + 190 190 1 0.0000000 13.1170000 20.7170000 9.0870000 + 191 191 1 0.0000000 5.3560000 2.2610000 12.5060000 + 192 192 1 0.0000000 17.3690000 11.1000000 2.4870000 + 193 193 1 0.0000000 15.9510000 5.0030000 20.2280000 + 194 194 1 0.0000000 3.3320000 11.8950000 8.8170000 + 195 195 1 0.0000000 8.2450000 1.7100000 19.8310000 + 196 196 1 0.0000000 9.0600000 15.9380000 18.2990000 + 197 197 1 0.0000000 10.3120000 12.4780000 16.5400000 + 198 198 1 0.0000000 21.2690000 2.1440000 16.1630000 + 199 199 1 0.0000000 20.7920000 11.3890000 2.6870000 + 200 200 1 0.0000000 5.5190000 10.8650000 12.9180000 + 201 201 1 0.0000000 13.1600000 14.6530000 5.7980000 + 202 202 1 0.0000000 9.4110000 4.0280000 3.9640000 + 203 203 1 0.0000000 10.1160000 21.3800000 6.7070000 + 204 204 1 0.0000000 18.8050000 17.5440000 8.7540000 + 205 205 1 0.0000000 0.2690000 20.1700000 17.2400000 + 206 206 1 0.0000000 14.6190000 13.4340000 10.3480000 + 207 207 1 0.0000000 14.9800000 3.6520000 2.2770000 + 208 208 1 0.0000000 10.4210000 1.4390000 14.8540000 + 209 209 1 0.0000000 2.8950000 8.5990000 11.0640000 + 210 210 1 0.0000000 8.3350000 0.6070000 14.2020000 + 211 211 1 0.0000000 5.6790000 2.9730000 15.7800000 + 212 212 1 0.0000000 7.9000000 8.2920000 21.6460000 + 213 213 1 0.0000000 1.7820000 17.8720000 5.4810000 + 214 214 1 0.0000000 7.1130000 2.5790000 13.9770000 + 215 215 1 0.0000000 14.4580000 4.6660000 0.2210000 + 216 216 1 0.0000000 2.6400000 9.9660000 17.7570000 + 217 217 1 0.0000000 12.9280000 10.2110000 10.3600000 + 218 218 1 0.0000000 0.5090000 2.0800000 8.8230000 + 219 219 1 0.0000000 0.9650000 20.6540000 11.9240000 + 220 220 1 0.0000000 19.5740000 21.0310000 2.1230000 + 221 221 1 0.0000000 18.6770000 7.8820000 12.9890000 + 222 222 1 0.0000000 17.1700000 3.9160000 5.7110000 + 223 223 1 0.0000000 7.0920000 12.0700000 1.6960000 + 224 224 1 0.0000000 2.6840000 17.0880000 1.3490000 + 225 225 1 0.0000000 5.4860000 16.7240000 19.5970000 + 226 226 1 0.0000000 16.3220000 3.8420000 15.8790000 + 227 227 1 0.0000000 3.8940000 2.4920000 0.4900000 + 228 228 1 0.0000000 13.2430000 3.5150000 13.0570000 + 229 229 1 0.0000000 13.3010000 21.5940000 12.5150000 + 230 230 1 0.0000000 4.9010000 11.9630000 0.9870000 + 231 231 1 0.0000000 12.6700000 14.8980000 18.4670000 + 232 232 1 0.0000000 6.4220000 6.6170000 3.2980000 + 233 233 1 0.0000000 16.6360000 5.9910000 15.0630000 + 234 234 1 0.0000000 17.9000000 15.3980000 1.6090000 + 235 235 1 0.0000000 18.1580000 0.8480000 9.7210000 + 236 236 1 0.0000000 20.2850000 4.8230000 12.9090000 + 237 237 1 0.0000000 1.6610000 2.7360000 5.3350000 + 238 238 1 0.0000000 5.8340000 0.9980000 16.9740000 + 239 239 1 0.0000000 9.0090000 7.7870000 5.7310000 + 240 240 1 0.0000000 16.1890000 4.3150000 7.8490000 + 241 241 1 0.0000000 16.5840000 8.9600000 12.9530000 + 242 242 1 0.0000000 4.8520000 10.4780000 21.0310000 + 243 243 1 0.0000000 2.7810000 16.7740000 17.2520000 + 244 244 1 0.0000000 19.7990000 10.0200000 15.9170000 + 245 245 1 0.0000000 3.1690000 7.6710000 5.2800000 + 246 246 1 0.0000000 15.1980000 2.3520000 8.6870000 + 247 247 1 0.0000000 16.3130000 2.2040000 14.2110000 + 248 248 1 0.0000000 6.3140000 2.9350000 6.7010000 + 249 249 1 0.0000000 8.2590000 4.5060000 13.2730000 + 250 250 1 0.0000000 13.9300000 18.2210000 14.4470000 + 251 251 1 0.0000000 20.2210000 7.9620000 14.8160000 + 252 252 1 0.0000000 1.6700000 11.5910000 21.3490000 + 253 253 1 0.0000000 11.2380000 16.3450000 17.3670000 + 254 254 1 0.0000000 2.0800000 20.2850000 2.3410000 + 255 255 1 0.0000000 13.5570000 16.5190000 4.3840000 + 256 256 1 0.0000000 7.4220000 19.6120000 18.9900000 + 257 257 1 0.0000000 12.9300000 16.8740000 2.1540000 + 258 258 1 0.0000000 14.8300000 17.0150000 10.5830000 + 259 259 1 0.0000000 9.9680000 16.3050000 20.5360000 + 260 260 1 0.0000000 20.9510000 14.9180000 15.5360000 + 261 261 1 0.0000000 21.2710000 0.7830000 2.5700000 + 262 262 1 0.0000000 7.5010000 11.4110000 5.6070000 + 263 263 1 0.0000000 15.1820000 11.1410000 6.9920000 + 264 264 1 0.0000000 12.3430000 6.8350000 2.9520000 + 265 265 1 0.0000000 15.6910000 17.3040000 4.9430000 + 266 266 1 0.0000000 6.2450000 1.4930000 10.4630000 + 267 267 1 0.0000000 15.3140000 20.7570000 16.6390000 + 268 268 1 0.0000000 18.2310000 18.8700000 10.8220000 + 269 269 1 0.0000000 19.9080000 8.2790000 11.0020000 + 270 270 1 0.0000000 16.2580000 5.0600000 3.6820000 + 271 271 1 0.0000000 3.6660000 15.6980000 13.3000000 + 272 272 1 0.0000000 21.3440000 9.2620000 2.0490000 + 273 273 1 0.0000000 21.6340000 20.9700000 20.9670000 + 274 274 1 0.0000000 20.4570000 2.7200000 11.7840000 + 275 275 1 0.0000000 4.3450000 15.9260000 15.6130000 + 276 276 1 0.0000000 18.5090000 3.3140000 1.1410000 + 277 277 1 0.0000000 0.4070000 15.7920000 11.2970000 + 278 278 1 0.0000000 13.3440000 8.1980000 4.5520000 + 279 279 1 0.0000000 8.5380000 21.6840000 3.2560000 + 280 280 1 0.0000000 2.2890000 0.7680000 11.6890000 + 281 281 1 0.0000000 21.5990000 18.8900000 6.4050000 + 282 282 1 0.0000000 14.9140000 7.5570000 8.8670000 + 283 283 1 0.0000000 21.3690000 18.6450000 21.2590000 + 284 284 1 0.0000000 10.9470000 5.8950000 10.8840000 + 285 285 1 0.0000000 2.6280000 15.7990000 6.4350000 + 286 286 1 0.0000000 11.9940000 15.1200000 20.8540000 + 287 287 1 0.0000000 16.6450000 10.2270000 10.9850000 + 288 288 1 0.0000000 13.0310000 2.8900000 9.3200000 + 289 289 1 0.0000000 12.4260000 19.8280000 13.6940000 + 290 290 1 0.0000000 19.8890000 19.6500000 17.8410000 + 291 291 1 0.0000000 4.0230000 9.6810000 4.2830000 + 292 292 1 0.0000000 2.6590000 21.3600000 4.2810000 + 293 293 1 0.0000000 6.4930000 3.2770000 9.0110000 + 294 294 1 0.0000000 21.3560000 20.3330000 10.0560000 + 295 295 1 0.0000000 14.3030000 20.6610000 0.9740000 + 296 296 1 0.0000000 4.4890000 8.4620000 0.4180000 + 297 297 1 0.0000000 6.5630000 7.5730000 11.8490000 + 298 298 1 0.0000000 3.4090000 1.4420000 13.6640000 + 299 299 1 0.0000000 15.6340000 1.9640000 5.3770000 + 300 300 1 0.0000000 11.9210000 0.8170000 9.6710000 + 301 301 1 0.0000000 20.9660000 9.2330000 20.1270000 + 302 302 1 0.0000000 1.6280000 6.2090000 8.4340000 + 303 303 1 0.0000000 0.5530000 9.8060000 7.0560000 + 304 304 1 0.0000000 11.5710000 18.9280000 8.9830000 + 305 305 1 0.0000000 4.2490000 7.9910000 14.8160000 + 306 306 1 0.0000000 19.7300000 12.4900000 7.6500000 + 307 307 1 0.0000000 10.8450000 14.1880000 9.0020000 + 308 308 1 0.0000000 10.8070000 11.1620000 10.2560000 + 309 309 1 0.0000000 4.7040000 8.6980000 12.6030000 + 310 310 1 0.0000000 3.7570000 12.0590000 6.5220000 + 311 311 1 0.0000000 9.7910000 2.9010000 7.6620000 + 312 312 1 0.0000000 3.7810000 14.0810000 5.2770000 + 313 313 1 0.0000000 4.0640000 19.1000000 1.8260000 + 314 314 1 0.0000000 21.7520000 10.6160000 14.7710000 + 315 315 1 0.0000000 1.3090000 11.5200000 16.3780000 + 316 316 1 0.0000000 5.1840000 20.6560000 0.4260000 + 317 317 1 0.0000000 10.7630000 2.3920000 17.0100000 + 318 318 1 0.0000000 4.7970000 15.9920000 1.2450000 + 319 319 1 0.0000000 11.1370000 0.4590000 11.8330000 + 320 320 1 0.0000000 14.5870000 13.6170000 1.1610000 + 321 321 1 0.0000000 9.8660000 0.7940000 8.6450000 + 322 322 1 0.0000000 17.7650000 19.2430000 7.2990000 + 323 323 1 0.0000000 6.0610000 1.2430000 19.3000000 + 324 324 1 0.0000000 18.2200000 12.8760000 13.2170000 + 325 325 1 0.0000000 18.0460000 13.1700000 9.1450000 + 326 326 1 0.0000000 3.3530000 3.3130000 15.2040000 + 327 327 1 0.0000000 10.4090000 19.4890000 16.3660000 + 328 328 1 0.0000000 15.6710000 1.1260000 19.9260000 + 329 329 1 0.0000000 10.8900000 7.3650000 7.1060000 + 330 330 1 0.0000000 13.4480000 20.2870000 5.0130000 + 331 331 1 0.0000000 16.0530000 0.3050000 0.2340000 + 332 332 1 0.0000000 9.8430000 17.8410000 14.6670000 + 333 333 1 0.0000000 13.0150000 10.2370000 1.1400000 + 334 334 1 0.0000000 4.2090000 16.6330000 8.0040000 + 335 335 1 0.0000000 4.5530000 4.3630000 11.8090000 + 336 336 1 0.0000000 12.4370000 18.2310000 5.4180000 + 337 337 1 0.0000000 4.6660000 4.4220000 5.9770000 + 338 338 1 0.0000000 9.5670000 9.6790000 2.7600000 + 339 339 1 0.0000000 17.6640000 17.0250000 16.2770000 + 340 340 1 0.0000000 20.3640000 13.8280000 13.4210000 + 341 341 1 0.0000000 10.0140000 7.4130000 9.2700000 + 342 342 1 0.0000000 2.1350000 7.0370000 14.8450000 + 343 343 1 0.0000000 10.1280000 17.9060000 5.2690000 + 344 344 1 0.0000000 9.9640000 11.7180000 21.3790000 + 345 345 1 0.0000000 3.9300000 18.4910000 10.9740000 + 346 346 1 0.0000000 4.4370000 0.9780000 3.9700000 + 347 347 1 0.0000000 3.3540000 11.6180000 13.2880000 + 348 348 1 0.0000000 10.1490000 8.5100000 18.7440000 + 349 349 1 0.0000000 20.0030000 12.0850000 0.6000000 + 350 350 1 0.0000000 8.1370000 7.5880000 17.8300000 + 351 351 1 0.0000000 4.9940000 4.9580000 9.5900000 + 352 352 1 0.0000000 5.3170000 14.3610000 19.8350000 + 353 353 1 0.0000000 9.3030000 10.0320000 5.0540000 + 354 354 1 0.0000000 15.9060000 19.0210000 11.2850000 + 355 355 1 0.0000000 4.7750000 3.1100000 20.1740000 + 356 356 1 0.0000000 12.3120000 9.1080000 6.4970000 + 357 357 1 0.0000000 10.4810000 4.6620000 17.6350000 + 358 358 1 0.0000000 4.7080000 13.6970000 16.3300000 + 359 359 1 0.0000000 12.2970000 5.5490000 6.5760000 + 360 360 1 0.0000000 17.9900000 5.6590000 1.9370000 + 361 361 1 0.0000000 15.7760000 13.0220000 8.3090000 + 362 362 1 0.0000000 17.0960000 9.8020000 6.8980000 + 363 363 1 0.0000000 14.4040000 20.5780000 7.1330000 + 364 364 1 0.0000000 10.5700000 7.4740000 12.5610000 + 365 365 1 0.0000000 7.1880000 17.4800000 12.1560000 + 366 366 1 0.0000000 19.2640000 6.6050000 0.0900000 + 367 367 1 0.0000000 2.4860000 20.3860000 7.9620000 + 368 368 1 0.0000000 1.6540000 17.4650000 21.0330000 + 369 369 1 0.0000000 0.8570000 14.9180000 7.7750000 + 370 370 1 0.0000000 15.6360000 3.0200000 12.0780000 + 371 371 1 0.0000000 20.9520000 6.0750000 16.1620000 + 372 372 1 0.0000000 6.5150000 10.9720000 15.0530000 + 373 373 1 0.0000000 1.6150000 2.1220000 0.1040000 + 374 374 1 0.0000000 12.4880000 14.7040000 1.3780000 + 375 375 1 0.0000000 1.8720000 14.8200000 18.2130000 + 376 376 1 0.0000000 1.3840000 6.3060000 16.9560000 + 377 377 1 0.0000000 13.1420000 8.3550000 21.5020000 + 378 378 1 0.0000000 10.3950000 19.1540000 12.7720000 + 379 379 1 0.0000000 18.9350000 15.8660000 19.2180000 + 380 380 1 0.0000000 19.6110000 0.3890000 20.4600000 + 381 381 1 0.0000000 1.6460000 14.9430000 1.9780000 + 382 382 1 0.0000000 16.9420000 8.7780000 9.0500000 + 383 383 1 0.0000000 15.0770000 11.3050000 19.7190000 + 384 384 1 0.0000000 6.2370000 17.3890000 15.8170000 + 385 385 1 0.0000000 14.6890000 16.8390000 8.2540000 + 386 386 1 0.0000000 5.9660000 6.4540000 15.1720000 + 387 387 1 0.0000000 6.1100000 4.8320000 21.2820000 + 388 388 1 0.0000000 5.9710000 14.6570000 4.7110000 + 389 389 1 0.0000000 3.1780000 19.7080000 5.8410000 + 390 390 1 0.0000000 5.7600000 19.5340000 14.8080000 + 391 391 1 0.0000000 18.1190000 11.5110000 15.1550000 + 392 392 1 0.0000000 17.0450000 3.0230000 19.5700000 + 393 393 1 0.0000000 11.7520000 21.8180000 19.7610000 + 394 394 1 0.0000000 15.5870000 18.5610000 6.9700000 + 395 395 1 0.0000000 6.0680000 8.8370000 18.0920000 + 396 396 1 0.0000000 14.2730000 18.8060000 21.1250000 + 397 397 1 0.0000000 14.8640000 7.7480000 18.0510000 + 398 398 1 0.0000000 7.1970000 14.3360000 8.4160000 + 399 399 1 0.0000000 12.4080000 8.9750000 12.3640000 + 400 400 1 0.0000000 15.7690000 0.5910000 7.2330000 + 401 401 1 0.0000000 14.1880000 18.6730000 16.7170000 + 402 402 1 0.0000000 0.1070000 17.0650000 14.8780000 + 403 403 1 0.0000000 1.2690000 21.0730000 19.1580000 + 404 404 1 0.0000000 8.3320000 15.5390000 0.1550000 + 405 405 1 0.0000000 3.4890000 20.2250000 18.9410000 + 406 406 1 0.0000000 16.7760000 7.8120000 16.6050000 + 407 407 1 0.0000000 0.5070000 4.7570000 5.2510000 + 408 408 1 0.0000000 19.1810000 3.0200000 9.7780000 + 409 409 1 0.0000000 4.7160000 9.7900000 16.3110000 + 410 410 1 0.0000000 2.4040000 18.9600000 12.6390000 + 411 411 1 0.0000000 3.3380000 4.6500000 7.9680000 + 412 412 1 0.0000000 17.7990000 4.9620000 9.4940000 + 413 413 1 0.0000000 12.7390000 16.3390000 11.5840000 + 414 414 1 0.0000000 17.5550000 6.7730000 20.3200000 + 415 415 1 0.0000000 14.1770000 9.8840000 3.2060000 + 416 416 1 0.0000000 14.4790000 10.5810000 15.6890000 + 417 417 1 0.0000000 14.7570000 21.0200000 10.8010000 + 418 418 1 0.0000000 19.6820000 0.5930000 12.8140000 + 419 419 1 0.0000000 8.6600000 0.3420000 21.6710000 + 420 420 1 0.0000000 9.6300000 4.0130000 11.4620000 + 421 421 1 0.0000000 21.1990000 7.8220000 3.8780000 + 422 422 1 0.0000000 1.0220000 15.3220000 20.3160000 + 423 423 1 0.0000000 19.5230000 9.5210000 18.2400000 + 424 424 1 0.0000000 6.0420000 4.8470000 1.8140000 + 425 425 1 0.0000000 19.0970000 2.7310000 20.7130000 + 426 426 1 0.0000000 20.7220000 12.9310000 18.9570000 + 427 427 1 0.0000000 12.0420000 5.2830000 19.3670000 + 428 428 1 0.0000000 12.3510000 14.1340000 10.8070000 + 429 429 1 0.0000000 0.6760000 0.6980000 4.6080000 + 430 430 1 0.0000000 17.9010000 21.6070000 7.6530000 + 431 431 1 0.0000000 12.9910000 4.6940000 10.9090000 + 432 432 1 0.0000000 4.1650000 0.3790000 10.2450000 + 433 433 1 0.0000000 11.0350000 2.5880000 2.7230000 + 434 434 1 0.0000000 0.8260000 16.8030000 9.2410000 + 435 435 1 0.0000000 1.2930000 1.5320000 19.6910000 + 436 436 1 0.0000000 3.6360000 0.6300000 7.9720000 + 437 437 1 0.0000000 18.7690000 21.6650000 18.3160000 + 438 438 1 0.0000000 15.9900000 1.2130000 10.5660000 + 439 439 1 0.0000000 3.6880000 0.2170000 17.3680000 + 440 440 1 0.0000000 15.4550000 13.7970000 16.7760000 + 441 441 1 0.0000000 13.6260000 0.3920000 16.0690000 + 442 442 1 0.0000000 2.2090000 7.7760000 18.5900000 + 443 443 1 0.0000000 7.5390000 1.2670000 1.6990000 + 444 444 1 0.0000000 5.8870000 7.1350000 20.9610000 + 445 445 1 0.0000000 3.5460000 9.4970000 8.9750000 + 446 446 1 0.0000000 1.7030000 10.1450000 12.4300000 + 447 447 1 0.0000000 4.5220000 7.2320000 19.0140000 + 448 448 1 0.0000000 12.0790000 18.5320000 17.7390000 + 449 449 1 0.0000000 11.8150000 12.7440000 20.4040000 + 450 450 1 0.0000000 14.1450000 16.3300000 20.6400000 + 451 451 1 0.0000000 13.9790000 11.9100000 13.7820000 + 452 452 1 0.0000000 5.7860000 9.0870000 8.2180000 + 453 453 1 0.0000000 5.7610000 18.5920000 3.4730000 + 454 454 1 0.0000000 17.1860000 12.2100000 20.2580000 + 455 455 1 0.0000000 19.9590000 17.8190000 5.1360000 + 456 456 1 0.0000000 17.0590000 15.4900000 5.5810000 + 457 457 1 0.0000000 3.6710000 3.1920000 4.2290000 + 458 458 1 0.0000000 9.3110000 4.4320000 0.2320000 + 459 459 1 0.0000000 7.2900000 10.5480000 9.3640000 + 460 460 1 0.0000000 3.1990000 11.3340000 19.5640000 + 461 461 1 0.0000000 18.7960000 19.0310000 15.8960000 + 462 462 1 0.0000000 16.4530000 21.1730000 18.6370000 + 463 463 1 0.0000000 19.0360000 1.4790000 16.6070000 + 464 464 1 0.0000000 15.1190000 6.7220000 5.0610000 + 465 465 1 0.0000000 14.6980000 6.3460000 10.8900000 + 466 466 1 0.0000000 9.5270000 15.6660000 5.6890000 + 467 467 1 0.0000000 9.8670000 0.7250000 18.4290000 + 468 468 1 0.0000000 3.5070000 11.8220000 15.5670000 + 469 469 1 0.0000000 5.2170000 0.8530000 1.6550000 + 470 470 1 0.0000000 14.2830000 11.9310000 17.5860000 + 471 471 1 0.0000000 21.4650000 11.2840000 8.7140000 + 472 472 1 0.0000000 0.2700000 13.5140000 17.1240000 + 473 473 1 0.0000000 8.7330000 20.7300000 17.4130000 + 474 474 1 0.0000000 7.4140000 12.9760000 3.8660000 + 475 475 1 0.0000000 8.5520000 8.7210000 12.3480000 + 476 476 1 0.0000000 7.4770000 9.7280000 1.7090000 + 477 477 1 0.0000000 16.9200000 14.6800000 20.0740000 + 478 478 1 0.0000000 6.5920000 20.9910000 6.6400000 + 479 479 1 0.0000000 18.3870000 7.4290000 18.2380000 + 480 480 1 0.0000000 21.2320000 15.1360000 2.5810000 + 481 481 1 0.0000000 16.7390000 8.6780000 21.4380000 + 482 482 1 0.0000000 18.2260000 6.2380000 5.6140000 + 483 483 1 0.0000000 12.7550000 3.5820000 20.8720000 + 484 484 1 0.0000000 14.8870000 9.0010000 20.0300000 + 485 485 1 0.0000000 6.1970000 16.3000000 3.0880000 + 486 486 1 0.0000000 6.9450000 13.1810000 15.8140000 + 487 487 1 0.0000000 20.1770000 18.7700000 1.5020000 + 488 488 1 0.0000000 19.8750000 14.4220000 0.7710000 + 489 489 1 0.0000000 13.0770000 5.0280000 14.9330000 + 490 490 1 0.0000000 10.9540000 0.5380000 0.0170000 + 491 491 1 0.0000000 0.3310000 3.0520000 18.1720000 + 492 492 1 0.0000000 8.8200000 14.8310000 10.0110000 + 493 493 1 0.0000000 6.9570000 20.3870000 8.9230000 + 494 494 1 0.0000000 21.4900000 6.8560000 12.0490000 + 495 495 1 0.0000000 8.1550000 13.1990000 21.7210000 + 496 496 1 0.0000000 2.1970000 4.5290000 11.8290000 + 497 497 1 0.0000000 14.2880000 5.5560000 18.5960000 + 498 498 1 0.0000000 15.0910000 15.4110000 18.5470000 + 499 499 1 0.0000000 18.9760000 15.1930000 16.8970000 + 500 500 1 0.0000000 19.4100000 5.3490000 17.7540000 + 501 501 1 0.0000000 0.5430000 8.3990000 13.7700000 + 502 502 1 0.0000000 18.0770000 19.1690000 4.8770000 + 503 503 1 0.0000000 3.3760000 17.8650000 19.2940000 + 504 504 1 0.0000000 16.3760000 0.5870000 3.6340000 + 505 505 1 0.0000000 10.4990000 18.5190000 21.1770000 + 506 506 1 0.0000000 15.7320000 12.7570000 3.0200000 + 507 507 1 0.0000000 16.9190000 8.1780000 5.2430000 + 508 508 1 0.0000000 6.9450000 7.4210000 6.8040000 + 509 509 1 0.0000000 11.6120000 21.2610000 15.3620000 + 510 510 1 0.0000000 18.0500000 0.6840000 14.5470000 + 511 511 1 0.0000000 20.4340000 4.0240000 4.2040000 + 512 512 1 0.0000000 18.0190000 10.7210000 0.2160000 + diff --git a/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_216.lmp b/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_216.lmp new file mode 100755 index 0000000000..893d75e69b --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_216.lmp @@ -0,0 +1,238 @@ +LAMMPS description + + 216 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 16.293000 xlo xhi + 0.0000000 16.293000 ylo yhi + 0.0000000 16.293000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 + 2 2 1 0.0000000 0.0000000 2.7160000 2.7160000 + 3 3 1 0.0000000 2.7160000 2.7160000 0.0000000 + 4 4 1 0.0000000 2.7160000 0.0000000 2.7160000 + 5 5 1 0.0000000 4.0730000 1.3580000 4.0730000 + 6 6 1 0.0000000 1.3580000 1.3580000 1.3580000 + 7 7 1 0.0000000 1.3580000 4.0730000 4.0730000 + 8 8 1 0.0000000 4.0730000 4.0730000 1.3580000 + 9 9 1 0.0000000 0.0000000 0.0000000 5.4310000 + 10 10 1 0.0000000 0.0000000 2.7160000 8.1460000 + 11 11 1 0.0000000 2.7160000 2.7160000 5.4310000 + 12 12 1 0.0000000 2.7160000 0.0000000 8.1460000 + 13 13 1 0.0000000 4.0730000 1.3580000 9.5040000 + 14 14 1 0.0000000 1.3580000 1.3580000 6.7890000 + 15 15 1 0.0000000 1.3580000 4.0730000 9.5040000 + 16 16 1 0.0000000 4.0730000 4.0730000 6.7890000 + 17 17 1 0.0000000 0.0000000 0.0000000 10.8620000 + 18 18 1 0.0000000 0.0000000 2.7160000 13.5780000 + 19 19 1 0.0000000 2.7160000 2.7160000 10.8620000 + 20 20 1 0.0000000 2.7160000 0.0000000 13.5780000 + 21 21 1 0.0000000 4.0730000 1.3580000 14.9350000 + 22 22 1 0.0000000 1.3580000 1.3580000 12.2200000 + 23 23 1 0.0000000 1.3580000 4.0730000 14.9350000 + 24 24 1 0.0000000 4.0730000 4.0730000 12.2200000 + 25 25 1 0.0000000 0.0000000 5.4310000 0.0000000 + 26 26 1 0.0000000 0.0000000 8.1460000 2.7160000 + 27 27 1 0.0000000 2.7160000 8.1460000 0.0000000 + 28 28 1 0.0000000 2.7160000 5.4310000 2.7160000 + 29 29 1 0.0000000 4.0730000 6.7890000 4.0730000 + 30 30 1 0.0000000 1.3580000 6.7890000 1.3580000 + 31 31 1 0.0000000 1.3580000 9.5040000 4.0730000 + 32 32 1 0.0000000 4.0730000 9.5040000 1.3580000 + 33 33 1 0.0000000 0.0000000 5.4310000 5.4310000 + 34 34 1 0.0000000 0.0000000 8.1460000 8.1460000 + 35 35 1 0.0000000 2.7160000 8.1460000 5.4310000 + 36 36 1 0.0000000 2.7160000 5.4310000 8.1460000 + 37 37 1 0.0000000 4.0730000 6.7890000 9.5040000 + 38 38 1 0.0000000 1.3580000 6.7890000 6.7890000 + 39 39 1 0.0000000 1.3580000 9.5040000 9.5040000 + 40 40 1 0.0000000 4.0730000 9.5040000 6.7890000 + 41 41 1 0.0000000 0.0000000 5.4310000 10.8620000 + 42 42 1 0.0000000 0.0000000 8.1460000 13.5780000 + 43 43 1 0.0000000 2.7160000 8.1460000 10.8620000 + 44 44 1 0.0000000 2.7160000 5.4310000 13.5780000 + 45 45 1 0.0000000 4.0730000 6.7890000 14.9350000 + 46 46 1 0.0000000 1.3580000 6.7890000 12.2200000 + 47 47 1 0.0000000 1.3580000 9.5040000 14.9350000 + 48 48 1 0.0000000 4.0730000 9.5040000 12.2200000 + 49 49 1 0.0000000 0.0000000 10.8620000 0.0000000 + 50 50 1 0.0000000 0.0000000 13.5780000 2.7160000 + 51 51 1 0.0000000 2.7160000 13.5780000 0.0000000 + 52 52 1 0.0000000 2.7160000 10.8620000 2.7160000 + 53 53 1 0.0000000 4.0730000 12.2200000 4.0730000 + 54 54 1 0.0000000 1.3580000 12.2200000 1.3580000 + 55 55 1 0.0000000 1.3580000 14.9350000 4.0730000 + 56 56 1 0.0000000 4.0730000 14.9350000 1.3580000 + 57 57 1 0.0000000 0.0000000 10.8620000 5.4310000 + 58 58 1 0.0000000 0.0000000 13.5780000 8.1460000 + 59 59 1 0.0000000 2.7160000 13.5780000 5.4310000 + 60 60 1 0.0000000 2.7160000 10.8620000 8.1460000 + 61 61 1 0.0000000 4.0730000 12.2200000 9.5040000 + 62 62 1 0.0000000 1.3580000 12.2200000 6.7890000 + 63 63 1 0.0000000 1.3580000 14.9350000 9.5040000 + 64 64 1 0.0000000 4.0730000 14.9350000 6.7890000 + 65 65 1 0.0000000 0.0000000 10.8620000 10.8620000 + 66 66 1 0.0000000 0.0000000 13.5780000 13.5780000 + 67 67 1 0.0000000 2.7160000 13.5780000 10.8620000 + 68 68 1 0.0000000 2.7160000 10.8620000 13.5780000 + 69 69 1 0.0000000 4.0730000 12.2200000 14.9350000 + 70 70 1 0.0000000 1.3580000 12.2200000 12.2200000 + 71 71 1 0.0000000 1.3580000 14.9350000 14.9350000 + 72 72 1 0.0000000 4.0730000 14.9350000 12.2200000 + 73 73 1 0.0000000 5.4310000 0.0000000 0.0000000 + 74 74 1 0.0000000 5.4310000 2.7160000 2.7160000 + 75 75 1 0.0000000 8.1460000 2.7160000 0.0000000 + 76 76 1 0.0000000 8.1460000 0.0000000 2.7160000 + 77 77 1 0.0000000 9.5040000 1.3580000 4.0730000 + 78 78 1 0.0000000 6.7890000 1.3580000 1.3580000 + 79 79 1 0.0000000 6.7890000 4.0730000 4.0730000 + 80 80 1 0.0000000 9.5040000 4.0730000 1.3580000 + 81 81 1 0.0000000 5.4310000 0.0000000 5.4310000 + 82 82 1 0.0000000 5.4310000 2.7160000 8.1460000 + 83 83 1 0.0000000 8.1460000 2.7160000 5.4310000 + 84 84 1 0.0000000 8.1460000 0.0000000 8.1460000 + 85 85 1 0.0000000 9.5040000 1.3580000 9.5040000 + 86 86 1 0.0000000 6.7890000 1.3580000 6.7890000 + 87 87 1 0.0000000 6.7890000 4.0730000 9.5040000 + 88 88 1 0.0000000 9.5040000 4.0730000 6.7890000 + 89 89 1 0.0000000 5.4310000 0.0000000 10.8620000 + 90 90 1 0.0000000 5.4310000 2.7160000 13.5780000 + 91 91 1 0.0000000 8.1460000 2.7160000 10.8620000 + 92 92 1 0.0000000 8.1460000 0.0000000 13.5780000 + 93 93 1 0.0000000 9.5040000 1.3580000 14.9350000 + 94 94 1 0.0000000 6.7890000 1.3580000 12.2200000 + 95 95 1 0.0000000 6.7890000 4.0730000 14.9350000 + 96 96 1 0.0000000 9.5040000 4.0730000 12.2200000 + 97 97 1 0.0000000 5.4310000 5.4310000 0.0000000 + 98 98 1 0.0000000 5.4310000 8.1460000 2.7160000 + 99 99 1 0.0000000 8.1460000 8.1460000 0.0000000 + 100 100 1 0.0000000 8.1460000 5.4310000 2.7160000 + 101 101 1 0.0000000 9.5040000 6.7890000 4.0730000 + 102 102 1 0.0000000 6.7890000 6.7890000 1.3580000 + 103 103 1 0.0000000 6.7890000 9.5040000 4.0730000 + 104 104 1 0.0000000 9.5040000 9.5040000 1.3580000 + 105 105 1 0.0000000 5.4310000 5.4310000 5.4310000 + 106 106 1 0.0000000 5.4310000 8.1460000 8.1460000 + 107 107 1 0.0000000 8.1460000 8.1460000 5.4310000 + 108 108 1 0.0000000 8.1460000 5.4310000 8.1460000 + 109 109 1 0.0000000 9.5040000 6.7890000 9.5040000 + 110 110 1 0.0000000 6.7890000 6.7890000 6.7890000 + 111 111 1 0.0000000 6.7890000 9.5040000 9.5040000 + 112 112 1 0.0000000 9.5040000 9.5040000 6.7890000 + 113 113 1 0.0000000 5.4310000 5.4310000 10.8620000 + 114 114 1 0.0000000 5.4310000 8.1460000 13.5780000 + 115 115 1 0.0000000 8.1460000 8.1460000 10.8620000 + 116 116 1 0.0000000 8.1460000 5.4310000 13.5780000 + 117 117 1 0.0000000 9.5040000 6.7890000 14.9350000 + 118 118 1 0.0000000 6.7890000 6.7890000 12.2200000 + 119 119 1 0.0000000 6.7890000 9.5040000 14.9350000 + 120 120 1 0.0000000 9.5040000 9.5040000 12.2200000 + 121 121 1 0.0000000 5.4310000 10.8620000 0.0000000 + 122 122 1 0.0000000 5.4310000 13.5780000 2.7160000 + 123 123 1 0.0000000 8.1460000 13.5780000 0.0000000 + 124 124 1 0.0000000 8.1460000 10.8620000 2.7160000 + 125 125 1 0.0000000 9.5040000 12.2200000 4.0730000 + 126 126 1 0.0000000 6.7890000 12.2200000 1.3580000 + 127 127 1 0.0000000 6.7890000 14.9350000 4.0730000 + 128 128 1 0.0000000 9.5040000 14.9350000 1.3580000 + 129 129 1 0.0000000 5.4310000 10.8620000 5.4310000 + 130 130 1 0.0000000 5.4310000 13.5780000 8.1460000 + 131 131 1 0.0000000 8.1460000 13.5780000 5.4310000 + 132 132 1 0.0000000 8.1460000 10.8620000 8.1460000 + 133 133 1 0.0000000 9.5040000 12.2200000 9.5040000 + 134 134 1 0.0000000 6.7890000 12.2200000 6.7890000 + 135 135 1 0.0000000 6.7890000 14.9350000 9.5040000 + 136 136 1 0.0000000 9.5040000 14.9350000 6.7890000 + 137 137 1 0.0000000 5.4310000 10.8620000 10.8620000 + 138 138 1 0.0000000 5.4310000 13.5780000 13.5780000 + 139 139 1 0.0000000 8.1460000 13.5780000 10.8620000 + 140 140 1 0.0000000 8.1460000 10.8620000 13.5780000 + 141 141 1 0.0000000 9.5040000 12.2200000 14.9350000 + 142 142 1 0.0000000 6.7890000 12.2200000 12.2200000 + 143 143 1 0.0000000 6.7890000 14.9350000 14.9350000 + 144 144 1 0.0000000 9.5040000 14.9350000 12.2200000 + 145 145 1 0.0000000 10.8620000 0.0000000 0.0000000 + 146 146 1 0.0000000 10.8620000 2.7160000 2.7160000 + 147 147 1 0.0000000 13.5780000 2.7160000 0.0000000 + 148 148 1 0.0000000 13.5780000 0.0000000 2.7160000 + 149 149 1 0.0000000 14.9350000 1.3580000 4.0730000 + 150 150 1 0.0000000 12.2200000 1.3580000 1.3580000 + 151 151 1 0.0000000 12.2200000 4.0730000 4.0730000 + 152 152 1 0.0000000 14.9350000 4.0730000 1.3580000 + 153 153 1 0.0000000 10.8620000 0.0000000 5.4310000 + 154 154 1 0.0000000 10.8620000 2.7160000 8.1460000 + 155 155 1 0.0000000 13.5780000 2.7160000 5.4310000 + 156 156 1 0.0000000 13.5780000 0.0000000 8.1460000 + 157 157 1 0.0000000 14.9350000 1.3580000 9.5040000 + 158 158 1 0.0000000 12.2200000 1.3580000 6.7890000 + 159 159 1 0.0000000 12.2200000 4.0730000 9.5040000 + 160 160 1 0.0000000 14.9350000 4.0730000 6.7890000 + 161 161 1 0.0000000 10.8620000 0.0000000 10.8620000 + 162 162 1 0.0000000 10.8620000 2.7160000 13.5780000 + 163 163 1 0.0000000 13.5780000 2.7160000 10.8620000 + 164 164 1 0.0000000 13.5780000 0.0000000 13.5780000 + 165 165 1 0.0000000 14.9350000 1.3580000 14.9350000 + 166 166 1 0.0000000 12.2200000 1.3580000 12.2200000 + 167 167 1 0.0000000 12.2200000 4.0730000 14.9350000 + 168 168 1 0.0000000 14.9350000 4.0730000 12.2200000 + 169 169 1 0.0000000 10.8620000 5.4310000 0.0000000 + 170 170 1 0.0000000 10.8620000 8.1460000 2.7160000 + 171 171 1 0.0000000 13.5780000 8.1460000 0.0000000 + 172 172 1 0.0000000 13.5780000 5.4310000 2.7160000 + 173 173 1 0.0000000 14.9350000 6.7890000 4.0730000 + 174 174 1 0.0000000 12.2200000 6.7890000 1.3580000 + 175 175 1 0.0000000 12.2200000 9.5040000 4.0730000 + 176 176 1 0.0000000 14.9350000 9.5040000 1.3580000 + 177 177 1 0.0000000 10.8620000 5.4310000 5.4310000 + 178 178 1 0.0000000 10.8620000 8.1460000 8.1460000 + 179 179 1 0.0000000 13.5780000 8.1460000 5.4310000 + 180 180 1 0.0000000 13.5780000 5.4310000 8.1460000 + 181 181 1 0.0000000 14.9350000 6.7890000 9.5040000 + 182 182 1 0.0000000 12.2200000 6.7890000 6.7890000 + 183 183 1 0.0000000 12.2200000 9.5040000 9.5040000 + 184 184 1 0.0000000 14.9350000 9.5040000 6.7890000 + 185 185 1 0.0000000 10.8620000 5.4310000 10.8620000 + 186 186 1 0.0000000 10.8620000 8.1460000 13.5780000 + 187 187 1 0.0000000 13.5780000 8.1460000 10.8620000 + 188 188 1 0.0000000 13.5780000 5.4310000 13.5780000 + 189 189 1 0.0000000 14.9350000 6.7890000 14.9350000 + 190 190 1 0.0000000 12.2200000 6.7890000 12.2200000 + 191 191 1 0.0000000 12.2200000 9.5040000 14.9350000 + 192 192 1 0.0000000 14.9350000 9.5040000 12.2200000 + 193 193 1 0.0000000 10.8620000 10.8620000 0.0000000 + 194 194 1 0.0000000 10.8620000 13.5780000 2.7160000 + 195 195 1 0.0000000 13.5780000 13.5780000 0.0000000 + 196 196 1 0.0000000 13.5780000 10.8620000 2.7160000 + 197 197 1 0.0000000 14.9350000 12.2200000 4.0730000 + 198 198 1 0.0000000 12.2200000 12.2200000 1.3580000 + 199 199 1 0.0000000 12.2200000 14.9350000 4.0730000 + 200 200 1 0.0000000 14.9350000 14.9350000 1.3580000 + 201 201 1 0.0000000 10.8620000 10.8620000 5.4310000 + 202 202 1 0.0000000 10.8620000 13.5780000 8.1460000 + 203 203 1 0.0000000 13.5780000 13.5780000 5.4310000 + 204 204 1 0.0000000 13.5780000 10.8620000 8.1460000 + 205 205 1 0.0000000 14.9350000 12.2200000 9.5040000 + 206 206 1 0.0000000 12.2200000 12.2200000 6.7890000 + 207 207 1 0.0000000 12.2200000 14.9350000 9.5040000 + 208 208 1 0.0000000 14.9350000 14.9350000 6.7890000 + 209 209 1 0.0000000 10.8620000 10.8620000 10.8620000 + 210 210 1 0.0000000 10.8620000 13.5780000 13.5780000 + 211 211 1 0.0000000 13.5780000 13.5780000 10.8620000 + 212 212 1 0.0000000 13.5780000 10.8620000 13.5780000 + 213 213 1 0.0000000 14.9350000 12.2200000 14.9350000 + 214 214 1 0.0000000 12.2200000 12.2200000 12.2200000 + 215 215 1 0.0000000 12.2200000 14.9350000 14.9350000 + 216 216 1 0.0000000 14.9350000 14.9350000 12.2200000 + diff --git a/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_512.lmp b/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_512.lmp new file mode 100755 index 0000000000..8c1ecd30bd --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_512.lmp @@ -0,0 +1,534 @@ +LAMMPS description + + 512 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 21.724000 xlo xhi + 0.0000000 21.724000 ylo yhi + 0.0000000 21.724000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 + 2 2 1 0.0000000 0.0000000 2.7150000 2.7150000 + 3 3 1 0.0000000 2.7150000 2.7150000 0.0000000 + 4 4 1 0.0000000 2.7150000 0.0000000 2.7150000 + 5 5 1 0.0000000 4.0730000 1.3580000 4.0730000 + 6 6 1 0.0000000 1.3580000 1.3580000 1.3580000 + 7 7 1 0.0000000 1.3580000 4.0730000 4.0730000 + 8 8 1 0.0000000 4.0730000 4.0730000 1.3580000 + 9 9 1 0.0000000 0.0000000 0.0000000 5.4310000 + 10 10 1 0.0000000 0.0000000 2.7150000 8.1460000 + 11 11 1 0.0000000 2.7150000 2.7150000 5.4310000 + 12 12 1 0.0000000 2.7150000 0.0000000 8.1460000 + 13 13 1 0.0000000 4.0730000 1.3580000 9.5040000 + 14 14 1 0.0000000 1.3580000 1.3580000 6.7890000 + 15 15 1 0.0000000 1.3580000 4.0730000 9.5040000 + 16 16 1 0.0000000 4.0730000 4.0730000 6.7890000 + 17 17 1 0.0000000 0.0000000 0.0000000 10.8620000 + 18 18 1 0.0000000 0.0000000 2.7150000 13.5770000 + 19 19 1 0.0000000 2.7150000 2.7150000 10.8620000 + 20 20 1 0.0000000 2.7150000 0.0000000 13.5770000 + 21 21 1 0.0000000 4.0730000 1.3580000 14.9350000 + 22 22 1 0.0000000 1.3580000 1.3580000 12.2200000 + 23 23 1 0.0000000 1.3580000 4.0730000 14.9350000 + 24 24 1 0.0000000 4.0730000 4.0730000 12.2200000 + 25 25 1 0.0000000 0.0000000 0.0000000 16.2930000 + 26 26 1 0.0000000 0.0000000 2.7150000 19.0080000 + 27 27 1 0.0000000 2.7150000 2.7150000 16.2930000 + 28 28 1 0.0000000 2.7150000 0.0000000 19.0080000 + 29 29 1 0.0000000 4.0730000 1.3580000 20.3660000 + 30 30 1 0.0000000 1.3580000 1.3580000 17.6510000 + 31 31 1 0.0000000 1.3580000 4.0730000 20.3660000 + 32 32 1 0.0000000 4.0730000 4.0730000 17.6510000 + 33 33 1 0.0000000 0.0000000 5.4310000 0.0000000 + 34 34 1 0.0000000 0.0000000 8.1460000 2.7150000 + 35 35 1 0.0000000 2.7150000 8.1460000 0.0000000 + 36 36 1 0.0000000 2.7150000 5.4310000 2.7150000 + 37 37 1 0.0000000 4.0730000 6.7890000 4.0730000 + 38 38 1 0.0000000 1.3580000 6.7890000 1.3580000 + 39 39 1 0.0000000 1.3580000 9.5040000 4.0730000 + 40 40 1 0.0000000 4.0730000 9.5040000 1.3580000 + 41 41 1 0.0000000 0.0000000 5.4310000 5.4310000 + 42 42 1 0.0000000 0.0000000 8.1460000 8.1460000 + 43 43 1 0.0000000 2.7150000 8.1460000 5.4310000 + 44 44 1 0.0000000 2.7150000 5.4310000 8.1460000 + 45 45 1 0.0000000 4.0730000 6.7890000 9.5040000 + 46 46 1 0.0000000 1.3580000 6.7890000 6.7890000 + 47 47 1 0.0000000 1.3580000 9.5040000 9.5040000 + 48 48 1 0.0000000 4.0730000 9.5040000 6.7890000 + 49 49 1 0.0000000 0.0000000 5.4310000 10.8620000 + 50 50 1 0.0000000 0.0000000 8.1460000 13.5770000 + 51 51 1 0.0000000 2.7150000 8.1460000 10.8620000 + 52 52 1 0.0000000 2.7150000 5.4310000 13.5770000 + 53 53 1 0.0000000 4.0730000 6.7890000 14.9350000 + 54 54 1 0.0000000 1.3580000 6.7890000 12.2200000 + 55 55 1 0.0000000 1.3580000 9.5040000 14.9350000 + 56 56 1 0.0000000 4.0730000 9.5040000 12.2200000 + 57 57 1 0.0000000 0.0000000 5.4310000 16.2930000 + 58 58 1 0.0000000 0.0000000 8.1460000 19.0080000 + 59 59 1 0.0000000 2.7150000 8.1460000 16.2930000 + 60 60 1 0.0000000 2.7150000 5.4310000 19.0080000 + 61 61 1 0.0000000 4.0730000 6.7890000 20.3660000 + 62 62 1 0.0000000 1.3580000 6.7890000 17.6510000 + 63 63 1 0.0000000 1.3580000 9.5040000 20.3660000 + 64 64 1 0.0000000 4.0730000 9.5040000 17.6510000 + 65 65 1 0.0000000 0.0000000 10.8620000 0.0000000 + 66 66 1 0.0000000 0.0000000 13.5770000 2.7150000 + 67 67 1 0.0000000 2.7150000 13.5770000 0.0000000 + 68 68 1 0.0000000 2.7150000 10.8620000 2.7150000 + 69 69 1 0.0000000 4.0730000 12.2200000 4.0730000 + 70 70 1 0.0000000 1.3580000 12.2200000 1.3580000 + 71 71 1 0.0000000 1.3580000 14.9350000 4.0730000 + 72 72 1 0.0000000 4.0730000 14.9350000 1.3580000 + 73 73 1 0.0000000 0.0000000 10.8620000 5.4310000 + 74 74 1 0.0000000 0.0000000 13.5770000 8.1460000 + 75 75 1 0.0000000 2.7150000 13.5770000 5.4310000 + 76 76 1 0.0000000 2.7150000 10.8620000 8.1460000 + 77 77 1 0.0000000 4.0730000 12.2200000 9.5040000 + 78 78 1 0.0000000 1.3580000 12.2200000 6.7890000 + 79 79 1 0.0000000 1.3580000 14.9350000 9.5040000 + 80 80 1 0.0000000 4.0730000 14.9350000 6.7890000 + 81 81 1 0.0000000 0.0000000 10.8620000 10.8620000 + 82 82 1 0.0000000 0.0000000 13.5770000 13.5770000 + 83 83 1 0.0000000 2.7150000 13.5770000 10.8620000 + 84 84 1 0.0000000 2.7150000 10.8620000 13.5770000 + 85 85 1 0.0000000 4.0730000 12.2200000 14.9350000 + 86 86 1 0.0000000 1.3580000 12.2200000 12.2200000 + 87 87 1 0.0000000 1.3580000 14.9350000 14.9350000 + 88 88 1 0.0000000 4.0730000 14.9350000 12.2200000 + 89 89 1 0.0000000 0.0000000 10.8620000 16.2930000 + 90 90 1 0.0000000 0.0000000 13.5770000 19.0080000 + 91 91 1 0.0000000 2.7150000 13.5770000 16.2930000 + 92 92 1 0.0000000 2.7150000 10.8620000 19.0080000 + 93 93 1 0.0000000 4.0730000 12.2200000 20.3660000 + 94 94 1 0.0000000 1.3580000 12.2200000 17.6510000 + 95 95 1 0.0000000 1.3580000 14.9350000 20.3660000 + 96 96 1 0.0000000 4.0730000 14.9350000 17.6510000 + 97 97 1 0.0000000 0.0000000 16.2930000 0.0000000 + 98 98 1 0.0000000 0.0000000 19.0080000 2.7150000 + 99 99 1 0.0000000 2.7150000 19.0080000 0.0000000 + 100 100 1 0.0000000 2.7150000 16.2930000 2.7150000 + 101 101 1 0.0000000 4.0730000 17.6510000 4.0730000 + 102 102 1 0.0000000 1.3580000 17.6510000 1.3580000 + 103 103 1 0.0000000 1.3580000 20.3660000 4.0730000 + 104 104 1 0.0000000 4.0730000 20.3660000 1.3580000 + 105 105 1 0.0000000 0.0000000 16.2930000 5.4310000 + 106 106 1 0.0000000 0.0000000 19.0080000 8.1460000 + 107 107 1 0.0000000 2.7150000 19.0080000 5.4310000 + 108 108 1 0.0000000 2.7150000 16.2930000 8.1460000 + 109 109 1 0.0000000 4.0730000 17.6510000 9.5040000 + 110 110 1 0.0000000 1.3580000 17.6510000 6.7890000 + 111 111 1 0.0000000 1.3580000 20.3660000 9.5040000 + 112 112 1 0.0000000 4.0730000 20.3660000 6.7890000 + 113 113 1 0.0000000 0.0000000 16.2930000 10.8620000 + 114 114 1 0.0000000 0.0000000 19.0080000 13.5770000 + 115 115 1 0.0000000 2.7150000 19.0080000 10.8620000 + 116 116 1 0.0000000 2.7150000 16.2930000 13.5770000 + 117 117 1 0.0000000 4.0730000 17.6510000 14.9350000 + 118 118 1 0.0000000 1.3580000 17.6510000 12.2200000 + 119 119 1 0.0000000 1.3580000 20.3660000 14.9350000 + 120 120 1 0.0000000 4.0730000 20.3660000 12.2200000 + 121 121 1 0.0000000 0.0000000 16.2930000 16.2930000 + 122 122 1 0.0000000 0.0000000 19.0080000 19.0080000 + 123 123 1 0.0000000 2.7150000 19.0080000 16.2930000 + 124 124 1 0.0000000 2.7150000 16.2930000 19.0080000 + 125 125 1 0.0000000 4.0730000 17.6510000 20.3660000 + 126 126 1 0.0000000 1.3580000 17.6510000 17.6510000 + 127 127 1 0.0000000 1.3580000 20.3660000 20.3660000 + 128 128 1 0.0000000 4.0730000 20.3660000 17.6510000 + 129 129 1 0.0000000 5.4310000 0.0000000 0.0000000 + 130 130 1 0.0000000 5.4310000 2.7150000 2.7150000 + 131 131 1 0.0000000 8.1460000 2.7150000 0.0000000 + 132 132 1 0.0000000 8.1460000 0.0000000 2.7150000 + 133 133 1 0.0000000 9.5040000 1.3580000 4.0730000 + 134 134 1 0.0000000 6.7890000 1.3580000 1.3580000 + 135 135 1 0.0000000 6.7890000 4.0730000 4.0730000 + 136 136 1 0.0000000 9.5040000 4.0730000 1.3580000 + 137 137 1 0.0000000 5.4310000 0.0000000 5.4310000 + 138 138 1 0.0000000 5.4310000 2.7150000 8.1460000 + 139 139 1 0.0000000 8.1460000 2.7150000 5.4310000 + 140 140 1 0.0000000 8.1460000 0.0000000 8.1460000 + 141 141 1 0.0000000 9.5040000 1.3580000 9.5040000 + 142 142 1 0.0000000 6.7890000 1.3580000 6.7890000 + 143 143 1 0.0000000 6.7890000 4.0730000 9.5040000 + 144 144 1 0.0000000 9.5040000 4.0730000 6.7890000 + 145 145 1 0.0000000 5.4310000 0.0000000 10.8620000 + 146 146 1 0.0000000 5.4310000 2.7150000 13.5770000 + 147 147 1 0.0000000 8.1460000 2.7150000 10.8620000 + 148 148 1 0.0000000 8.1460000 0.0000000 13.5770000 + 149 149 1 0.0000000 9.5040000 1.3580000 14.9350000 + 150 150 1 0.0000000 6.7890000 1.3580000 12.2200000 + 151 151 1 0.0000000 6.7890000 4.0730000 14.9350000 + 152 152 1 0.0000000 9.5040000 4.0730000 12.2200000 + 153 153 1 0.0000000 5.4310000 0.0000000 16.2930000 + 154 154 1 0.0000000 5.4310000 2.7150000 19.0080000 + 155 155 1 0.0000000 8.1460000 2.7150000 16.2930000 + 156 156 1 0.0000000 8.1460000 0.0000000 19.0080000 + 157 157 1 0.0000000 9.5040000 1.3580000 20.3660000 + 158 158 1 0.0000000 6.7890000 1.3580000 17.6510000 + 159 159 1 0.0000000 6.7890000 4.0730000 20.3660000 + 160 160 1 0.0000000 9.5040000 4.0730000 17.6510000 + 161 161 1 0.0000000 5.4310000 5.4310000 0.0000000 + 162 162 1 0.0000000 5.4310000 8.1460000 2.7150000 + 163 163 1 0.0000000 8.1460000 8.1460000 0.0000000 + 164 164 1 0.0000000 8.1460000 5.4310000 2.7150000 + 165 165 1 0.0000000 9.5040000 6.7890000 4.0730000 + 166 166 1 0.0000000 6.7890000 6.7890000 1.3580000 + 167 167 1 0.0000000 6.7890000 9.5040000 4.0730000 + 168 168 1 0.0000000 9.5040000 9.5040000 1.3580000 + 169 169 1 0.0000000 5.4310000 5.4310000 5.4310000 + 170 170 1 0.0000000 5.4310000 8.1460000 8.1460000 + 171 171 1 0.0000000 8.1460000 8.1460000 5.4310000 + 172 172 1 0.0000000 8.1460000 5.4310000 8.1460000 + 173 173 1 0.0000000 9.5040000 6.7890000 9.5040000 + 174 174 1 0.0000000 6.7890000 6.7890000 6.7890000 + 175 175 1 0.0000000 6.7890000 9.5040000 9.5040000 + 176 176 1 0.0000000 9.5040000 9.5040000 6.7890000 + 177 177 1 0.0000000 5.4310000 5.4310000 10.8620000 + 178 178 1 0.0000000 5.4310000 8.1460000 13.5770000 + 179 179 1 0.0000000 8.1460000 8.1460000 10.8620000 + 180 180 1 0.0000000 8.1460000 5.4310000 13.5770000 + 181 181 1 0.0000000 9.5040000 6.7890000 14.9350000 + 182 182 1 0.0000000 6.7890000 6.7890000 12.2200000 + 183 183 1 0.0000000 6.7890000 9.5040000 14.9350000 + 184 184 1 0.0000000 9.5040000 9.5040000 12.2200000 + 185 185 1 0.0000000 5.4310000 5.4310000 16.2930000 + 186 186 1 0.0000000 5.4310000 8.1460000 19.0080000 + 187 187 1 0.0000000 8.1460000 8.1460000 16.2930000 + 188 188 1 0.0000000 8.1460000 5.4310000 19.0080000 + 189 189 1 0.0000000 9.5040000 6.7890000 20.3660000 + 190 190 1 0.0000000 6.7890000 6.7890000 17.6510000 + 191 191 1 0.0000000 6.7890000 9.5040000 20.3660000 + 192 192 1 0.0000000 9.5040000 9.5040000 17.6510000 + 193 193 1 0.0000000 5.4310000 10.8620000 0.0000000 + 194 194 1 0.0000000 5.4310000 13.5770000 2.7150000 + 195 195 1 0.0000000 8.1460000 13.5770000 0.0000000 + 196 196 1 0.0000000 8.1460000 10.8620000 2.7150000 + 197 197 1 0.0000000 9.5040000 12.2200000 4.0730000 + 198 198 1 0.0000000 6.7890000 12.2200000 1.3580000 + 199 199 1 0.0000000 6.7890000 14.9350000 4.0730000 + 200 200 1 0.0000000 9.5040000 14.9350000 1.3580000 + 201 201 1 0.0000000 5.4310000 10.8620000 5.4310000 + 202 202 1 0.0000000 5.4310000 13.5770000 8.1460000 + 203 203 1 0.0000000 8.1460000 13.5770000 5.4310000 + 204 204 1 0.0000000 8.1460000 10.8620000 8.1460000 + 205 205 1 0.0000000 9.5040000 12.2200000 9.5040000 + 206 206 1 0.0000000 6.7890000 12.2200000 6.7890000 + 207 207 1 0.0000000 6.7890000 14.9350000 9.5040000 + 208 208 1 0.0000000 9.5040000 14.9350000 6.7890000 + 209 209 1 0.0000000 5.4310000 10.8620000 10.8620000 + 210 210 1 0.0000000 5.4310000 13.5770000 13.5770000 + 211 211 1 0.0000000 8.1460000 13.5770000 10.8620000 + 212 212 1 0.0000000 8.1460000 10.8620000 13.5770000 + 213 213 1 0.0000000 9.5040000 12.2200000 14.9350000 + 214 214 1 0.0000000 6.7890000 12.2200000 12.2200000 + 215 215 1 0.0000000 6.7890000 14.9350000 14.9350000 + 216 216 1 0.0000000 9.5040000 14.9350000 12.2200000 + 217 217 1 0.0000000 5.4310000 10.8620000 16.2930000 + 218 218 1 0.0000000 5.4310000 13.5770000 19.0080000 + 219 219 1 0.0000000 8.1460000 13.5770000 16.2930000 + 220 220 1 0.0000000 8.1460000 10.8620000 19.0080000 + 221 221 1 0.0000000 9.5040000 12.2200000 20.3660000 + 222 222 1 0.0000000 6.7890000 12.2200000 17.6510000 + 223 223 1 0.0000000 6.7890000 14.9350000 20.3660000 + 224 224 1 0.0000000 9.5040000 14.9350000 17.6510000 + 225 225 1 0.0000000 5.4310000 16.2930000 0.0000000 + 226 226 1 0.0000000 5.4310000 19.0080000 2.7150000 + 227 227 1 0.0000000 8.1460000 19.0080000 0.0000000 + 228 228 1 0.0000000 8.1460000 16.2930000 2.7150000 + 229 229 1 0.0000000 9.5040000 17.6510000 4.0730000 + 230 230 1 0.0000000 6.7890000 17.6510000 1.3580000 + 231 231 1 0.0000000 6.7890000 20.3660000 4.0730000 + 232 232 1 0.0000000 9.5040000 20.3660000 1.3580000 + 233 233 1 0.0000000 5.4310000 16.2930000 5.4310000 + 234 234 1 0.0000000 5.4310000 19.0080000 8.1460000 + 235 235 1 0.0000000 8.1460000 19.0080000 5.4310000 + 236 236 1 0.0000000 8.1460000 16.2930000 8.1460000 + 237 237 1 0.0000000 9.5040000 17.6510000 9.5040000 + 238 238 1 0.0000000 6.7890000 17.6510000 6.7890000 + 239 239 1 0.0000000 6.7890000 20.3660000 9.5040000 + 240 240 1 0.0000000 9.5040000 20.3660000 6.7890000 + 241 241 1 0.0000000 5.4310000 16.2930000 10.8620000 + 242 242 1 0.0000000 5.4310000 19.0080000 13.5770000 + 243 243 1 0.0000000 8.1460000 19.0080000 10.8620000 + 244 244 1 0.0000000 8.1460000 16.2930000 13.5770000 + 245 245 1 0.0000000 9.5040000 17.6510000 14.9350000 + 246 246 1 0.0000000 6.7890000 17.6510000 12.2200000 + 247 247 1 0.0000000 6.7890000 20.3660000 14.9350000 + 248 248 1 0.0000000 9.5040000 20.3660000 12.2200000 + 249 249 1 0.0000000 5.4310000 16.2930000 16.2930000 + 250 250 1 0.0000000 5.4310000 19.0080000 19.0080000 + 251 251 1 0.0000000 8.1460000 19.0080000 16.2930000 + 252 252 1 0.0000000 8.1460000 16.2930000 19.0080000 + 253 253 1 0.0000000 9.5040000 17.6510000 20.3660000 + 254 254 1 0.0000000 6.7890000 17.6510000 17.6510000 + 255 255 1 0.0000000 6.7890000 20.3660000 20.3660000 + 256 256 1 0.0000000 9.5040000 20.3660000 17.6510000 + 257 257 1 0.0000000 10.8620000 0.0000000 0.0000000 + 258 258 1 0.0000000 10.8620000 2.7150000 2.7150000 + 259 259 1 0.0000000 13.5770000 2.7150000 0.0000000 + 260 260 1 0.0000000 13.5770000 0.0000000 2.7150000 + 261 261 1 0.0000000 14.9350000 1.3580000 4.0730000 + 262 262 1 0.0000000 12.2200000 1.3580000 1.3580000 + 263 263 1 0.0000000 12.2200000 4.0730000 4.0730000 + 264 264 1 0.0000000 14.9350000 4.0730000 1.3580000 + 265 265 1 0.0000000 10.8620000 0.0000000 5.4310000 + 266 266 1 0.0000000 10.8620000 2.7150000 8.1460000 + 267 267 1 0.0000000 13.5770000 2.7150000 5.4310000 + 268 268 1 0.0000000 13.5770000 0.0000000 8.1460000 + 269 269 1 0.0000000 14.9350000 1.3580000 9.5040000 + 270 270 1 0.0000000 12.2200000 1.3580000 6.7890000 + 271 271 1 0.0000000 12.2200000 4.0730000 9.5040000 + 272 272 1 0.0000000 14.9350000 4.0730000 6.7890000 + 273 273 1 0.0000000 10.8620000 0.0000000 10.8620000 + 274 274 1 0.0000000 10.8620000 2.7150000 13.5770000 + 275 275 1 0.0000000 13.5770000 2.7150000 10.8620000 + 276 276 1 0.0000000 13.5770000 0.0000000 13.5770000 + 277 277 1 0.0000000 14.9350000 1.3580000 14.9350000 + 278 278 1 0.0000000 12.2200000 1.3580000 12.2200000 + 279 279 1 0.0000000 12.2200000 4.0730000 14.9350000 + 280 280 1 0.0000000 14.9350000 4.0730000 12.2200000 + 281 281 1 0.0000000 10.8620000 0.0000000 16.2930000 + 282 282 1 0.0000000 10.8620000 2.7150000 19.0080000 + 283 283 1 0.0000000 13.5770000 2.7150000 16.2930000 + 284 284 1 0.0000000 13.5770000 0.0000000 19.0080000 + 285 285 1 0.0000000 14.9350000 1.3580000 20.3660000 + 286 286 1 0.0000000 12.2200000 1.3580000 17.6510000 + 287 287 1 0.0000000 12.2200000 4.0730000 20.3660000 + 288 288 1 0.0000000 14.9350000 4.0730000 17.6510000 + 289 289 1 0.0000000 10.8620000 5.4310000 0.0000000 + 290 290 1 0.0000000 10.8620000 8.1460000 2.7150000 + 291 291 1 0.0000000 13.5770000 8.1460000 0.0000000 + 292 292 1 0.0000000 13.5770000 5.4310000 2.7150000 + 293 293 1 0.0000000 14.9350000 6.7890000 4.0730000 + 294 294 1 0.0000000 12.2200000 6.7890000 1.3580000 + 295 295 1 0.0000000 12.2200000 9.5040000 4.0730000 + 296 296 1 0.0000000 14.9350000 9.5040000 1.3580000 + 297 297 1 0.0000000 10.8620000 5.4310000 5.4310000 + 298 298 1 0.0000000 10.8620000 8.1460000 8.1460000 + 299 299 1 0.0000000 13.5770000 8.1460000 5.4310000 + 300 300 1 0.0000000 13.5770000 5.4310000 8.1460000 + 301 301 1 0.0000000 14.9350000 6.7890000 9.5040000 + 302 302 1 0.0000000 12.2200000 6.7890000 6.7890000 + 303 303 1 0.0000000 12.2200000 9.5040000 9.5040000 + 304 304 1 0.0000000 14.9350000 9.5040000 6.7890000 + 305 305 1 0.0000000 10.8620000 5.4310000 10.8620000 + 306 306 1 0.0000000 10.8620000 8.1460000 13.5770000 + 307 307 1 0.0000000 13.5770000 8.1460000 10.8620000 + 308 308 1 0.0000000 13.5770000 5.4310000 13.5770000 + 309 309 1 0.0000000 14.9350000 6.7890000 14.9350000 + 310 310 1 0.0000000 12.2200000 6.7890000 12.2200000 + 311 311 1 0.0000000 12.2200000 9.5040000 14.9350000 + 312 312 1 0.0000000 14.9350000 9.5040000 12.2200000 + 313 313 1 0.0000000 10.8620000 5.4310000 16.2930000 + 314 314 1 0.0000000 10.8620000 8.1460000 19.0080000 + 315 315 1 0.0000000 13.5770000 8.1460000 16.2930000 + 316 316 1 0.0000000 13.5770000 5.4310000 19.0080000 + 317 317 1 0.0000000 14.9350000 6.7890000 20.3660000 + 318 318 1 0.0000000 12.2200000 6.7890000 17.6510000 + 319 319 1 0.0000000 12.2200000 9.5040000 20.3660000 + 320 320 1 0.0000000 14.9350000 9.5040000 17.6510000 + 321 321 1 0.0000000 10.8620000 10.8620000 0.0000000 + 322 322 1 0.0000000 10.8620000 13.5770000 2.7150000 + 323 323 1 0.0000000 13.5770000 13.5770000 0.0000000 + 324 324 1 0.0000000 13.5770000 10.8620000 2.7150000 + 325 325 1 0.0000000 14.9350000 12.2200000 4.0730000 + 326 326 1 0.0000000 12.2200000 12.2200000 1.3580000 + 327 327 1 0.0000000 12.2200000 14.9350000 4.0730000 + 328 328 1 0.0000000 14.9350000 14.9350000 1.3580000 + 329 329 1 0.0000000 10.8620000 10.8620000 5.4310000 + 330 330 1 0.0000000 10.8620000 13.5770000 8.1460000 + 331 331 1 0.0000000 13.5770000 13.5770000 5.4310000 + 332 332 1 0.0000000 13.5770000 10.8620000 8.1460000 + 333 333 1 0.0000000 14.9350000 12.2200000 9.5040000 + 334 334 1 0.0000000 12.2200000 12.2200000 6.7890000 + 335 335 1 0.0000000 12.2200000 14.9350000 9.5040000 + 336 336 1 0.0000000 14.9350000 14.9350000 6.7890000 + 337 337 1 0.0000000 10.8620000 10.8620000 10.8620000 + 338 338 1 0.0000000 10.8620000 13.5770000 13.5770000 + 339 339 1 0.0000000 13.5770000 13.5770000 10.8620000 + 340 340 1 0.0000000 13.5770000 10.8620000 13.5770000 + 341 341 1 0.0000000 14.9350000 12.2200000 14.9350000 + 342 342 1 0.0000000 12.2200000 12.2200000 12.2200000 + 343 343 1 0.0000000 12.2200000 14.9350000 14.9350000 + 344 344 1 0.0000000 14.9350000 14.9350000 12.2200000 + 345 345 1 0.0000000 10.8620000 10.8620000 16.2930000 + 346 346 1 0.0000000 10.8620000 13.5770000 19.0080000 + 347 347 1 0.0000000 13.5770000 13.5770000 16.2930000 + 348 348 1 0.0000000 13.5770000 10.8620000 19.0080000 + 349 349 1 0.0000000 14.9350000 12.2200000 20.3660000 + 350 350 1 0.0000000 12.2200000 12.2200000 17.6510000 + 351 351 1 0.0000000 12.2200000 14.9350000 20.3660000 + 352 352 1 0.0000000 14.9350000 14.9350000 17.6510000 + 353 353 1 0.0000000 10.8620000 16.2930000 0.0000000 + 354 354 1 0.0000000 10.8620000 19.0080000 2.7150000 + 355 355 1 0.0000000 13.5770000 19.0080000 0.0000000 + 356 356 1 0.0000000 13.5770000 16.2930000 2.7150000 + 357 357 1 0.0000000 14.9350000 17.6510000 4.0730000 + 358 358 1 0.0000000 12.2200000 17.6510000 1.3580000 + 359 359 1 0.0000000 12.2200000 20.3660000 4.0730000 + 360 360 1 0.0000000 14.9350000 20.3660000 1.3580000 + 361 361 1 0.0000000 10.8620000 16.2930000 5.4310000 + 362 362 1 0.0000000 10.8620000 19.0080000 8.1460000 + 363 363 1 0.0000000 13.5770000 19.0080000 5.4310000 + 364 364 1 0.0000000 13.5770000 16.2930000 8.1460000 + 365 365 1 0.0000000 14.9350000 17.6510000 9.5040000 + 366 366 1 0.0000000 12.2200000 17.6510000 6.7890000 + 367 367 1 0.0000000 12.2200000 20.3660000 9.5040000 + 368 368 1 0.0000000 14.9350000 20.3660000 6.7890000 + 369 369 1 0.0000000 10.8620000 16.2930000 10.8620000 + 370 370 1 0.0000000 10.8620000 19.0080000 13.5770000 + 371 371 1 0.0000000 13.5770000 19.0080000 10.8620000 + 372 372 1 0.0000000 13.5770000 16.2930000 13.5770000 + 373 373 1 0.0000000 14.9350000 17.6510000 14.9350000 + 374 374 1 0.0000000 12.2200000 17.6510000 12.2200000 + 375 375 1 0.0000000 12.2200000 20.3660000 14.9350000 + 376 376 1 0.0000000 14.9350000 20.3660000 12.2200000 + 377 377 1 0.0000000 10.8620000 16.2930000 16.2930000 + 378 378 1 0.0000000 10.8620000 19.0080000 19.0080000 + 379 379 1 0.0000000 13.5770000 19.0080000 16.2930000 + 380 380 1 0.0000000 13.5770000 16.2930000 19.0080000 + 381 381 1 0.0000000 14.9350000 17.6510000 20.3660000 + 382 382 1 0.0000000 12.2200000 17.6510000 17.6510000 + 383 383 1 0.0000000 12.2200000 20.3660000 20.3660000 + 384 384 1 0.0000000 14.9350000 20.3660000 17.6510000 + 385 385 1 0.0000000 16.2930000 0.0000000 0.0000000 + 386 386 1 0.0000000 16.2930000 2.7150000 2.7150000 + 387 387 1 0.0000000 19.0080000 2.7150000 0.0000000 + 388 388 1 0.0000000 19.0080000 0.0000000 2.7150000 + 389 389 1 0.0000000 20.3660000 1.3580000 4.0730000 + 390 390 1 0.0000000 17.6510000 1.3580000 1.3580000 + 391 391 1 0.0000000 17.6510000 4.0730000 4.0730000 + 392 392 1 0.0000000 20.3660000 4.0730000 1.3580000 + 393 393 1 0.0000000 16.2930000 0.0000000 5.4310000 + 394 394 1 0.0000000 16.2930000 2.7150000 8.1460000 + 395 395 1 0.0000000 19.0080000 2.7150000 5.4310000 + 396 396 1 0.0000000 19.0080000 0.0000000 8.1460000 + 397 397 1 0.0000000 20.3660000 1.3580000 9.5040000 + 398 398 1 0.0000000 17.6510000 1.3580000 6.7890000 + 399 399 1 0.0000000 17.6510000 4.0730000 9.5040000 + 400 400 1 0.0000000 20.3660000 4.0730000 6.7890000 + 401 401 1 0.0000000 16.2930000 0.0000000 10.8620000 + 402 402 1 0.0000000 16.2930000 2.7150000 13.5770000 + 403 403 1 0.0000000 19.0080000 2.7150000 10.8620000 + 404 404 1 0.0000000 19.0080000 0.0000000 13.5770000 + 405 405 1 0.0000000 20.3660000 1.3580000 14.9350000 + 406 406 1 0.0000000 17.6510000 1.3580000 12.2200000 + 407 407 1 0.0000000 17.6510000 4.0730000 14.9350000 + 408 408 1 0.0000000 20.3660000 4.0730000 12.2200000 + 409 409 1 0.0000000 16.2930000 0.0000000 16.2930000 + 410 410 1 0.0000000 16.2930000 2.7150000 19.0080000 + 411 411 1 0.0000000 19.0080000 2.7150000 16.2930000 + 412 412 1 0.0000000 19.0080000 0.0000000 19.0080000 + 413 413 1 0.0000000 20.3660000 1.3580000 20.3660000 + 414 414 1 0.0000000 17.6510000 1.3580000 17.6510000 + 415 415 1 0.0000000 17.6510000 4.0730000 20.3660000 + 416 416 1 0.0000000 20.3660000 4.0730000 17.6510000 + 417 417 1 0.0000000 16.2930000 5.4310000 0.0000000 + 418 418 1 0.0000000 16.2930000 8.1460000 2.7150000 + 419 419 1 0.0000000 19.0080000 8.1460000 0.0000000 + 420 420 1 0.0000000 19.0080000 5.4310000 2.7150000 + 421 421 1 0.0000000 20.3660000 6.7890000 4.0730000 + 422 422 1 0.0000000 17.6510000 6.7890000 1.3580000 + 423 423 1 0.0000000 17.6510000 9.5040000 4.0730000 + 424 424 1 0.0000000 20.3660000 9.5040000 1.3580000 + 425 425 1 0.0000000 16.2930000 5.4310000 5.4310000 + 426 426 1 0.0000000 16.2930000 8.1460000 8.1460000 + 427 427 1 0.0000000 19.0080000 8.1460000 5.4310000 + 428 428 1 0.0000000 19.0080000 5.4310000 8.1460000 + 429 429 1 0.0000000 20.3660000 6.7890000 9.5040000 + 430 430 1 0.0000000 17.6510000 6.7890000 6.7890000 + 431 431 1 0.0000000 17.6510000 9.5040000 9.5040000 + 432 432 1 0.0000000 20.3660000 9.5040000 6.7890000 + 433 433 1 0.0000000 16.2930000 5.4310000 10.8620000 + 434 434 1 0.0000000 16.2930000 8.1460000 13.5770000 + 435 435 1 0.0000000 19.0080000 8.1460000 10.8620000 + 436 436 1 0.0000000 19.0080000 5.4310000 13.5770000 + 437 437 1 0.0000000 20.3660000 6.7890000 14.9350000 + 438 438 1 0.0000000 17.6510000 6.7890000 12.2200000 + 439 439 1 0.0000000 17.6510000 9.5040000 14.9350000 + 440 440 1 0.0000000 20.3660000 9.5040000 12.2200000 + 441 441 1 0.0000000 16.2930000 5.4310000 16.2930000 + 442 442 1 0.0000000 16.2930000 8.1460000 19.0080000 + 443 443 1 0.0000000 19.0080000 8.1460000 16.2930000 + 444 444 1 0.0000000 19.0080000 5.4310000 19.0080000 + 445 445 1 0.0000000 20.3660000 6.7890000 20.3660000 + 446 446 1 0.0000000 17.6510000 6.7890000 17.6510000 + 447 447 1 0.0000000 17.6510000 9.5040000 20.3660000 + 448 448 1 0.0000000 20.3660000 9.5040000 17.6510000 + 449 449 1 0.0000000 16.2930000 10.8620000 0.0000000 + 450 450 1 0.0000000 16.2930000 13.5770000 2.7150000 + 451 451 1 0.0000000 19.0080000 13.5770000 0.0000000 + 452 452 1 0.0000000 19.0080000 10.8620000 2.7150000 + 453 453 1 0.0000000 20.3660000 12.2200000 4.0730000 + 454 454 1 0.0000000 17.6510000 12.2200000 1.3580000 + 455 455 1 0.0000000 17.6510000 14.9350000 4.0730000 + 456 456 1 0.0000000 20.3660000 14.9350000 1.3580000 + 457 457 1 0.0000000 16.2930000 10.8620000 5.4310000 + 458 458 1 0.0000000 16.2930000 13.5770000 8.1460000 + 459 459 1 0.0000000 19.0080000 13.5770000 5.4310000 + 460 460 1 0.0000000 19.0080000 10.8620000 8.1460000 + 461 461 1 0.0000000 20.3660000 12.2200000 9.5040000 + 462 462 1 0.0000000 17.6510000 12.2200000 6.7890000 + 463 463 1 0.0000000 17.6510000 14.9350000 9.5040000 + 464 464 1 0.0000000 20.3660000 14.9350000 6.7890000 + 465 465 1 0.0000000 16.2930000 10.8620000 10.8620000 + 466 466 1 0.0000000 16.2930000 13.5770000 13.5770000 + 467 467 1 0.0000000 19.0080000 13.5770000 10.8620000 + 468 468 1 0.0000000 19.0080000 10.8620000 13.5770000 + 469 469 1 0.0000000 20.3660000 12.2200000 14.9350000 + 470 470 1 0.0000000 17.6510000 12.2200000 12.2200000 + 471 471 1 0.0000000 17.6510000 14.9350000 14.9350000 + 472 472 1 0.0000000 20.3660000 14.9350000 12.2200000 + 473 473 1 0.0000000 16.2930000 10.8620000 16.2930000 + 474 474 1 0.0000000 16.2930000 13.5770000 19.0080000 + 475 475 1 0.0000000 19.0080000 13.5770000 16.2930000 + 476 476 1 0.0000000 19.0080000 10.8620000 19.0080000 + 477 477 1 0.0000000 20.3660000 12.2200000 20.3660000 + 478 478 1 0.0000000 17.6510000 12.2200000 17.6510000 + 479 479 1 0.0000000 17.6510000 14.9350000 20.3660000 + 480 480 1 0.0000000 20.3660000 14.9350000 17.6510000 + 481 481 1 0.0000000 16.2930000 16.2930000 0.0000000 + 482 482 1 0.0000000 16.2930000 19.0080000 2.7150000 + 483 483 1 0.0000000 19.0080000 19.0080000 0.0000000 + 484 484 1 0.0000000 19.0080000 16.2930000 2.7150000 + 485 485 1 0.0000000 20.3660000 17.6510000 4.0730000 + 486 486 1 0.0000000 17.6510000 17.6510000 1.3580000 + 487 487 1 0.0000000 17.6510000 20.3660000 4.0730000 + 488 488 1 0.0000000 20.3660000 20.3660000 1.3580000 + 489 489 1 0.0000000 16.2930000 16.2930000 5.4310000 + 490 490 1 0.0000000 16.2930000 19.0080000 8.1460000 + 491 491 1 0.0000000 19.0080000 19.0080000 5.4310000 + 492 492 1 0.0000000 19.0080000 16.2930000 8.1460000 + 493 493 1 0.0000000 20.3660000 17.6510000 9.5040000 + 494 494 1 0.0000000 17.6510000 17.6510000 6.7890000 + 495 495 1 0.0000000 17.6510000 20.3660000 9.5040000 + 496 496 1 0.0000000 20.3660000 20.3660000 6.7890000 + 497 497 1 0.0000000 16.2930000 16.2930000 10.8620000 + 498 498 1 0.0000000 16.2930000 19.0080000 13.5770000 + 499 499 1 0.0000000 19.0080000 19.0080000 10.8620000 + 500 500 1 0.0000000 19.0080000 16.2930000 13.5770000 + 501 501 1 0.0000000 20.3660000 17.6510000 14.9350000 + 502 502 1 0.0000000 17.6510000 17.6510000 12.2200000 + 503 503 1 0.0000000 17.6510000 20.3660000 14.9350000 + 504 504 1 0.0000000 20.3660000 20.3660000 12.2200000 + 505 505 1 0.0000000 16.2930000 16.2930000 16.2930000 + 506 506 1 0.0000000 16.2930000 19.0080000 19.0080000 + 507 507 1 0.0000000 19.0080000 19.0080000 16.2930000 + 508 508 1 0.0000000 19.0080000 16.2930000 19.0080000 + 509 509 1 0.0000000 20.3660000 17.6510000 20.3660000 + 510 510 1 0.0000000 17.6510000 17.6510000 17.6510000 + 511 511 1 0.0000000 17.6510000 20.3660000 20.3660000 + 512 512 1 0.0000000 20.3660000 20.3660000 17.6510000 + diff --git a/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_8.lmp b/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_8.lmp new file mode 100755 index 0000000000..5066049895 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_8.lmp @@ -0,0 +1,29 @@ +LAMMPS description + + 8 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 5.4310000 xlo xhi + 0.0000000 5.4310000 ylo yhi + 0.0000000 5.4310000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 + 2 2 1 0.0000000 1.3577500 1.3577500 1.3572000 + 3 3 1 0.0000000 2.7155000 2.7155000 0.0000000 + 4 4 1 0.0000000 4.0732500 4.0732500 1.3572000 + 5 5 1 0.0000000 2.7155000 0.0000000 2.7144000 + 6 6 1 0.0000000 4.0732500 1.3577500 4.0732500 + 7 7 1 0.0000000 0.0000000 2.7155000 2.7155000 + 8 8 1 0.0000000 1.3577500 4.0732500 4.0732500 diff --git a/examples/USER/phonon/dynamical_matrix_command/results/dynmat.dat b/examples/USER/phonon/dynamical_matrix_command/results/dynmat.dat new file mode 100755 index 0000000000..676f897416 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/results/dynmat.dat @@ -0,0 +1,192 @@ +5409.83472486 3.05075234 0.00000214 +-1277.48270695 -863.24917964 -862.95613831 +-193.14095266 0.11071645 0.00000015 +-1277.48270619 -863.24917934 862.95613793 +-193.17613831 0.34066975 -0.00000031 +-1276.01088244 861.54715125 -861.62537402 +83.46959051 -0.09801326 0.00000000 +-1276.01088167 861.54715064 861.62537387 +3.05073556 5409.83419867 0.00000137 +-863.13224993 -1277.34160622 -862.92133430 +0.12865796 -193.14095472 -0.00000023 +-863.13224825 -1277.34160485 862.92133392 +-0.23661028 83.46934214 -0.00000046 +861.66402909 -1276.15172701 861.66024333 +-0.00634065 -193.17585981 -0.00000015 +861.66402909 -1276.15172686 -861.66024394 +0.00000031 0.00000031 5410.11037330 +-862.89766079 -862.97973912 -1277.71823542 +0.00000000 -0.00000008 83.84059083 +862.89766018 862.97973851 -1277.71823557 +0.00000015 0.00000015 -193.17558390 +-861.60900269 861.52691291 -1276.08157137 +-0.00000015 -0.00000031 -193.17573821 +861.60900330 -861.52691284 -1276.08157236 +-1277.48271824 -863.13225435 -862.89768596 +5409.83567916 3.04882502 2.82007861 +-1277.34161080 -863.24919475 862.97975804 +-193.14089260 0.11950100 0.11994134 +-1277.52243157 863.24943259 -863.11331046 +-193.17597070 0.16713301 -0.02106496 +-1274.64156872 859.96385388 860.17328202 +83.46945758 -0.16730525 -0.06100253 +-863.24919444 -1277.34161103 -862.97975804 +3.04882666 5409.83567944 -2.82007731 +-863.13225496 -1277.48271916 862.89768688 +0.11950094 -193.14089255 -0.11994043 +863.24943320 -1277.52243118 863.11331076 +-0.16730522 83.46945778 0.06100314 +859.96385365 -1274.64156819 -860.17328225 +0.16713979 -193.17596607 0.02106008 +-862.95611199 -862.92132598 -1277.71824411 +2.82004085 -2.82004013 5410.11000835 +862.92132743 862.95611344 -1277.71824587 +-0.11994722 0.11994786 83.84083834 +-862.88110757 862.88110699 -1277.34764097 +0.02099713 0.06108924 -193.17561785 +860.25587487 -860.25587502 -1274.81548840 +-0.06108897 -0.02099687 -193.17561808 +-193.14095465 0.12865765 0.00000015 +-1277.34160508 -863.13224794 862.92133361 +5409.83419867 3.05073968 0.00000092 +-1277.34160584 -863.13224924 -862.92133483 +83.46934214 -0.23660998 -0.00000076 +-1276.15172724 861.66402917 861.66024325 +-193.17585988 -0.00634042 -0.00000031 +-1276.15172694 861.66402940 -861.66024325 +0.11071645 -193.14095243 0.00000046 +-863.24917949 -1277.48270718 862.95613831 +3.05075524 5409.83472478 -0.00000046 +-863.24918117 -1277.48270825 -862.95613923 +0.34066922 -193.17613823 0.00000046 +861.54715094 -1276.01088228 -861.62537295 +-0.09801303 83.46959035 0.00000015 +861.54713538 -1276.01088145 861.62537387 +-0.00000046 -0.00000023 83.84059068 +862.97973867 862.89766010 -1277.71823633 +-0.00000214 -0.00000053 5410.11037574 +-862.97973943 -862.89766079 -1277.71823633 +0.00000015 0.00000008 -193.17558374 +861.52691291 -861.60900269 -1276.08157198 +-0.00000015 -0.00000015 -193.17573814 +-861.52691368 861.60900261 -1276.08157243 +-1277.48271786 -863.13225450 862.89768520 +-193.14089232 0.11950085 -0.11994115 +-1277.34161255 -863.24919673 -862.97975957 +5409.83568051 3.04882517 -2.82007644 +-1277.52243110 863.24943259 863.11330990 +83.46945732 -0.16730494 0.06100319 +-1274.64156796 859.96385342 -860.17328103 +-193.17597041 0.16713331 0.02106477 +-863.24919482 -1277.34161057 862.97975774 +0.11950077 -193.14089270 0.11994160 +-863.13225473 -1277.48271839 -862.89768673 +3.04882502 5409.83568081 2.82007903 +863.24943084 -1277.52242966 -863.11330868 +0.16713324 -193.17597064 -0.02106522 +859.96385510 -1274.64156926 860.17328255 +-0.16730411 83.46945641 -0.06100350 +862.95611161 862.92132537 -1277.71824365 +0.11994725 -0.11994740 83.84083859 +-862.92132606 -862.95611207 -1277.71824548 +-2.82003936 2.82004013 5410.11000806 +862.88110509 -862.88110547 -1277.34764015 +0.06108893 0.02099703 -193.17561792 +-860.25587388 860.25587441 -1274.81548916 +-0.02099726 -0.06108878 -193.17561777 +-193.17613465 -0.23660693 0.00000015 +-1277.52241409 863.24943328 -862.88111478 +83.46934549 0.34066334 -0.00000015 +-1277.52241425 863.24943335 862.88111508 +5404.58897235 -9.71806749 0.00000015 +-1273.31333522 -858.38273960 -858.96245956 +-193.21062369 -0.11938368 0.00000000 +-1273.31333598 -858.38273967 858.96245926 +0.34066342 83.46934572 0.00000015 +863.24943335 -1277.52241402 862.88111478 +-0.23660723 -193.17613480 -0.00000046 +863.24943320 -1277.52241425 -862.88111432 +-9.71806582 5404.58897135 -0.00000183 +-858.38273891 -1273.31333552 -858.96245926 +-0.11938338 -193.21062369 0.00000000 +-858.38273937 -1273.31333598 858.96245987 +-0.00000031 -0.00000008 -193.17559595 +-863.11328229 863.11328297 -1277.34763999 +0.00000000 -0.00000015 -193.17559595 +863.11328305 -863.11328282 -1277.34763984 +0.00000122 -0.00000259 5404.30470550 +-858.80486827 -858.80486866 -1273.17865241 +-0.00000031 0.00000000 83.09905870 +858.80486827 858.80486812 -1273.17865272 +-1276.01089136 861.66402482 -861.60900483 +-193.17596134 -0.16730494 0.02099535 +-1276.15175745 861.54714988 861.52691337 +83.46947097 0.16714109 0.06108436 +-1273.31334651 -858.38273311 -858.80488185 +5404.58493608 -3.04507687 -2.81778617 +-1276.19187193 -861.66399965 861.74280750 +-193.21058304 -0.11920641 -0.12012575 +861.54714972 -1276.15175730 861.52691337 +0.16714140 83.46947120 0.06108451 +861.66402345 -1276.01089022 -861.60900330 +-0.16730487 -193.17596164 0.02099489 +-858.38273281 -1273.31334681 -858.80488063 +-3.04507603 5404.58493554 -2.81778617 +-861.66400079 -1276.19187270 861.74280887 +-0.11920511 -193.21058281 -0.12012498 +-861.62536929 861.66025668 -1276.08157121 +-0.02106026 0.06099877 -193.17561197 +861.66025752 -861.62537051 -1276.08157274 +0.06099923 -0.02106049 -193.17561227 +-858.96244980 -858.96244965 -1273.17866523 +-2.81780608 -2.81780615 5404.30474272 +861.58531232 861.58531248 -1275.71087663 +0.12013467 0.12013460 83.09915619 +83.46958166 -0.00634218 -0.00000023 +-1274.64157002 859.96383191 860.25587098 +-193.17585332 -0.09802844 0.00000023 +-1274.64157155 859.96383290 -860.25587243 +-193.21062064 -0.11939070 -0.00000008 +-1276.19189573 -861.66398638 861.58531118 +5404.58377546 3.62403097 0.00000015 +-1276.19189558 -861.66398615 -861.58531103 +-0.09802859 -193.17585355 -0.00000015 +859.96383206 -1274.64156979 -860.25587113 +-0.00634187 83.46958204 -0.00000008 +859.96383282 -1274.64157132 860.25587212 +-0.11939055 -193.21062041 0.00000000 +-861.66398576 -1276.19189528 861.58531087 +3.62402982 5404.58377698 -0.00000076 +-861.66398927 -1276.19189772 -861.58531331 +0.00000000 0.00000000 -193.17573654 +860.17327676 -860.17327637 -1274.81551212 +0.00000031 0.00000023 -193.17573676 +-860.17327615 860.17327645 -1274.81551258 +0.00000000 0.00000015 83.09907327 +861.74281299 861.74281299 -1275.71086763 +-0.00000046 -0.00000015 5404.30514861 +-861.74281406 -861.74281421 -1275.71086938 +-1276.01088968 861.66402284 861.60900330 +83.46947136 0.16714109 -0.06108436 +-1276.15175722 861.54714957 -861.52691391 +-193.17596141 -0.16730510 -0.02099527 +-1273.31334666 -858.38273281 858.80488124 +-193.21058304 -0.11920641 0.12012636 +-1276.19187285 -861.66400087 -861.74280773 +5404.58493638 -3.04507565 2.81778602 +861.54715133 -1276.15175913 -861.52691490 +-0.16730502 -193.17596118 -0.02099497 +861.66402314 -1276.01088976 861.60900383 +0.16714125 83.46947151 -0.06108497 +-858.38273296 -1273.31334681 858.80488139 +-0.11920686 -193.21058311 0.12012605 +-861.66400079 -1276.19187255 -861.74280811 +-3.04506703 5404.58493432 2.81779319 +861.62536952 -861.66025637 -1276.08157175 +-0.06099938 0.02106080 -193.17561235 +-861.66025645 861.62536929 -1276.08157213 +0.02106049 -0.06099862 -193.17561189 +858.96245049 858.96245041 -1273.17866553 +-0.12013444 -0.12013475 83.09915550 +-861.58531232 -861.58531217 -1275.71087655 +2.81780737 2.81780753 5404.30474547 diff --git a/examples/USER/phonon/dynamical_matrix_command/results/out.silicon b/examples/USER/phonon/dynamical_matrix_command/results/out.silicon new file mode 100755 index 0000000000..9920ddac51 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/results/out.silicon @@ -0,0 +1,58 @@ +LAMMPS (16 Jul 2018) +Reading data file ... + orthogonal box = (0 0 0) to (5.431 5.431 5.431) + 1 by 2 by 2 MPI processor grid + reading atoms ... + 8 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4 + ghost atom cutoff = 4 + binsize = 2, bins = 3 3 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair tersoff, perpetual + attributes: full, newton on + pair build: full/bin + stencil: full/bin/3d + bin: standard +Calculating Dynamical Matrix... +Dynamical Matrix calculation took 0.001183 seconds +Finished Calculating Dynamical Matrix +Loop time of 1.22396e+06 on 4 procs for 0 steps with 8 atoms + +0.0% 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.00016781 | 0.00041345 | 0.00051464 | 0.0 | 0.00 +Bond | 1.9255e-06 | 2.1775e-06 | 2.4787e-06 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.00056143 | 0.00066602 | 0.00090865 | 0.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 1.224e+06 | | |100.00 + +Nlocal: 2 ave 3 max 1 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Nghost: 56 ave 57 max 55 min +Histogram: 1 0 0 0 0 2 0 0 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 32 ave 48 max 16 min +Histogram: 1 0 0 0 0 2 0 0 0 1 + +Total # of neighbors = 128 +Ave neighs/atom = 16 +Ave special neighs/atom = 0 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/phonon/dynamical_matrix_command/silicon_input_file.lmp b/examples/USER/phonon/dynamical_matrix_command/silicon_input_file.lmp new file mode 100755 index 0000000000..5066049895 --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/silicon_input_file.lmp @@ -0,0 +1,29 @@ +LAMMPS description + + 8 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 5.4310000 xlo xhi + 0.0000000 5.4310000 ylo yhi + 0.0000000 5.4310000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 + 2 2 1 0.0000000 1.3577500 1.3577500 1.3572000 + 3 3 1 0.0000000 2.7155000 2.7155000 0.0000000 + 4 4 1 0.0000000 4.0732500 4.0732500 1.3572000 + 5 5 1 0.0000000 2.7155000 0.0000000 2.7144000 + 6 6 1 0.0000000 4.0732500 1.3577500 4.0732500 + 7 7 1 0.0000000 0.0000000 2.7155000 2.7155000 + 8 8 1 0.0000000 1.3577500 4.0732500 4.0732500 diff --git a/examples/USER/phonon/third_order_command/Manual.md b/examples/USER/phonon/third_order_command/Manual.md new file mode 100755 index 0000000000..49340cb54d --- /dev/null +++ b/examples/USER/phonon/third_order_command/Manual.md @@ -0,0 +1,48 @@ +# third_order command + +## Syntax + +``` +third_order group-ID style args keyword value ... +``` + +* group-ID = ID of group of atoms to displace +* style = *regular* or *ballistico* +``` +*regular* args = gamma + gamma = finite difference displacement length +*ballistico* args = gamma + gamma = finite difference displacement length +``` +* zero or more keyword/value pairs may be appended +* keyword = *file* or *binary* +``` +*file* value = output_file + output_file = name of file to dump the dynamical matrix into +*binary* values = *no* or *gzip* +``` + +## Examples + +``` +third_order 1 regular 0.000001 +third_order 1 ballistico 0.000001 +third_order 3 regular 0.00004 file third_order.dat +third_order 5 ballistico 0.00000001 file third_order.dat binary gzip +``` + +## Description + +Calculate the finite difference third order tensor of the selected group. + +## Restrictions + +None + +## Related commands + +None + +## Default + +The option defaults are file = "third_order.dat", binary = no diff --git a/examples/USER/phonon/third_order_command/README.md b/examples/USER/phonon/third_order_command/README.md new file mode 100755 index 0000000000..a9604e4575 --- /dev/null +++ b/examples/USER/phonon/third_order_command/README.md @@ -0,0 +1,25 @@ +# LAMMPS LATTICE DYNAMICS COMMANDS + +## THIRD ORDER TENSOR CALCULATOR + +This directory contains the ingredients to calculate a third order tensor. + +Example: +``` +$THIRD_ORDER=third_order #tensor output file +NP=4 #number of processors +mpirun -np $NP lmp_mpi < in.silicon > out.silicon +combine.sh third_order +``` + +To test out a different silicon example: +``` +$THIRD_ORDER=third_order +$LMP_FILE=amorphous_silicon.lmp +cp lmp_bank/$LMP_FILE ./silicon_input_file.lmp +NP=4 #number of processors +mpirun -np $NP lmp_mpi < in.silicon > out.silicon +bash combine.sh $THIRD_ORDER +``` + +## Requires: MANYBODY and MOLECULE packages diff --git a/examples/USER/phonon/third_order_command/Si.opt.tersoff b/examples/USER/phonon/third_order_command/Si.opt.tersoff new file mode 100755 index 0000000000..3bc19f0581 --- /dev/null +++ b/examples/USER/phonon/third_order_command/Si.opt.tersoff @@ -0,0 +1,66 @@ +# Tersoff parameters for various elements and mixtures +# multiple entries can be added to this file, LAMMPS reads the ones it needs +# these entries are in LAMMPS "metal" units: +# A,B = eV; lambda1,lambda2,lambda3 = 1/Angstroms; R,D = Angstroms +# other quantities are unitless + +# Aidan Thompson (athomps at sandia.gov) takes full blame for this +# file. It specifies various potentials published by J. Tersoff for +# silicon, carbon and germanium. Since Tersoff published several +# different silicon potentials, I refer to them using atom types +# Si(B), Si(C) and Si(D). The last two are almost almost identical but +# refer to two different publications. These names should be used in +# the LAMMPS command when the file is invoked. For example: +# pair_coeff * * SiCGe.tersoff Si(B). The Si(D), C and Ge potentials +# can be used pure silicon, pure carbon, pure germanium, binary SiC, +# and binary SiGe, but not binary GeC or ternary SiGeC. LAMMPS will +# generate an error if this file is used with any combination +# involving C and Ge, since there are no entries for the GeC +# interactions (Tersoff did not publish parameters for this +# cross-interaction.) + +# format of a single entry (one or more lines): +# element 1, element 2, element 3, +# m, gamma, lambda3, c, d, costheta0, n, beta, lambda2, B, R, D, lambda1, A + +# The original Tersoff potential for Silicon, Si(B) +# J. Tersoff, PRB, 37, 6991 (1988) + +Si(B) Si(B) Si(B) 3.0 1.0 1.3258 4.8381 2.0417 0.0000 22.956 + 0.33675 1.3258 95.373 3.0 0.2 3.2394 3264.7 + +# The later Tersoff potential for Silicon, Si(C) +# J. Tersoff, PRB, 38, 9902 (1988) + +Si(C) Si(C) Si(C) 3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 + 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8 + +# The later Tersoff potential for Carbon, Silicon, and Germanium +# J. Tersoff, PRB, 39, 5566 (1989) + errata (PRB 41, 3248) +# The Si and C parameters are very close to those in SiC.tersoff + +C C C 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 1.5724e-7 2.2119 346.74 1.95 0.15 3.4879 1393.6 +Si(D) Si(D) Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8 +Ge Ge Ge 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 9.0166e-7 1.7047 419.23 2.95 0.15 2.4451 1769.0 + +C Si(D) Si(D) 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 1.5724e-7 1.97205 395.1451 2.3573 0.1527 2.9839 1597.3111 +C Si(D) C 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 0.0 0.0 0.0 1.95 0.15 0.0 0.0 +C C Si(D) 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 0.0 0.0 0.0 2.3573 0.1527 0.0 0.0 + +Si(D) C C 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.97205 395.1451 2.3573 0.1527 2.9839 1597.3111 +Si(D) Si(D) C 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.3573 0.1527 0.0 0.0 +Si(D) C Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.85 0.15 0.0 0.0 + +Si(D) Ge Ge 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.71845 444.7177 2.8996 0.1500 2.4625 1799.6347 +Si(D) Si(D) Ge 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.8996 0.1500 0.0 0.0 +Si(D) Ge Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.85 0.15 0.0 0.0 + +Ge Si(D) Si(D) 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 9.0166e-7 1.71845 444.7177 2.8996 0.1500 2.4625 1799.6347 +Ge Si(D) Ge 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 0.0 0.0 0.0 2.95 0.15 0.0 0.0 +Ge Ge Si(D) 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 0.0 0.0 0.0 2.8996 0.1500 0.0 0.0 + +# Optimized Tersoff for Carbon: Lindsay and Broido PRB 81, 205441 (2010) +# element 1, element 2, element 3, +# m, gamma, lambda3, c, d, costheta0, n, beta, lambda2, B, R, D, lambda1, A +C(O) C(O) C(O) 3.0 1.0 0.0 3.8049e4 4.3484 -0.930 0.72751 1.5724e-7 2.2119 430.0 1.95 0.15 3.4879 1393.6 + diff --git a/examples/USER/phonon/third_order_command/combine.sh b/examples/USER/phonon/third_order_command/combine.sh new file mode 100755 index 0000000000..3eca2537be --- /dev/null +++ b/examples/USER/phonon/third_order_command/combine.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +#This script takes one argument +#The argument is the base name for the split up tensor +#The script then combines and sorts the tensor +#$1 file name + +echo "$1" +[ -f $1 ] && rm $1 + +for i in $(ls ./$1*); do + cat $i >> temp + rm $i +done + +sort temp | sort -s -n -k 3 | sort -s -n -k 1 > $1 +rm temp diff --git a/examples/USER/phonon/third_order_command/ff-silicon.lmp b/examples/USER/phonon/third_order_command/ff-silicon.lmp new file mode 100755 index 0000000000..f3b895f168 --- /dev/null +++ b/examples/USER/phonon/third_order_command/ff-silicon.lmp @@ -0,0 +1,19 @@ +############################# +#Atoms types - mass - charge# +############################# +#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# + +variable Si equal 1 + +############# +#Atom Masses# +############# + +mass ${Si} 28.08550 + +########################### +#Pair Potentials - Tersoff# +########################### + +pair_style tersoff +pair_coeff * * Si.opt.tersoff Si(D) diff --git a/examples/USER/phonon/third_order_command/in.silicon b/examples/USER/phonon/third_order_command/in.silicon new file mode 100755 index 0000000000..b8a9e214c4 --- /dev/null +++ b/examples/USER/phonon/third_order_command/in.silicon @@ -0,0 +1,84 @@ +###############################mm +# Atom style - charge/vdw/bonded# +################################# +atom_style full + +############################################## +#Units Metal : eV - ps - angstrom - bar# +# Real : kcal/mol - fs - angstrom - atm# +############################################## +units metal + +############ +#Run number# +############ +variable run_no equal 0 # is it a restart? +variable res_no equal ${run_no}-1 # restart file number + +####################################### +#Random Seeds and Domain Decomposition# +####################################### +variable iseed0 equal 2357 +variable iseed1 equal 26488 +variable iseed2 equal 10669 +processors * * 1 + +########### +#Data File# +########### +variable inpfile string silicon_input_file.lmp +variable resfile string final_restart.${res_no} +variable ff_file string ff-silicon.lmp + +########## +#Run Type# +########## +variable minimise equal 0 #Energy Minimization + +############################### +#Molecular Dynamics Parameters# +############################### +neighbor 1 bin + +################################ +#Energy Minimization Parameters# +################################ +variable mtraj equal 1 # trajectory output frequency - all system +variable etol equal 1e-5 # % change in energy +variable ftol equal 1e-5 # max force threshold (force units) +variable maxiter equal 10000 # max # of iterations + +######################## +#3D Periodic Simulation# +######################## +boundary p p p + +############################# +#Reading the input structure# +############################# +if "${run_no} == 0" then "read_data ${inpfile}" else "read_restart ${resfile}" + +############# +#Force Field# +############# +include ${ff_file} + +##################### +#Energy Minimization# +##################### +if "${minimise} <= 0 || ${run_no} > 0" then "jump SELF end_minimise" + print "Doing CG minimisation" + dump mdcd all dcd ${mtraj} min.dcd + dump_modify mdcd unwrap yes + min_style cg + min_modify line quadratic + minimize ${etol} ${ftol} ${maxiter} ${maxiter} + reset_timestep 0 + undump mdcd +label end_minimise + +################## +#Dynamical Matrix# +################## +third_order all ballistico 0.00001 file third_order binary no + diff --git a/examples/USER/phonon/third_order_command/lmp_bank/silicon_216.lmp b/examples/USER/phonon/third_order_command/lmp_bank/silicon_216.lmp new file mode 100755 index 0000000000..893d75e69b --- /dev/null +++ b/examples/USER/phonon/third_order_command/lmp_bank/silicon_216.lmp @@ -0,0 +1,238 @@ +LAMMPS description + + 216 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 16.293000 xlo xhi + 0.0000000 16.293000 ylo yhi + 0.0000000 16.293000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 + 2 2 1 0.0000000 0.0000000 2.7160000 2.7160000 + 3 3 1 0.0000000 2.7160000 2.7160000 0.0000000 + 4 4 1 0.0000000 2.7160000 0.0000000 2.7160000 + 5 5 1 0.0000000 4.0730000 1.3580000 4.0730000 + 6 6 1 0.0000000 1.3580000 1.3580000 1.3580000 + 7 7 1 0.0000000 1.3580000 4.0730000 4.0730000 + 8 8 1 0.0000000 4.0730000 4.0730000 1.3580000 + 9 9 1 0.0000000 0.0000000 0.0000000 5.4310000 + 10 10 1 0.0000000 0.0000000 2.7160000 8.1460000 + 11 11 1 0.0000000 2.7160000 2.7160000 5.4310000 + 12 12 1 0.0000000 2.7160000 0.0000000 8.1460000 + 13 13 1 0.0000000 4.0730000 1.3580000 9.5040000 + 14 14 1 0.0000000 1.3580000 1.3580000 6.7890000 + 15 15 1 0.0000000 1.3580000 4.0730000 9.5040000 + 16 16 1 0.0000000 4.0730000 4.0730000 6.7890000 + 17 17 1 0.0000000 0.0000000 0.0000000 10.8620000 + 18 18 1 0.0000000 0.0000000 2.7160000 13.5780000 + 19 19 1 0.0000000 2.7160000 2.7160000 10.8620000 + 20 20 1 0.0000000 2.7160000 0.0000000 13.5780000 + 21 21 1 0.0000000 4.0730000 1.3580000 14.9350000 + 22 22 1 0.0000000 1.3580000 1.3580000 12.2200000 + 23 23 1 0.0000000 1.3580000 4.0730000 14.9350000 + 24 24 1 0.0000000 4.0730000 4.0730000 12.2200000 + 25 25 1 0.0000000 0.0000000 5.4310000 0.0000000 + 26 26 1 0.0000000 0.0000000 8.1460000 2.7160000 + 27 27 1 0.0000000 2.7160000 8.1460000 0.0000000 + 28 28 1 0.0000000 2.7160000 5.4310000 2.7160000 + 29 29 1 0.0000000 4.0730000 6.7890000 4.0730000 + 30 30 1 0.0000000 1.3580000 6.7890000 1.3580000 + 31 31 1 0.0000000 1.3580000 9.5040000 4.0730000 + 32 32 1 0.0000000 4.0730000 9.5040000 1.3580000 + 33 33 1 0.0000000 0.0000000 5.4310000 5.4310000 + 34 34 1 0.0000000 0.0000000 8.1460000 8.1460000 + 35 35 1 0.0000000 2.7160000 8.1460000 5.4310000 + 36 36 1 0.0000000 2.7160000 5.4310000 8.1460000 + 37 37 1 0.0000000 4.0730000 6.7890000 9.5040000 + 38 38 1 0.0000000 1.3580000 6.7890000 6.7890000 + 39 39 1 0.0000000 1.3580000 9.5040000 9.5040000 + 40 40 1 0.0000000 4.0730000 9.5040000 6.7890000 + 41 41 1 0.0000000 0.0000000 5.4310000 10.8620000 + 42 42 1 0.0000000 0.0000000 8.1460000 13.5780000 + 43 43 1 0.0000000 2.7160000 8.1460000 10.8620000 + 44 44 1 0.0000000 2.7160000 5.4310000 13.5780000 + 45 45 1 0.0000000 4.0730000 6.7890000 14.9350000 + 46 46 1 0.0000000 1.3580000 6.7890000 12.2200000 + 47 47 1 0.0000000 1.3580000 9.5040000 14.9350000 + 48 48 1 0.0000000 4.0730000 9.5040000 12.2200000 + 49 49 1 0.0000000 0.0000000 10.8620000 0.0000000 + 50 50 1 0.0000000 0.0000000 13.5780000 2.7160000 + 51 51 1 0.0000000 2.7160000 13.5780000 0.0000000 + 52 52 1 0.0000000 2.7160000 10.8620000 2.7160000 + 53 53 1 0.0000000 4.0730000 12.2200000 4.0730000 + 54 54 1 0.0000000 1.3580000 12.2200000 1.3580000 + 55 55 1 0.0000000 1.3580000 14.9350000 4.0730000 + 56 56 1 0.0000000 4.0730000 14.9350000 1.3580000 + 57 57 1 0.0000000 0.0000000 10.8620000 5.4310000 + 58 58 1 0.0000000 0.0000000 13.5780000 8.1460000 + 59 59 1 0.0000000 2.7160000 13.5780000 5.4310000 + 60 60 1 0.0000000 2.7160000 10.8620000 8.1460000 + 61 61 1 0.0000000 4.0730000 12.2200000 9.5040000 + 62 62 1 0.0000000 1.3580000 12.2200000 6.7890000 + 63 63 1 0.0000000 1.3580000 14.9350000 9.5040000 + 64 64 1 0.0000000 4.0730000 14.9350000 6.7890000 + 65 65 1 0.0000000 0.0000000 10.8620000 10.8620000 + 66 66 1 0.0000000 0.0000000 13.5780000 13.5780000 + 67 67 1 0.0000000 2.7160000 13.5780000 10.8620000 + 68 68 1 0.0000000 2.7160000 10.8620000 13.5780000 + 69 69 1 0.0000000 4.0730000 12.2200000 14.9350000 + 70 70 1 0.0000000 1.3580000 12.2200000 12.2200000 + 71 71 1 0.0000000 1.3580000 14.9350000 14.9350000 + 72 72 1 0.0000000 4.0730000 14.9350000 12.2200000 + 73 73 1 0.0000000 5.4310000 0.0000000 0.0000000 + 74 74 1 0.0000000 5.4310000 2.7160000 2.7160000 + 75 75 1 0.0000000 8.1460000 2.7160000 0.0000000 + 76 76 1 0.0000000 8.1460000 0.0000000 2.7160000 + 77 77 1 0.0000000 9.5040000 1.3580000 4.0730000 + 78 78 1 0.0000000 6.7890000 1.3580000 1.3580000 + 79 79 1 0.0000000 6.7890000 4.0730000 4.0730000 + 80 80 1 0.0000000 9.5040000 4.0730000 1.3580000 + 81 81 1 0.0000000 5.4310000 0.0000000 5.4310000 + 82 82 1 0.0000000 5.4310000 2.7160000 8.1460000 + 83 83 1 0.0000000 8.1460000 2.7160000 5.4310000 + 84 84 1 0.0000000 8.1460000 0.0000000 8.1460000 + 85 85 1 0.0000000 9.5040000 1.3580000 9.5040000 + 86 86 1 0.0000000 6.7890000 1.3580000 6.7890000 + 87 87 1 0.0000000 6.7890000 4.0730000 9.5040000 + 88 88 1 0.0000000 9.5040000 4.0730000 6.7890000 + 89 89 1 0.0000000 5.4310000 0.0000000 10.8620000 + 90 90 1 0.0000000 5.4310000 2.7160000 13.5780000 + 91 91 1 0.0000000 8.1460000 2.7160000 10.8620000 + 92 92 1 0.0000000 8.1460000 0.0000000 13.5780000 + 93 93 1 0.0000000 9.5040000 1.3580000 14.9350000 + 94 94 1 0.0000000 6.7890000 1.3580000 12.2200000 + 95 95 1 0.0000000 6.7890000 4.0730000 14.9350000 + 96 96 1 0.0000000 9.5040000 4.0730000 12.2200000 + 97 97 1 0.0000000 5.4310000 5.4310000 0.0000000 + 98 98 1 0.0000000 5.4310000 8.1460000 2.7160000 + 99 99 1 0.0000000 8.1460000 8.1460000 0.0000000 + 100 100 1 0.0000000 8.1460000 5.4310000 2.7160000 + 101 101 1 0.0000000 9.5040000 6.7890000 4.0730000 + 102 102 1 0.0000000 6.7890000 6.7890000 1.3580000 + 103 103 1 0.0000000 6.7890000 9.5040000 4.0730000 + 104 104 1 0.0000000 9.5040000 9.5040000 1.3580000 + 105 105 1 0.0000000 5.4310000 5.4310000 5.4310000 + 106 106 1 0.0000000 5.4310000 8.1460000 8.1460000 + 107 107 1 0.0000000 8.1460000 8.1460000 5.4310000 + 108 108 1 0.0000000 8.1460000 5.4310000 8.1460000 + 109 109 1 0.0000000 9.5040000 6.7890000 9.5040000 + 110 110 1 0.0000000 6.7890000 6.7890000 6.7890000 + 111 111 1 0.0000000 6.7890000 9.5040000 9.5040000 + 112 112 1 0.0000000 9.5040000 9.5040000 6.7890000 + 113 113 1 0.0000000 5.4310000 5.4310000 10.8620000 + 114 114 1 0.0000000 5.4310000 8.1460000 13.5780000 + 115 115 1 0.0000000 8.1460000 8.1460000 10.8620000 + 116 116 1 0.0000000 8.1460000 5.4310000 13.5780000 + 117 117 1 0.0000000 9.5040000 6.7890000 14.9350000 + 118 118 1 0.0000000 6.7890000 6.7890000 12.2200000 + 119 119 1 0.0000000 6.7890000 9.5040000 14.9350000 + 120 120 1 0.0000000 9.5040000 9.5040000 12.2200000 + 121 121 1 0.0000000 5.4310000 10.8620000 0.0000000 + 122 122 1 0.0000000 5.4310000 13.5780000 2.7160000 + 123 123 1 0.0000000 8.1460000 13.5780000 0.0000000 + 124 124 1 0.0000000 8.1460000 10.8620000 2.7160000 + 125 125 1 0.0000000 9.5040000 12.2200000 4.0730000 + 126 126 1 0.0000000 6.7890000 12.2200000 1.3580000 + 127 127 1 0.0000000 6.7890000 14.9350000 4.0730000 + 128 128 1 0.0000000 9.5040000 14.9350000 1.3580000 + 129 129 1 0.0000000 5.4310000 10.8620000 5.4310000 + 130 130 1 0.0000000 5.4310000 13.5780000 8.1460000 + 131 131 1 0.0000000 8.1460000 13.5780000 5.4310000 + 132 132 1 0.0000000 8.1460000 10.8620000 8.1460000 + 133 133 1 0.0000000 9.5040000 12.2200000 9.5040000 + 134 134 1 0.0000000 6.7890000 12.2200000 6.7890000 + 135 135 1 0.0000000 6.7890000 14.9350000 9.5040000 + 136 136 1 0.0000000 9.5040000 14.9350000 6.7890000 + 137 137 1 0.0000000 5.4310000 10.8620000 10.8620000 + 138 138 1 0.0000000 5.4310000 13.5780000 13.5780000 + 139 139 1 0.0000000 8.1460000 13.5780000 10.8620000 + 140 140 1 0.0000000 8.1460000 10.8620000 13.5780000 + 141 141 1 0.0000000 9.5040000 12.2200000 14.9350000 + 142 142 1 0.0000000 6.7890000 12.2200000 12.2200000 + 143 143 1 0.0000000 6.7890000 14.9350000 14.9350000 + 144 144 1 0.0000000 9.5040000 14.9350000 12.2200000 + 145 145 1 0.0000000 10.8620000 0.0000000 0.0000000 + 146 146 1 0.0000000 10.8620000 2.7160000 2.7160000 + 147 147 1 0.0000000 13.5780000 2.7160000 0.0000000 + 148 148 1 0.0000000 13.5780000 0.0000000 2.7160000 + 149 149 1 0.0000000 14.9350000 1.3580000 4.0730000 + 150 150 1 0.0000000 12.2200000 1.3580000 1.3580000 + 151 151 1 0.0000000 12.2200000 4.0730000 4.0730000 + 152 152 1 0.0000000 14.9350000 4.0730000 1.3580000 + 153 153 1 0.0000000 10.8620000 0.0000000 5.4310000 + 154 154 1 0.0000000 10.8620000 2.7160000 8.1460000 + 155 155 1 0.0000000 13.5780000 2.7160000 5.4310000 + 156 156 1 0.0000000 13.5780000 0.0000000 8.1460000 + 157 157 1 0.0000000 14.9350000 1.3580000 9.5040000 + 158 158 1 0.0000000 12.2200000 1.3580000 6.7890000 + 159 159 1 0.0000000 12.2200000 4.0730000 9.5040000 + 160 160 1 0.0000000 14.9350000 4.0730000 6.7890000 + 161 161 1 0.0000000 10.8620000 0.0000000 10.8620000 + 162 162 1 0.0000000 10.8620000 2.7160000 13.5780000 + 163 163 1 0.0000000 13.5780000 2.7160000 10.8620000 + 164 164 1 0.0000000 13.5780000 0.0000000 13.5780000 + 165 165 1 0.0000000 14.9350000 1.3580000 14.9350000 + 166 166 1 0.0000000 12.2200000 1.3580000 12.2200000 + 167 167 1 0.0000000 12.2200000 4.0730000 14.9350000 + 168 168 1 0.0000000 14.9350000 4.0730000 12.2200000 + 169 169 1 0.0000000 10.8620000 5.4310000 0.0000000 + 170 170 1 0.0000000 10.8620000 8.1460000 2.7160000 + 171 171 1 0.0000000 13.5780000 8.1460000 0.0000000 + 172 172 1 0.0000000 13.5780000 5.4310000 2.7160000 + 173 173 1 0.0000000 14.9350000 6.7890000 4.0730000 + 174 174 1 0.0000000 12.2200000 6.7890000 1.3580000 + 175 175 1 0.0000000 12.2200000 9.5040000 4.0730000 + 176 176 1 0.0000000 14.9350000 9.5040000 1.3580000 + 177 177 1 0.0000000 10.8620000 5.4310000 5.4310000 + 178 178 1 0.0000000 10.8620000 8.1460000 8.1460000 + 179 179 1 0.0000000 13.5780000 8.1460000 5.4310000 + 180 180 1 0.0000000 13.5780000 5.4310000 8.1460000 + 181 181 1 0.0000000 14.9350000 6.7890000 9.5040000 + 182 182 1 0.0000000 12.2200000 6.7890000 6.7890000 + 183 183 1 0.0000000 12.2200000 9.5040000 9.5040000 + 184 184 1 0.0000000 14.9350000 9.5040000 6.7890000 + 185 185 1 0.0000000 10.8620000 5.4310000 10.8620000 + 186 186 1 0.0000000 10.8620000 8.1460000 13.5780000 + 187 187 1 0.0000000 13.5780000 8.1460000 10.8620000 + 188 188 1 0.0000000 13.5780000 5.4310000 13.5780000 + 189 189 1 0.0000000 14.9350000 6.7890000 14.9350000 + 190 190 1 0.0000000 12.2200000 6.7890000 12.2200000 + 191 191 1 0.0000000 12.2200000 9.5040000 14.9350000 + 192 192 1 0.0000000 14.9350000 9.5040000 12.2200000 + 193 193 1 0.0000000 10.8620000 10.8620000 0.0000000 + 194 194 1 0.0000000 10.8620000 13.5780000 2.7160000 + 195 195 1 0.0000000 13.5780000 13.5780000 0.0000000 + 196 196 1 0.0000000 13.5780000 10.8620000 2.7160000 + 197 197 1 0.0000000 14.9350000 12.2200000 4.0730000 + 198 198 1 0.0000000 12.2200000 12.2200000 1.3580000 + 199 199 1 0.0000000 12.2200000 14.9350000 4.0730000 + 200 200 1 0.0000000 14.9350000 14.9350000 1.3580000 + 201 201 1 0.0000000 10.8620000 10.8620000 5.4310000 + 202 202 1 0.0000000 10.8620000 13.5780000 8.1460000 + 203 203 1 0.0000000 13.5780000 13.5780000 5.4310000 + 204 204 1 0.0000000 13.5780000 10.8620000 8.1460000 + 205 205 1 0.0000000 14.9350000 12.2200000 9.5040000 + 206 206 1 0.0000000 12.2200000 12.2200000 6.7890000 + 207 207 1 0.0000000 12.2200000 14.9350000 9.5040000 + 208 208 1 0.0000000 14.9350000 14.9350000 6.7890000 + 209 209 1 0.0000000 10.8620000 10.8620000 10.8620000 + 210 210 1 0.0000000 10.8620000 13.5780000 13.5780000 + 211 211 1 0.0000000 13.5780000 13.5780000 10.8620000 + 212 212 1 0.0000000 13.5780000 10.8620000 13.5780000 + 213 213 1 0.0000000 14.9350000 12.2200000 14.9350000 + 214 214 1 0.0000000 12.2200000 12.2200000 12.2200000 + 215 215 1 0.0000000 12.2200000 14.9350000 14.9350000 + 216 216 1 0.0000000 14.9350000 14.9350000 12.2200000 + diff --git a/examples/USER/phonon/third_order_command/lmp_bank/silicon_512.lmp b/examples/USER/phonon/third_order_command/lmp_bank/silicon_512.lmp new file mode 100755 index 0000000000..8c1ecd30bd --- /dev/null +++ b/examples/USER/phonon/third_order_command/lmp_bank/silicon_512.lmp @@ -0,0 +1,534 @@ +LAMMPS description + + 512 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 21.724000 xlo xhi + 0.0000000 21.724000 ylo yhi + 0.0000000 21.724000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 + 2 2 1 0.0000000 0.0000000 2.7150000 2.7150000 + 3 3 1 0.0000000 2.7150000 2.7150000 0.0000000 + 4 4 1 0.0000000 2.7150000 0.0000000 2.7150000 + 5 5 1 0.0000000 4.0730000 1.3580000 4.0730000 + 6 6 1 0.0000000 1.3580000 1.3580000 1.3580000 + 7 7 1 0.0000000 1.3580000 4.0730000 4.0730000 + 8 8 1 0.0000000 4.0730000 4.0730000 1.3580000 + 9 9 1 0.0000000 0.0000000 0.0000000 5.4310000 + 10 10 1 0.0000000 0.0000000 2.7150000 8.1460000 + 11 11 1 0.0000000 2.7150000 2.7150000 5.4310000 + 12 12 1 0.0000000 2.7150000 0.0000000 8.1460000 + 13 13 1 0.0000000 4.0730000 1.3580000 9.5040000 + 14 14 1 0.0000000 1.3580000 1.3580000 6.7890000 + 15 15 1 0.0000000 1.3580000 4.0730000 9.5040000 + 16 16 1 0.0000000 4.0730000 4.0730000 6.7890000 + 17 17 1 0.0000000 0.0000000 0.0000000 10.8620000 + 18 18 1 0.0000000 0.0000000 2.7150000 13.5770000 + 19 19 1 0.0000000 2.7150000 2.7150000 10.8620000 + 20 20 1 0.0000000 2.7150000 0.0000000 13.5770000 + 21 21 1 0.0000000 4.0730000 1.3580000 14.9350000 + 22 22 1 0.0000000 1.3580000 1.3580000 12.2200000 + 23 23 1 0.0000000 1.3580000 4.0730000 14.9350000 + 24 24 1 0.0000000 4.0730000 4.0730000 12.2200000 + 25 25 1 0.0000000 0.0000000 0.0000000 16.2930000 + 26 26 1 0.0000000 0.0000000 2.7150000 19.0080000 + 27 27 1 0.0000000 2.7150000 2.7150000 16.2930000 + 28 28 1 0.0000000 2.7150000 0.0000000 19.0080000 + 29 29 1 0.0000000 4.0730000 1.3580000 20.3660000 + 30 30 1 0.0000000 1.3580000 1.3580000 17.6510000 + 31 31 1 0.0000000 1.3580000 4.0730000 20.3660000 + 32 32 1 0.0000000 4.0730000 4.0730000 17.6510000 + 33 33 1 0.0000000 0.0000000 5.4310000 0.0000000 + 34 34 1 0.0000000 0.0000000 8.1460000 2.7150000 + 35 35 1 0.0000000 2.7150000 8.1460000 0.0000000 + 36 36 1 0.0000000 2.7150000 5.4310000 2.7150000 + 37 37 1 0.0000000 4.0730000 6.7890000 4.0730000 + 38 38 1 0.0000000 1.3580000 6.7890000 1.3580000 + 39 39 1 0.0000000 1.3580000 9.5040000 4.0730000 + 40 40 1 0.0000000 4.0730000 9.5040000 1.3580000 + 41 41 1 0.0000000 0.0000000 5.4310000 5.4310000 + 42 42 1 0.0000000 0.0000000 8.1460000 8.1460000 + 43 43 1 0.0000000 2.7150000 8.1460000 5.4310000 + 44 44 1 0.0000000 2.7150000 5.4310000 8.1460000 + 45 45 1 0.0000000 4.0730000 6.7890000 9.5040000 + 46 46 1 0.0000000 1.3580000 6.7890000 6.7890000 + 47 47 1 0.0000000 1.3580000 9.5040000 9.5040000 + 48 48 1 0.0000000 4.0730000 9.5040000 6.7890000 + 49 49 1 0.0000000 0.0000000 5.4310000 10.8620000 + 50 50 1 0.0000000 0.0000000 8.1460000 13.5770000 + 51 51 1 0.0000000 2.7150000 8.1460000 10.8620000 + 52 52 1 0.0000000 2.7150000 5.4310000 13.5770000 + 53 53 1 0.0000000 4.0730000 6.7890000 14.9350000 + 54 54 1 0.0000000 1.3580000 6.7890000 12.2200000 + 55 55 1 0.0000000 1.3580000 9.5040000 14.9350000 + 56 56 1 0.0000000 4.0730000 9.5040000 12.2200000 + 57 57 1 0.0000000 0.0000000 5.4310000 16.2930000 + 58 58 1 0.0000000 0.0000000 8.1460000 19.0080000 + 59 59 1 0.0000000 2.7150000 8.1460000 16.2930000 + 60 60 1 0.0000000 2.7150000 5.4310000 19.0080000 + 61 61 1 0.0000000 4.0730000 6.7890000 20.3660000 + 62 62 1 0.0000000 1.3580000 6.7890000 17.6510000 + 63 63 1 0.0000000 1.3580000 9.5040000 20.3660000 + 64 64 1 0.0000000 4.0730000 9.5040000 17.6510000 + 65 65 1 0.0000000 0.0000000 10.8620000 0.0000000 + 66 66 1 0.0000000 0.0000000 13.5770000 2.7150000 + 67 67 1 0.0000000 2.7150000 13.5770000 0.0000000 + 68 68 1 0.0000000 2.7150000 10.8620000 2.7150000 + 69 69 1 0.0000000 4.0730000 12.2200000 4.0730000 + 70 70 1 0.0000000 1.3580000 12.2200000 1.3580000 + 71 71 1 0.0000000 1.3580000 14.9350000 4.0730000 + 72 72 1 0.0000000 4.0730000 14.9350000 1.3580000 + 73 73 1 0.0000000 0.0000000 10.8620000 5.4310000 + 74 74 1 0.0000000 0.0000000 13.5770000 8.1460000 + 75 75 1 0.0000000 2.7150000 13.5770000 5.4310000 + 76 76 1 0.0000000 2.7150000 10.8620000 8.1460000 + 77 77 1 0.0000000 4.0730000 12.2200000 9.5040000 + 78 78 1 0.0000000 1.3580000 12.2200000 6.7890000 + 79 79 1 0.0000000 1.3580000 14.9350000 9.5040000 + 80 80 1 0.0000000 4.0730000 14.9350000 6.7890000 + 81 81 1 0.0000000 0.0000000 10.8620000 10.8620000 + 82 82 1 0.0000000 0.0000000 13.5770000 13.5770000 + 83 83 1 0.0000000 2.7150000 13.5770000 10.8620000 + 84 84 1 0.0000000 2.7150000 10.8620000 13.5770000 + 85 85 1 0.0000000 4.0730000 12.2200000 14.9350000 + 86 86 1 0.0000000 1.3580000 12.2200000 12.2200000 + 87 87 1 0.0000000 1.3580000 14.9350000 14.9350000 + 88 88 1 0.0000000 4.0730000 14.9350000 12.2200000 + 89 89 1 0.0000000 0.0000000 10.8620000 16.2930000 + 90 90 1 0.0000000 0.0000000 13.5770000 19.0080000 + 91 91 1 0.0000000 2.7150000 13.5770000 16.2930000 + 92 92 1 0.0000000 2.7150000 10.8620000 19.0080000 + 93 93 1 0.0000000 4.0730000 12.2200000 20.3660000 + 94 94 1 0.0000000 1.3580000 12.2200000 17.6510000 + 95 95 1 0.0000000 1.3580000 14.9350000 20.3660000 + 96 96 1 0.0000000 4.0730000 14.9350000 17.6510000 + 97 97 1 0.0000000 0.0000000 16.2930000 0.0000000 + 98 98 1 0.0000000 0.0000000 19.0080000 2.7150000 + 99 99 1 0.0000000 2.7150000 19.0080000 0.0000000 + 100 100 1 0.0000000 2.7150000 16.2930000 2.7150000 + 101 101 1 0.0000000 4.0730000 17.6510000 4.0730000 + 102 102 1 0.0000000 1.3580000 17.6510000 1.3580000 + 103 103 1 0.0000000 1.3580000 20.3660000 4.0730000 + 104 104 1 0.0000000 4.0730000 20.3660000 1.3580000 + 105 105 1 0.0000000 0.0000000 16.2930000 5.4310000 + 106 106 1 0.0000000 0.0000000 19.0080000 8.1460000 + 107 107 1 0.0000000 2.7150000 19.0080000 5.4310000 + 108 108 1 0.0000000 2.7150000 16.2930000 8.1460000 + 109 109 1 0.0000000 4.0730000 17.6510000 9.5040000 + 110 110 1 0.0000000 1.3580000 17.6510000 6.7890000 + 111 111 1 0.0000000 1.3580000 20.3660000 9.5040000 + 112 112 1 0.0000000 4.0730000 20.3660000 6.7890000 + 113 113 1 0.0000000 0.0000000 16.2930000 10.8620000 + 114 114 1 0.0000000 0.0000000 19.0080000 13.5770000 + 115 115 1 0.0000000 2.7150000 19.0080000 10.8620000 + 116 116 1 0.0000000 2.7150000 16.2930000 13.5770000 + 117 117 1 0.0000000 4.0730000 17.6510000 14.9350000 + 118 118 1 0.0000000 1.3580000 17.6510000 12.2200000 + 119 119 1 0.0000000 1.3580000 20.3660000 14.9350000 + 120 120 1 0.0000000 4.0730000 20.3660000 12.2200000 + 121 121 1 0.0000000 0.0000000 16.2930000 16.2930000 + 122 122 1 0.0000000 0.0000000 19.0080000 19.0080000 + 123 123 1 0.0000000 2.7150000 19.0080000 16.2930000 + 124 124 1 0.0000000 2.7150000 16.2930000 19.0080000 + 125 125 1 0.0000000 4.0730000 17.6510000 20.3660000 + 126 126 1 0.0000000 1.3580000 17.6510000 17.6510000 + 127 127 1 0.0000000 1.3580000 20.3660000 20.3660000 + 128 128 1 0.0000000 4.0730000 20.3660000 17.6510000 + 129 129 1 0.0000000 5.4310000 0.0000000 0.0000000 + 130 130 1 0.0000000 5.4310000 2.7150000 2.7150000 + 131 131 1 0.0000000 8.1460000 2.7150000 0.0000000 + 132 132 1 0.0000000 8.1460000 0.0000000 2.7150000 + 133 133 1 0.0000000 9.5040000 1.3580000 4.0730000 + 134 134 1 0.0000000 6.7890000 1.3580000 1.3580000 + 135 135 1 0.0000000 6.7890000 4.0730000 4.0730000 + 136 136 1 0.0000000 9.5040000 4.0730000 1.3580000 + 137 137 1 0.0000000 5.4310000 0.0000000 5.4310000 + 138 138 1 0.0000000 5.4310000 2.7150000 8.1460000 + 139 139 1 0.0000000 8.1460000 2.7150000 5.4310000 + 140 140 1 0.0000000 8.1460000 0.0000000 8.1460000 + 141 141 1 0.0000000 9.5040000 1.3580000 9.5040000 + 142 142 1 0.0000000 6.7890000 1.3580000 6.7890000 + 143 143 1 0.0000000 6.7890000 4.0730000 9.5040000 + 144 144 1 0.0000000 9.5040000 4.0730000 6.7890000 + 145 145 1 0.0000000 5.4310000 0.0000000 10.8620000 + 146 146 1 0.0000000 5.4310000 2.7150000 13.5770000 + 147 147 1 0.0000000 8.1460000 2.7150000 10.8620000 + 148 148 1 0.0000000 8.1460000 0.0000000 13.5770000 + 149 149 1 0.0000000 9.5040000 1.3580000 14.9350000 + 150 150 1 0.0000000 6.7890000 1.3580000 12.2200000 + 151 151 1 0.0000000 6.7890000 4.0730000 14.9350000 + 152 152 1 0.0000000 9.5040000 4.0730000 12.2200000 + 153 153 1 0.0000000 5.4310000 0.0000000 16.2930000 + 154 154 1 0.0000000 5.4310000 2.7150000 19.0080000 + 155 155 1 0.0000000 8.1460000 2.7150000 16.2930000 + 156 156 1 0.0000000 8.1460000 0.0000000 19.0080000 + 157 157 1 0.0000000 9.5040000 1.3580000 20.3660000 + 158 158 1 0.0000000 6.7890000 1.3580000 17.6510000 + 159 159 1 0.0000000 6.7890000 4.0730000 20.3660000 + 160 160 1 0.0000000 9.5040000 4.0730000 17.6510000 + 161 161 1 0.0000000 5.4310000 5.4310000 0.0000000 + 162 162 1 0.0000000 5.4310000 8.1460000 2.7150000 + 163 163 1 0.0000000 8.1460000 8.1460000 0.0000000 + 164 164 1 0.0000000 8.1460000 5.4310000 2.7150000 + 165 165 1 0.0000000 9.5040000 6.7890000 4.0730000 + 166 166 1 0.0000000 6.7890000 6.7890000 1.3580000 + 167 167 1 0.0000000 6.7890000 9.5040000 4.0730000 + 168 168 1 0.0000000 9.5040000 9.5040000 1.3580000 + 169 169 1 0.0000000 5.4310000 5.4310000 5.4310000 + 170 170 1 0.0000000 5.4310000 8.1460000 8.1460000 + 171 171 1 0.0000000 8.1460000 8.1460000 5.4310000 + 172 172 1 0.0000000 8.1460000 5.4310000 8.1460000 + 173 173 1 0.0000000 9.5040000 6.7890000 9.5040000 + 174 174 1 0.0000000 6.7890000 6.7890000 6.7890000 + 175 175 1 0.0000000 6.7890000 9.5040000 9.5040000 + 176 176 1 0.0000000 9.5040000 9.5040000 6.7890000 + 177 177 1 0.0000000 5.4310000 5.4310000 10.8620000 + 178 178 1 0.0000000 5.4310000 8.1460000 13.5770000 + 179 179 1 0.0000000 8.1460000 8.1460000 10.8620000 + 180 180 1 0.0000000 8.1460000 5.4310000 13.5770000 + 181 181 1 0.0000000 9.5040000 6.7890000 14.9350000 + 182 182 1 0.0000000 6.7890000 6.7890000 12.2200000 + 183 183 1 0.0000000 6.7890000 9.5040000 14.9350000 + 184 184 1 0.0000000 9.5040000 9.5040000 12.2200000 + 185 185 1 0.0000000 5.4310000 5.4310000 16.2930000 + 186 186 1 0.0000000 5.4310000 8.1460000 19.0080000 + 187 187 1 0.0000000 8.1460000 8.1460000 16.2930000 + 188 188 1 0.0000000 8.1460000 5.4310000 19.0080000 + 189 189 1 0.0000000 9.5040000 6.7890000 20.3660000 + 190 190 1 0.0000000 6.7890000 6.7890000 17.6510000 + 191 191 1 0.0000000 6.7890000 9.5040000 20.3660000 + 192 192 1 0.0000000 9.5040000 9.5040000 17.6510000 + 193 193 1 0.0000000 5.4310000 10.8620000 0.0000000 + 194 194 1 0.0000000 5.4310000 13.5770000 2.7150000 + 195 195 1 0.0000000 8.1460000 13.5770000 0.0000000 + 196 196 1 0.0000000 8.1460000 10.8620000 2.7150000 + 197 197 1 0.0000000 9.5040000 12.2200000 4.0730000 + 198 198 1 0.0000000 6.7890000 12.2200000 1.3580000 + 199 199 1 0.0000000 6.7890000 14.9350000 4.0730000 + 200 200 1 0.0000000 9.5040000 14.9350000 1.3580000 + 201 201 1 0.0000000 5.4310000 10.8620000 5.4310000 + 202 202 1 0.0000000 5.4310000 13.5770000 8.1460000 + 203 203 1 0.0000000 8.1460000 13.5770000 5.4310000 + 204 204 1 0.0000000 8.1460000 10.8620000 8.1460000 + 205 205 1 0.0000000 9.5040000 12.2200000 9.5040000 + 206 206 1 0.0000000 6.7890000 12.2200000 6.7890000 + 207 207 1 0.0000000 6.7890000 14.9350000 9.5040000 + 208 208 1 0.0000000 9.5040000 14.9350000 6.7890000 + 209 209 1 0.0000000 5.4310000 10.8620000 10.8620000 + 210 210 1 0.0000000 5.4310000 13.5770000 13.5770000 + 211 211 1 0.0000000 8.1460000 13.5770000 10.8620000 + 212 212 1 0.0000000 8.1460000 10.8620000 13.5770000 + 213 213 1 0.0000000 9.5040000 12.2200000 14.9350000 + 214 214 1 0.0000000 6.7890000 12.2200000 12.2200000 + 215 215 1 0.0000000 6.7890000 14.9350000 14.9350000 + 216 216 1 0.0000000 9.5040000 14.9350000 12.2200000 + 217 217 1 0.0000000 5.4310000 10.8620000 16.2930000 + 218 218 1 0.0000000 5.4310000 13.5770000 19.0080000 + 219 219 1 0.0000000 8.1460000 13.5770000 16.2930000 + 220 220 1 0.0000000 8.1460000 10.8620000 19.0080000 + 221 221 1 0.0000000 9.5040000 12.2200000 20.3660000 + 222 222 1 0.0000000 6.7890000 12.2200000 17.6510000 + 223 223 1 0.0000000 6.7890000 14.9350000 20.3660000 + 224 224 1 0.0000000 9.5040000 14.9350000 17.6510000 + 225 225 1 0.0000000 5.4310000 16.2930000 0.0000000 + 226 226 1 0.0000000 5.4310000 19.0080000 2.7150000 + 227 227 1 0.0000000 8.1460000 19.0080000 0.0000000 + 228 228 1 0.0000000 8.1460000 16.2930000 2.7150000 + 229 229 1 0.0000000 9.5040000 17.6510000 4.0730000 + 230 230 1 0.0000000 6.7890000 17.6510000 1.3580000 + 231 231 1 0.0000000 6.7890000 20.3660000 4.0730000 + 232 232 1 0.0000000 9.5040000 20.3660000 1.3580000 + 233 233 1 0.0000000 5.4310000 16.2930000 5.4310000 + 234 234 1 0.0000000 5.4310000 19.0080000 8.1460000 + 235 235 1 0.0000000 8.1460000 19.0080000 5.4310000 + 236 236 1 0.0000000 8.1460000 16.2930000 8.1460000 + 237 237 1 0.0000000 9.5040000 17.6510000 9.5040000 + 238 238 1 0.0000000 6.7890000 17.6510000 6.7890000 + 239 239 1 0.0000000 6.7890000 20.3660000 9.5040000 + 240 240 1 0.0000000 9.5040000 20.3660000 6.7890000 + 241 241 1 0.0000000 5.4310000 16.2930000 10.8620000 + 242 242 1 0.0000000 5.4310000 19.0080000 13.5770000 + 243 243 1 0.0000000 8.1460000 19.0080000 10.8620000 + 244 244 1 0.0000000 8.1460000 16.2930000 13.5770000 + 245 245 1 0.0000000 9.5040000 17.6510000 14.9350000 + 246 246 1 0.0000000 6.7890000 17.6510000 12.2200000 + 247 247 1 0.0000000 6.7890000 20.3660000 14.9350000 + 248 248 1 0.0000000 9.5040000 20.3660000 12.2200000 + 249 249 1 0.0000000 5.4310000 16.2930000 16.2930000 + 250 250 1 0.0000000 5.4310000 19.0080000 19.0080000 + 251 251 1 0.0000000 8.1460000 19.0080000 16.2930000 + 252 252 1 0.0000000 8.1460000 16.2930000 19.0080000 + 253 253 1 0.0000000 9.5040000 17.6510000 20.3660000 + 254 254 1 0.0000000 6.7890000 17.6510000 17.6510000 + 255 255 1 0.0000000 6.7890000 20.3660000 20.3660000 + 256 256 1 0.0000000 9.5040000 20.3660000 17.6510000 + 257 257 1 0.0000000 10.8620000 0.0000000 0.0000000 + 258 258 1 0.0000000 10.8620000 2.7150000 2.7150000 + 259 259 1 0.0000000 13.5770000 2.7150000 0.0000000 + 260 260 1 0.0000000 13.5770000 0.0000000 2.7150000 + 261 261 1 0.0000000 14.9350000 1.3580000 4.0730000 + 262 262 1 0.0000000 12.2200000 1.3580000 1.3580000 + 263 263 1 0.0000000 12.2200000 4.0730000 4.0730000 + 264 264 1 0.0000000 14.9350000 4.0730000 1.3580000 + 265 265 1 0.0000000 10.8620000 0.0000000 5.4310000 + 266 266 1 0.0000000 10.8620000 2.7150000 8.1460000 + 267 267 1 0.0000000 13.5770000 2.7150000 5.4310000 + 268 268 1 0.0000000 13.5770000 0.0000000 8.1460000 + 269 269 1 0.0000000 14.9350000 1.3580000 9.5040000 + 270 270 1 0.0000000 12.2200000 1.3580000 6.7890000 + 271 271 1 0.0000000 12.2200000 4.0730000 9.5040000 + 272 272 1 0.0000000 14.9350000 4.0730000 6.7890000 + 273 273 1 0.0000000 10.8620000 0.0000000 10.8620000 + 274 274 1 0.0000000 10.8620000 2.7150000 13.5770000 + 275 275 1 0.0000000 13.5770000 2.7150000 10.8620000 + 276 276 1 0.0000000 13.5770000 0.0000000 13.5770000 + 277 277 1 0.0000000 14.9350000 1.3580000 14.9350000 + 278 278 1 0.0000000 12.2200000 1.3580000 12.2200000 + 279 279 1 0.0000000 12.2200000 4.0730000 14.9350000 + 280 280 1 0.0000000 14.9350000 4.0730000 12.2200000 + 281 281 1 0.0000000 10.8620000 0.0000000 16.2930000 + 282 282 1 0.0000000 10.8620000 2.7150000 19.0080000 + 283 283 1 0.0000000 13.5770000 2.7150000 16.2930000 + 284 284 1 0.0000000 13.5770000 0.0000000 19.0080000 + 285 285 1 0.0000000 14.9350000 1.3580000 20.3660000 + 286 286 1 0.0000000 12.2200000 1.3580000 17.6510000 + 287 287 1 0.0000000 12.2200000 4.0730000 20.3660000 + 288 288 1 0.0000000 14.9350000 4.0730000 17.6510000 + 289 289 1 0.0000000 10.8620000 5.4310000 0.0000000 + 290 290 1 0.0000000 10.8620000 8.1460000 2.7150000 + 291 291 1 0.0000000 13.5770000 8.1460000 0.0000000 + 292 292 1 0.0000000 13.5770000 5.4310000 2.7150000 + 293 293 1 0.0000000 14.9350000 6.7890000 4.0730000 + 294 294 1 0.0000000 12.2200000 6.7890000 1.3580000 + 295 295 1 0.0000000 12.2200000 9.5040000 4.0730000 + 296 296 1 0.0000000 14.9350000 9.5040000 1.3580000 + 297 297 1 0.0000000 10.8620000 5.4310000 5.4310000 + 298 298 1 0.0000000 10.8620000 8.1460000 8.1460000 + 299 299 1 0.0000000 13.5770000 8.1460000 5.4310000 + 300 300 1 0.0000000 13.5770000 5.4310000 8.1460000 + 301 301 1 0.0000000 14.9350000 6.7890000 9.5040000 + 302 302 1 0.0000000 12.2200000 6.7890000 6.7890000 + 303 303 1 0.0000000 12.2200000 9.5040000 9.5040000 + 304 304 1 0.0000000 14.9350000 9.5040000 6.7890000 + 305 305 1 0.0000000 10.8620000 5.4310000 10.8620000 + 306 306 1 0.0000000 10.8620000 8.1460000 13.5770000 + 307 307 1 0.0000000 13.5770000 8.1460000 10.8620000 + 308 308 1 0.0000000 13.5770000 5.4310000 13.5770000 + 309 309 1 0.0000000 14.9350000 6.7890000 14.9350000 + 310 310 1 0.0000000 12.2200000 6.7890000 12.2200000 + 311 311 1 0.0000000 12.2200000 9.5040000 14.9350000 + 312 312 1 0.0000000 14.9350000 9.5040000 12.2200000 + 313 313 1 0.0000000 10.8620000 5.4310000 16.2930000 + 314 314 1 0.0000000 10.8620000 8.1460000 19.0080000 + 315 315 1 0.0000000 13.5770000 8.1460000 16.2930000 + 316 316 1 0.0000000 13.5770000 5.4310000 19.0080000 + 317 317 1 0.0000000 14.9350000 6.7890000 20.3660000 + 318 318 1 0.0000000 12.2200000 6.7890000 17.6510000 + 319 319 1 0.0000000 12.2200000 9.5040000 20.3660000 + 320 320 1 0.0000000 14.9350000 9.5040000 17.6510000 + 321 321 1 0.0000000 10.8620000 10.8620000 0.0000000 + 322 322 1 0.0000000 10.8620000 13.5770000 2.7150000 + 323 323 1 0.0000000 13.5770000 13.5770000 0.0000000 + 324 324 1 0.0000000 13.5770000 10.8620000 2.7150000 + 325 325 1 0.0000000 14.9350000 12.2200000 4.0730000 + 326 326 1 0.0000000 12.2200000 12.2200000 1.3580000 + 327 327 1 0.0000000 12.2200000 14.9350000 4.0730000 + 328 328 1 0.0000000 14.9350000 14.9350000 1.3580000 + 329 329 1 0.0000000 10.8620000 10.8620000 5.4310000 + 330 330 1 0.0000000 10.8620000 13.5770000 8.1460000 + 331 331 1 0.0000000 13.5770000 13.5770000 5.4310000 + 332 332 1 0.0000000 13.5770000 10.8620000 8.1460000 + 333 333 1 0.0000000 14.9350000 12.2200000 9.5040000 + 334 334 1 0.0000000 12.2200000 12.2200000 6.7890000 + 335 335 1 0.0000000 12.2200000 14.9350000 9.5040000 + 336 336 1 0.0000000 14.9350000 14.9350000 6.7890000 + 337 337 1 0.0000000 10.8620000 10.8620000 10.8620000 + 338 338 1 0.0000000 10.8620000 13.5770000 13.5770000 + 339 339 1 0.0000000 13.5770000 13.5770000 10.8620000 + 340 340 1 0.0000000 13.5770000 10.8620000 13.5770000 + 341 341 1 0.0000000 14.9350000 12.2200000 14.9350000 + 342 342 1 0.0000000 12.2200000 12.2200000 12.2200000 + 343 343 1 0.0000000 12.2200000 14.9350000 14.9350000 + 344 344 1 0.0000000 14.9350000 14.9350000 12.2200000 + 345 345 1 0.0000000 10.8620000 10.8620000 16.2930000 + 346 346 1 0.0000000 10.8620000 13.5770000 19.0080000 + 347 347 1 0.0000000 13.5770000 13.5770000 16.2930000 + 348 348 1 0.0000000 13.5770000 10.8620000 19.0080000 + 349 349 1 0.0000000 14.9350000 12.2200000 20.3660000 + 350 350 1 0.0000000 12.2200000 12.2200000 17.6510000 + 351 351 1 0.0000000 12.2200000 14.9350000 20.3660000 + 352 352 1 0.0000000 14.9350000 14.9350000 17.6510000 + 353 353 1 0.0000000 10.8620000 16.2930000 0.0000000 + 354 354 1 0.0000000 10.8620000 19.0080000 2.7150000 + 355 355 1 0.0000000 13.5770000 19.0080000 0.0000000 + 356 356 1 0.0000000 13.5770000 16.2930000 2.7150000 + 357 357 1 0.0000000 14.9350000 17.6510000 4.0730000 + 358 358 1 0.0000000 12.2200000 17.6510000 1.3580000 + 359 359 1 0.0000000 12.2200000 20.3660000 4.0730000 + 360 360 1 0.0000000 14.9350000 20.3660000 1.3580000 + 361 361 1 0.0000000 10.8620000 16.2930000 5.4310000 + 362 362 1 0.0000000 10.8620000 19.0080000 8.1460000 + 363 363 1 0.0000000 13.5770000 19.0080000 5.4310000 + 364 364 1 0.0000000 13.5770000 16.2930000 8.1460000 + 365 365 1 0.0000000 14.9350000 17.6510000 9.5040000 + 366 366 1 0.0000000 12.2200000 17.6510000 6.7890000 + 367 367 1 0.0000000 12.2200000 20.3660000 9.5040000 + 368 368 1 0.0000000 14.9350000 20.3660000 6.7890000 + 369 369 1 0.0000000 10.8620000 16.2930000 10.8620000 + 370 370 1 0.0000000 10.8620000 19.0080000 13.5770000 + 371 371 1 0.0000000 13.5770000 19.0080000 10.8620000 + 372 372 1 0.0000000 13.5770000 16.2930000 13.5770000 + 373 373 1 0.0000000 14.9350000 17.6510000 14.9350000 + 374 374 1 0.0000000 12.2200000 17.6510000 12.2200000 + 375 375 1 0.0000000 12.2200000 20.3660000 14.9350000 + 376 376 1 0.0000000 14.9350000 20.3660000 12.2200000 + 377 377 1 0.0000000 10.8620000 16.2930000 16.2930000 + 378 378 1 0.0000000 10.8620000 19.0080000 19.0080000 + 379 379 1 0.0000000 13.5770000 19.0080000 16.2930000 + 380 380 1 0.0000000 13.5770000 16.2930000 19.0080000 + 381 381 1 0.0000000 14.9350000 17.6510000 20.3660000 + 382 382 1 0.0000000 12.2200000 17.6510000 17.6510000 + 383 383 1 0.0000000 12.2200000 20.3660000 20.3660000 + 384 384 1 0.0000000 14.9350000 20.3660000 17.6510000 + 385 385 1 0.0000000 16.2930000 0.0000000 0.0000000 + 386 386 1 0.0000000 16.2930000 2.7150000 2.7150000 + 387 387 1 0.0000000 19.0080000 2.7150000 0.0000000 + 388 388 1 0.0000000 19.0080000 0.0000000 2.7150000 + 389 389 1 0.0000000 20.3660000 1.3580000 4.0730000 + 390 390 1 0.0000000 17.6510000 1.3580000 1.3580000 + 391 391 1 0.0000000 17.6510000 4.0730000 4.0730000 + 392 392 1 0.0000000 20.3660000 4.0730000 1.3580000 + 393 393 1 0.0000000 16.2930000 0.0000000 5.4310000 + 394 394 1 0.0000000 16.2930000 2.7150000 8.1460000 + 395 395 1 0.0000000 19.0080000 2.7150000 5.4310000 + 396 396 1 0.0000000 19.0080000 0.0000000 8.1460000 + 397 397 1 0.0000000 20.3660000 1.3580000 9.5040000 + 398 398 1 0.0000000 17.6510000 1.3580000 6.7890000 + 399 399 1 0.0000000 17.6510000 4.0730000 9.5040000 + 400 400 1 0.0000000 20.3660000 4.0730000 6.7890000 + 401 401 1 0.0000000 16.2930000 0.0000000 10.8620000 + 402 402 1 0.0000000 16.2930000 2.7150000 13.5770000 + 403 403 1 0.0000000 19.0080000 2.7150000 10.8620000 + 404 404 1 0.0000000 19.0080000 0.0000000 13.5770000 + 405 405 1 0.0000000 20.3660000 1.3580000 14.9350000 + 406 406 1 0.0000000 17.6510000 1.3580000 12.2200000 + 407 407 1 0.0000000 17.6510000 4.0730000 14.9350000 + 408 408 1 0.0000000 20.3660000 4.0730000 12.2200000 + 409 409 1 0.0000000 16.2930000 0.0000000 16.2930000 + 410 410 1 0.0000000 16.2930000 2.7150000 19.0080000 + 411 411 1 0.0000000 19.0080000 2.7150000 16.2930000 + 412 412 1 0.0000000 19.0080000 0.0000000 19.0080000 + 413 413 1 0.0000000 20.3660000 1.3580000 20.3660000 + 414 414 1 0.0000000 17.6510000 1.3580000 17.6510000 + 415 415 1 0.0000000 17.6510000 4.0730000 20.3660000 + 416 416 1 0.0000000 20.3660000 4.0730000 17.6510000 + 417 417 1 0.0000000 16.2930000 5.4310000 0.0000000 + 418 418 1 0.0000000 16.2930000 8.1460000 2.7150000 + 419 419 1 0.0000000 19.0080000 8.1460000 0.0000000 + 420 420 1 0.0000000 19.0080000 5.4310000 2.7150000 + 421 421 1 0.0000000 20.3660000 6.7890000 4.0730000 + 422 422 1 0.0000000 17.6510000 6.7890000 1.3580000 + 423 423 1 0.0000000 17.6510000 9.5040000 4.0730000 + 424 424 1 0.0000000 20.3660000 9.5040000 1.3580000 + 425 425 1 0.0000000 16.2930000 5.4310000 5.4310000 + 426 426 1 0.0000000 16.2930000 8.1460000 8.1460000 + 427 427 1 0.0000000 19.0080000 8.1460000 5.4310000 + 428 428 1 0.0000000 19.0080000 5.4310000 8.1460000 + 429 429 1 0.0000000 20.3660000 6.7890000 9.5040000 + 430 430 1 0.0000000 17.6510000 6.7890000 6.7890000 + 431 431 1 0.0000000 17.6510000 9.5040000 9.5040000 + 432 432 1 0.0000000 20.3660000 9.5040000 6.7890000 + 433 433 1 0.0000000 16.2930000 5.4310000 10.8620000 + 434 434 1 0.0000000 16.2930000 8.1460000 13.5770000 + 435 435 1 0.0000000 19.0080000 8.1460000 10.8620000 + 436 436 1 0.0000000 19.0080000 5.4310000 13.5770000 + 437 437 1 0.0000000 20.3660000 6.7890000 14.9350000 + 438 438 1 0.0000000 17.6510000 6.7890000 12.2200000 + 439 439 1 0.0000000 17.6510000 9.5040000 14.9350000 + 440 440 1 0.0000000 20.3660000 9.5040000 12.2200000 + 441 441 1 0.0000000 16.2930000 5.4310000 16.2930000 + 442 442 1 0.0000000 16.2930000 8.1460000 19.0080000 + 443 443 1 0.0000000 19.0080000 8.1460000 16.2930000 + 444 444 1 0.0000000 19.0080000 5.4310000 19.0080000 + 445 445 1 0.0000000 20.3660000 6.7890000 20.3660000 + 446 446 1 0.0000000 17.6510000 6.7890000 17.6510000 + 447 447 1 0.0000000 17.6510000 9.5040000 20.3660000 + 448 448 1 0.0000000 20.3660000 9.5040000 17.6510000 + 449 449 1 0.0000000 16.2930000 10.8620000 0.0000000 + 450 450 1 0.0000000 16.2930000 13.5770000 2.7150000 + 451 451 1 0.0000000 19.0080000 13.5770000 0.0000000 + 452 452 1 0.0000000 19.0080000 10.8620000 2.7150000 + 453 453 1 0.0000000 20.3660000 12.2200000 4.0730000 + 454 454 1 0.0000000 17.6510000 12.2200000 1.3580000 + 455 455 1 0.0000000 17.6510000 14.9350000 4.0730000 + 456 456 1 0.0000000 20.3660000 14.9350000 1.3580000 + 457 457 1 0.0000000 16.2930000 10.8620000 5.4310000 + 458 458 1 0.0000000 16.2930000 13.5770000 8.1460000 + 459 459 1 0.0000000 19.0080000 13.5770000 5.4310000 + 460 460 1 0.0000000 19.0080000 10.8620000 8.1460000 + 461 461 1 0.0000000 20.3660000 12.2200000 9.5040000 + 462 462 1 0.0000000 17.6510000 12.2200000 6.7890000 + 463 463 1 0.0000000 17.6510000 14.9350000 9.5040000 + 464 464 1 0.0000000 20.3660000 14.9350000 6.7890000 + 465 465 1 0.0000000 16.2930000 10.8620000 10.8620000 + 466 466 1 0.0000000 16.2930000 13.5770000 13.5770000 + 467 467 1 0.0000000 19.0080000 13.5770000 10.8620000 + 468 468 1 0.0000000 19.0080000 10.8620000 13.5770000 + 469 469 1 0.0000000 20.3660000 12.2200000 14.9350000 + 470 470 1 0.0000000 17.6510000 12.2200000 12.2200000 + 471 471 1 0.0000000 17.6510000 14.9350000 14.9350000 + 472 472 1 0.0000000 20.3660000 14.9350000 12.2200000 + 473 473 1 0.0000000 16.2930000 10.8620000 16.2930000 + 474 474 1 0.0000000 16.2930000 13.5770000 19.0080000 + 475 475 1 0.0000000 19.0080000 13.5770000 16.2930000 + 476 476 1 0.0000000 19.0080000 10.8620000 19.0080000 + 477 477 1 0.0000000 20.3660000 12.2200000 20.3660000 + 478 478 1 0.0000000 17.6510000 12.2200000 17.6510000 + 479 479 1 0.0000000 17.6510000 14.9350000 20.3660000 + 480 480 1 0.0000000 20.3660000 14.9350000 17.6510000 + 481 481 1 0.0000000 16.2930000 16.2930000 0.0000000 + 482 482 1 0.0000000 16.2930000 19.0080000 2.7150000 + 483 483 1 0.0000000 19.0080000 19.0080000 0.0000000 + 484 484 1 0.0000000 19.0080000 16.2930000 2.7150000 + 485 485 1 0.0000000 20.3660000 17.6510000 4.0730000 + 486 486 1 0.0000000 17.6510000 17.6510000 1.3580000 + 487 487 1 0.0000000 17.6510000 20.3660000 4.0730000 + 488 488 1 0.0000000 20.3660000 20.3660000 1.3580000 + 489 489 1 0.0000000 16.2930000 16.2930000 5.4310000 + 490 490 1 0.0000000 16.2930000 19.0080000 8.1460000 + 491 491 1 0.0000000 19.0080000 19.0080000 5.4310000 + 492 492 1 0.0000000 19.0080000 16.2930000 8.1460000 + 493 493 1 0.0000000 20.3660000 17.6510000 9.5040000 + 494 494 1 0.0000000 17.6510000 17.6510000 6.7890000 + 495 495 1 0.0000000 17.6510000 20.3660000 9.5040000 + 496 496 1 0.0000000 20.3660000 20.3660000 6.7890000 + 497 497 1 0.0000000 16.2930000 16.2930000 10.8620000 + 498 498 1 0.0000000 16.2930000 19.0080000 13.5770000 + 499 499 1 0.0000000 19.0080000 19.0080000 10.8620000 + 500 500 1 0.0000000 19.0080000 16.2930000 13.5770000 + 501 501 1 0.0000000 20.3660000 17.6510000 14.9350000 + 502 502 1 0.0000000 17.6510000 17.6510000 12.2200000 + 503 503 1 0.0000000 17.6510000 20.3660000 14.9350000 + 504 504 1 0.0000000 20.3660000 20.3660000 12.2200000 + 505 505 1 0.0000000 16.2930000 16.2930000 16.2930000 + 506 506 1 0.0000000 16.2930000 19.0080000 19.0080000 + 507 507 1 0.0000000 19.0080000 19.0080000 16.2930000 + 508 508 1 0.0000000 19.0080000 16.2930000 19.0080000 + 509 509 1 0.0000000 20.3660000 17.6510000 20.3660000 + 510 510 1 0.0000000 17.6510000 17.6510000 17.6510000 + 511 511 1 0.0000000 17.6510000 20.3660000 20.3660000 + 512 512 1 0.0000000 20.3660000 20.3660000 17.6510000 + diff --git a/examples/USER/phonon/third_order_command/lmp_bank/silicon_8.lmp b/examples/USER/phonon/third_order_command/lmp_bank/silicon_8.lmp new file mode 100755 index 0000000000..5066049895 --- /dev/null +++ b/examples/USER/phonon/third_order_command/lmp_bank/silicon_8.lmp @@ -0,0 +1,29 @@ +LAMMPS description + + 8 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 5.4310000 xlo xhi + 0.0000000 5.4310000 ylo yhi + 0.0000000 5.4310000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 + 2 2 1 0.0000000 1.3577500 1.3577500 1.3572000 + 3 3 1 0.0000000 2.7155000 2.7155000 0.0000000 + 4 4 1 0.0000000 4.0732500 4.0732500 1.3572000 + 5 5 1 0.0000000 2.7155000 0.0000000 2.7144000 + 6 6 1 0.0000000 4.0732500 1.3577500 4.0732500 + 7 7 1 0.0000000 0.0000000 2.7155000 2.7155000 + 8 8 1 0.0000000 1.3577500 4.0732500 4.0732500 diff --git a/examples/USER/phonon/third_order_command/results/out.silicon b/examples/USER/phonon/third_order_command/results/out.silicon new file mode 100755 index 0000000000..0729dc549c --- /dev/null +++ b/examples/USER/phonon/third_order_command/results/out.silicon @@ -0,0 +1,58 @@ +LAMMPS (16 Jul 2018) +Reading data file ... + orthogonal box = (0 0 0) to (5.431 5.431 5.431) + 2 by 2 by 1 MPI processor grid + reading atoms ... + 8 atoms +Finding 1-2 1-3 1-4 neighbors ... + special bond factors lj: 0 0 0 + special bond factors coul: 0 0 0 + 0 = max # of 1-2 neighbors + 0 = max # of 1-3 neighbors + 0 = max # of 1-4 neighbors + 1 = max # of special neighbors +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 4 + ghost atom cutoff = 4 + binsize = 2, bins = 3 3 3 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair tersoff, perpetual + attributes: full, newton on + pair build: full/bin + stencil: full/bin/3d + bin: standard +Calculating Anharmonic Dynamical Matrix... +Third Order calculation took 0.043923 seconds +Finished Calculating Third Order Tensor +Loop time of 1.22619e+06 on 4 procs for 0 steps with 8 atoms + +0.0% 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.013707 | 0.016582 | 0.019588 | 2.2 | 0.00 +Bond | 8.1341e-05 | 8.7207e-05 | 9.3228e-05 | 0.0 | 0.00 +Neigh | 0 | 0 | 0 | 0.0 | 0.00 +Comm | 0.019285 | 0.022435 | 0.025684 | 2.0 | 0.00 +Output | 0 | 0 | 0 | 0.0 | 0.00 +Modify | 0 | 0 | 0 | 0.0 | 0.00 +Other | | 1.226e+06 | | |100.00 + +Nlocal: 2 ave 2 max 2 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Nghost: 56 ave 56 max 56 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 32 ave 32 max 32 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 128 +Ave neighs/atom = 16 +Ave special neighs/atom = 0 +Neighbor list builds = 0 +Dangerous builds = 0 +Total wall time: 0:00:00 diff --git a/examples/USER/phonon/third_order_command/results/third_order b/examples/USER/phonon/third_order_command/results/third_order new file mode 100755 index 0000000000..276896aa1f --- /dev/null +++ b/examples/USER/phonon/third_order_command/results/third_order @@ -0,0 +1,4608 @@ +1 1 1 1 1 -0.08569589 0.16067980 137.35980742 +1 1 1 1 2 -74170.35399415 -67130.60762609 -67084.85673024 +1 1 1 1 3 -0.10711987 -0.00000000 -5.61308111 +1 1 1 1 4 74170.34328216 67130.75759390 -67084.54608262 +1 1 1 1 5 -0.00000000 -0.00000000 -15.01820557 +1 1 1 1 6 74116.35486843 -67012.24017136 67025.88724261 +1 1 1 1 7 -0.00000000 -0.00000000 1.11404663 +1 1 1 1 8 -74116.23703657 67011.98308368 67025.60873095 +1 1 1 2 1 -0.23566371 -0.27851166 329269.69018077 +1 1 1 2 2 -72106.38979127 -72095.95631608 -80899.99905481 +1 1 1 2 3 -0.05355993 -0.00000000 -11783.78540967 +1 1 1 2 4 72106.62545498 72096.21340376 -80900.41682229 +1 1 1 2 5 -0.03213596 -0.00000000 2960.49323056 +1 1 1 2 6 -71998.20943604 72010.66747675 -80803.98751664 +1 1 1 2 7 0.02142397 -0.00000000 2961.59656521 +1 1 1 2 8 71998.19872405 -72010.69961271 -80803.91253273 +1 1 1 3 1 141.59104222 329281.45194233 0.41776749 +1 1 1 3 2 -72074.53234237 -80911.53586465 -72064.09886718 +1 1 1 3 3 3.98485911 2969.85550707 0.02142397 +1 1 1 3 4 -72074.54305436 -80911.38589683 72064.09886718 +1 1 1 3 5 -9.64078817 -11781.34307667 0.02142397 +1 1 1 3 6 72006.30769810 -80801.86654325 72002.14073522 +1 1 1 3 7 0.14996782 2957.19393861 0.04284795 +1 1 1 3 8 72006.66119367 -80802.35929464 -72002.55850270 +1 2 1 1 1 -0.40705550 -0.47132742 329270.04367633 +1 2 1 1 2 -72106.28267140 -72095.84919621 -80899.90264692 +1 2 1 1 3 -0.01071199 0.02142397 -11783.93537749 +1 2 1 1 4 72106.66830293 72096.21340376 -80900.26685448 +1 2 1 1 5 0.02142397 -0.04284795 2960.53607851 +1 2 1 1 6 -71998.40225180 72010.90314046 -80804.15890843 +1 2 1 1 7 0.02142397 -0.00000000 2961.59656521 +1 2 1 1 8 71998.34869187 -72010.95670040 -80804.09463651 +1 2 1 2 1 -0.04284795 0.67485517 115.02531483 +1 2 1 2 2 -67122.33797224 -74173.02127888 -67083.27135618 +1 2 1 2 3 -0.02142397 -0.00000000 -9.94072380 +1 2 1 2 4 67121.93091674 74172.77490318 -67083.11067638 +1 2 1 2 5 0.05355993 0.06427192 9.89787585 +1 2 1 2 6 67020.89545674 -74109.38136498 67027.62258448 +1 2 1 2 7 0.02142397 0.05355993 -3.84560328 +1 2 1 2 8 -67020.63836905 74109.15641326 67027.31193686 +1 2 1 3 1 329282.72666877 112.65796573 -0.08569589 +1 2 1 3 2 -80915.37075594 -72065.54498540 -72064.36666685 +1 2 1 3 3 2970.09117078 3.04220427 0.14996782 +1 2 1 3 4 -80913.63541407 -72065.98417686 72064.89155420 +1 2 1 3 5 2958.71504075 -9.59794022 -0.14996782 +1 2 1 3 6 -80800.75249661 72013.73110499 -72002.46209482 +1 2 1 3 7 -11780.59323759 -2.52802890 -0.67485517 +1 2 1 3 8 -80801.13812814 72014.00961665 72002.82630238 +1 3 1 1 1 140.26275585 329282.54456499 0.53559934 +1 3 1 1 2 -72074.61803826 -80911.60013657 -72064.25954698 +1 3 1 1 3 3.90987520 2969.74838720 -0.02142397 +1 3 1 1 4 -72074.26454270 -80911.32162491 72063.88462744 +1 3 1 1 5 -9.58722823 -11781.32165269 0.04284795 +1 3 1 1 6 72007.00397725 -80802.53068643 72002.74060648 +1 3 1 1 7 0.06427192 2957.16180265 -0.00000000 +1 3 1 1 8 72007.17536904 -80802.77706213 -72002.90128628 +1 3 1 2 1 329282.94090850 111.04045572 0.63200722 +1 3 1 2 2 -80915.52072376 -72065.59854533 -72064.48449870 +1 3 1 2 3 2969.99476290 2.93508440 -0.04284795 +1 3 1 2 4 -80913.01411883 -72065.17006586 72064.14171512 +1 3 1 2 5 2958.13659346 -10.43347519 0.42847947 +1 3 1 2 6 -80801.11670417 72014.05246460 -72002.80487840 +1 3 1 2 7 -11780.50754169 -2.72084466 -0.54631133 +1 3 1 2 8 -80800.85961648 72016.01275819 72002.63348661 +1 3 1 3 1 0.29993563 0.22495172 -12.59729654 +1 3 1 3 2 -67096.11502842 -67094.33683860 -74102.86847698 +1 3 1 3 3 -0.02142397 -0.04284795 1.13547061 +1 3 1 3 4 67095.81509279 67094.12259887 -74102.69708519 +1 3 1 3 5 -0.01071199 0.02142397 6.64143185 +1 3 1 3 6 67033.98550467 -67031.45747577 74105.22511409 +1 3 1 3 7 0.06427192 0.04284795 -0.27851166 +1 3 1 3 8 -67033.98550467 67031.28608399 74105.19297812 +1 1 2 1 1 -74175.17438824 -72109.17490785 -72075.08936569 +1 1 2 1 2 74174.06034160 72107.35387009 72071.88648162 +1 1 2 1 3 -0.43919146 538.62012295 1558.31557547 +1 1 2 1 4 -0.35349557 -538.98433050 -1559.15111044 +1 1 2 1 5 -0.36420755 1559.70813376 538.94148255 +1 1 2 1 6 -0.12854384 -1560.65078860 -539.26284216 +1 1 2 1 7 -9470.57469669 -3063.11406462 -3059.55768498 +1 1 2 1 8 9472.97418175 3066.31694869 3063.78891979 +1 1 2 2 1 -67136.04931541 -72094.55304580 -80912.33926366 +1 1 2 2 2 72108.78927633 67119.37075188 80912.66062327 +1 1 2 2 3 0.12854384 -537.80601195 3074.38307479 +1 1 2 2 4 538.66297089 -0.51417537 -3074.31880286 +1 1 2 2 5 -888.64500536 3068.44863407 94.71538776 +1 1 2 2 6 -1558.04777580 -0.68556716 -3077.83233455 +1 1 2 2 7 -1.34971034 1557.43719255 3075.86132897 +1 1 2 2 8 -3063.41400025 888.27008582 -93.10858973 +1 1 2 3 1 -67090.58764320 -80900.65248600 -72062.44922120 +1 1 2 3 2 72070.46178737 80911.33233690 67094.67962218 +1 1 2 3 3 -893.59394329 83.29640977 3055.78706561 +1 1 2 3 4 -1559.26894230 -3074.61873850 -0.59987126 +1 1 2 3 5 0.09640788 3080.91738677 -536.26348584 +1 1 2 3 6 535.97426219 -3081.11020253 0.40705550 +1 1 2 3 7 2.59230082 3075.91488891 1559.82596561 +1 1 2 3 8 -3065.72778941 -94.97247544 888.65571735 +1 2 2 1 1 -72106.94681459 -67126.03360770 -80913.12123870 +1 2 2 1 2 67141.76951639 72094.19955023 80912.06075200 +1 2 2 1 3 -539.33782607 0.81411100 3074.21168300 +1 2 2 1 4 -0.52488736 538.66297089 -3074.36165081 +1 2 2 1 5 1559.22609435 1.82103777 3080.51033127 +1 2 2 1 6 888.24866185 -3063.37115230 -93.06574178 +1 2 2 1 7 3058.20797464 -887.99157416 91.65175952 +1 2 2 1 8 -0.68556716 -1558.01563984 -3077.80019859 +1 2 2 2 1 -72096.51333939 -74176.32057083 -72068.06230231 +1 2 2 2 2 72097.11321066 74179.99478232 72069.75479623 +1 2 2 2 3 539.58420176 0.83553497 1559.92237350 +1 2 2 2 4 -539.03789043 -0.38563153 -1559.19395839 +1 2 2 2 5 -3068.12727446 -9477.28040046 -3066.73471617 +1 2 2 2 6 3066.27410074 9473.03845367 3063.79963178 +1 2 2 2 7 1561.40062768 0.28922365 539.62704971 +1 2 2 2 8 -1560.62936463 -0.13925583 -539.18785825 +1 2 2 3 1 -80898.98141606 -67086.42068032 -72061.12093483 +1 2 2 3 2 80909.30777138 72063.89533942 67096.43638803 +1 2 2 3 3 82.96433818 -893.33685560 3055.82991356 +1 2 2 3 4 -3074.65087446 -1559.32250223 -0.51417537 +1 2 2 3 5 3079.44984457 2.18524532 1557.22295281 +1 2 2 3 6 -94.92962749 -3065.77063736 888.60215741 +1 2 2 3 7 3077.91803045 2.61372479 -536.88478108 +1 2 2 3 8 -3081.11020253 535.98497418 0.33207159 +1 3 2 1 1 -72074.61803826 -80912.03932803 -67095.49373318 +1 3 2 1 2 67095.17237358 80902.98769914 72062.60990100 +1 3 2 1 3 1560.09376528 3074.55446658 0.55702332 +1 3 2 1 4 893.75462309 -83.27498580 -3055.65852177 +1 3 2 1 5 -535.98497418 3081.32444227 0.36420755 +1 3 2 1 6 -1.04977471 -3079.24631682 536.43487763 +1 3 2 1 7 3063.56396806 94.23334835 -889.21274066 +1 3 2 1 8 -1.07119869 -3078.63573357 -1559.47247005 +1 3 2 2 1 -80910.85029749 -72067.94447046 -67097.26121101 +1 3 2 2 2 80903.20193888 67084.63177851 72063.35974008 +1 3 2 2 3 3074.38307479 1558.70120699 0.29993563 +1 3 2 2 4 -83.26427381 893.74391110 -3055.63709779 +1 3 2 2 5 95.32597101 3067.67737102 -887.93801423 +1 3 2 2 6 -3078.63573357 -1.07119869 -1559.49389402 +1 3 2 2 7 3079.13919695 -534.68882377 0.25708768 +1 3 2 2 8 -3079.24631682 -1.03906272 536.42416564 +1 3 2 3 1 -72064.05601923 -72064.52734665 -74113.78399158 +1 3 2 3 2 72063.22048425 72066.00560083 74113.03415250 +1 3 2 3 3 -3055.10149845 -3055.55140190 -9478.75865465 +1 3 2 3 4 3055.31573819 3055.31573819 9478.65153478 +1 3 2 3 5 539.07002640 1555.42333902 -1.69249392 +1 3 2 3 6 -538.30947533 -1556.36599386 2.82796453 +1 3 2 3 7 1556.32314591 538.11665957 -3.12790016 +1 3 2 3 8 -1556.38741783 -538.30947533 2.82796453 +1 1 3 1 1 -0.04284795 -0.11783186 8.28036584 +1 1 3 1 2 -0.59987126 -0.00000000 -897.62165034 +1 1 3 1 3 0.01071199 0.02142397 8.03399014 +1 1 3 1 4 0.71770312 -0.08569589 -897.27886676 +1 1 3 1 5 0.05355993 0.04284795 2.27094121 +1 1 3 1 6 -0.68556716 -0.10711987 887.72377449 +1 1 3 1 7 -0.02142397 -0.00000000 1.26401445 +1 1 3 1 8 0.66414318 0.06427192 887.68092654 +1 1 3 2 1 -0.02142397 0.08569589 2968.58078064 +1 1 3 2 2 538.32018732 -538.32018732 85.43880714 +1 1 3 2 3 0.01071199 0.02142397 2968.54864468 +1 1 3 2 4 -538.30947533 538.32018732 85.52450304 +1 1 3 2 5 -0.06427192 -0.06427192 -3372.04776546 +1 1 3 2 6 538.38445924 538.25591539 89.29512241 +1 1 3 2 7 0.02142397 0.02142397 -2914.08890352 +1 1 3 2 8 -538.27733937 -538.30947533 89.25227446 +1 1 3 3 1 -6.23437635 -11785.64929538 -0.03213596 +1 1 3 3 2 1558.93687070 3074.91867413 3058.37936643 +1 1 3 3 3 5.55952118 2970.56249821 -0.04284795 +1 1 3 3 4 1559.02256660 3074.85440221 -3058.22939861 +1 1 3 3 5 0.74983908 -2915.35291796 -0.00000000 +1 1 3 3 6 -1559.30107826 3076.86825574 -3062.21425772 +1 1 3 3 7 0.62129524 -573.29482439 -0.01071199 +1 1 3 3 8 -1559.38677415 3076.90039170 3062.23568169 +1 2 3 1 1 -0.04284795 0.05355993 2968.54864468 +1 2 3 1 2 -539.11287434 538.98433050 85.03175164 +1 2 3 1 3 0.03213596 -0.02142397 2968.54864468 +1 2 3 1 4 539.09145037 -539.02717845 85.09602356 +1 2 3 1 5 0.01071199 0.02142397 -2914.00320762 +1 2 3 1 6 -537.57034824 -537.63462016 89.59505804 +1 2 3 1 7 0.02142397 -0.00000000 -3372.06918943 +1 2 3 1 8 537.61319618 537.57034824 89.45580221 +1 2 3 2 1 -0.02142397 -0.08569589 8.09826206 +1 2 3 2 2 0.04284795 0.68556716 -897.55737842 +1 2 3 2 3 0.04284795 -0.00000000 8.29107782 +1 2 3 2 4 -0.04284795 -0.66414318 -897.45025855 +1 2 3 2 5 -0.09640788 0.06427192 2.22809327 +1 2 3 2 6 -0.12854384 -0.66414318 887.76662244 +1 2 3 2 7 -0.00000000 -0.04284795 1.24259047 +1 2 3 2 8 0.12854384 0.57844729 887.45597482 +1 2 3 3 1 -11785.58502346 -11.39755401 0.05355993 +1 2 3 3 2 3074.81155426 1560.56509271 3058.33651848 +1 2 3 3 3 2970.42324238 5.74162495 -0.02142397 +1 2 3 3 4 3074.92938612 1560.54366873 -3058.18655066 +1 2 3 3 5 -573.21984048 -0.64271921 -0.04284795 +1 2 3 3 6 3076.93252766 -1557.95136791 3062.29995362 +1 2 3 3 7 -2915.35291796 0.93194286 0.03213596 +1 2 3 3 8 3076.99679958 -1557.88709599 -3062.38564951 +1 3 3 1 1 5.84874482 2970.57321019 -0.05355993 +1 3 3 1 2 1560.52224476 3074.89725015 -3058.31509451 +1 3 3 1 3 -11.38684202 -11785.64929538 0.02142397 +1 3 3 1 4 1560.46868482 3074.89725015 3058.22939861 +1 3 3 1 5 -0.64271921 -573.24126446 -0.04284795 +1 3 3 1 6 -1557.92994394 3076.95395163 3062.29995362 +1 3 3 1 7 0.87838292 -2915.31007002 0.01071199 +1 3 3 1 8 -1557.84424805 3077.00751156 -3062.35351355 +1 3 3 2 1 2970.51965026 5.62379310 0.02142397 +1 3 3 2 2 3075.02579400 1559.04399057 -3058.50791027 +1 3 3 2 3 -11785.63858339 -6.36292019 -0.02142397 +1 3 3 2 4 3074.98294605 1559.00114263 3058.40079040 +1 3 3 2 5 -2915.36362995 0.68556716 0.02142397 +1 3 3 2 6 3076.86825574 -1559.45104607 -3062.29995362 +1 3 3 2 7 -573.30553638 0.65343120 0.07498391 +1 3 3 2 8 3076.82540779 -1559.41891011 3062.05357792 +1 3 3 3 1 0.02142397 -0.02142397 3.99557110 +1 3 3 3 2 0.12854384 -0.14996782 -9480.12978896 +1 3 3 3 3 0.01071199 -0.04284795 4.11340295 +1 3 3 3 4 -0.11783186 0.21423974 -9480.02266909 +1 3 3 3 5 -0.03213596 -0.04284795 2.63514877 +1 3 3 3 6 0.17139179 0.17139179 9473.93826056 +1 3 3 3 7 -0.04284795 -0.01071199 1.81032578 +1 3 3 3 8 -0.12854384 -0.18210378 9473.88470063 +1 1 4 1 1 74175.53859579 72109.64623527 -72075.37858933 +1 1 4 1 2 0.38563153 539.01646646 -1559.19395839 +1 1 4 1 3 0.43919146 -538.55585103 1558.25130355 +1 1 4 1 4 -74174.42454916 -72107.78234956 72072.32567308 +1 1 4 1 5 0.35349557 -1559.70813376 538.96290653 +1 1 4 1 6 -9473.02774168 -3066.32766067 3063.77820780 +1 1 4 1 7 9470.57469669 3063.09264064 -3059.56839697 +1 1 4 1 8 0.12854384 1560.64007661 -539.19857024 +1 1 4 2 1 67136.69203462 72095.08864514 -80912.77845512 +1 1 4 2 2 -538.66297089 0.54631133 -3074.35093883 +1 1 4 2 3 -0.11783186 537.82743592 3074.51161863 +1 1 4 2 4 -72109.31416368 -67119.98133513 80913.20693460 +1 1 4 2 5 888.67714132 -3068.49148202 94.73681173 +1 1 4 2 6 3063.40328826 -888.25937383 -93.10858973 +1 1 4 2 7 1.32828637 -1557.45861652 3075.82919301 +1 1 4 2 8 1558.01563984 0.65343120 -3077.82162257 +1 1 4 3 1 -67090.65191512 -80900.84530177 72062.58847703 +1 1 4 3 2 -1559.32250223 -3074.66158644 0.51417537 +1 1 4 3 3 -893.62607925 83.29640977 -3055.78706561 +1 1 4 3 4 72070.57961922 80911.49301670 -67094.76531808 +1 1 4 3 5 0.07498391 3080.85311485 536.26348584 +1 1 4 3 6 -3065.74921338 -94.95105147 -888.66642933 +1 1 4 3 7 2.59230082 3075.91488891 -1559.81525363 +1 1 4 3 8 535.96355021 -3081.13162650 -0.33207159 +1 2 4 1 1 72107.56810982 67126.64419095 -80913.82822983 +1 2 4 1 2 0.53559934 -538.63083493 -3074.35093883 +1 2 4 1 3 539.32711408 -0.79268703 3074.16883505 +1 2 4 1 4 -67142.43365957 -72094.82084547 80912.58563936 +1 2 4 1 5 -1559.23680634 -1.79961379 3080.44605934 +1 2 4 1 6 0.68556716 1558.03706381 -3077.81091058 +1 2 4 1 7 -3058.22939861 888.00228615 91.66247150 +1 2 4 1 8 -888.25937383 3063.38186429 -93.10858973 +1 2 4 2 1 72096.32052363 74176.06348314 -72067.88019853 +1 2 4 2 2 539.00575447 0.38563153 -1559.21538236 +1 2 4 2 3 -539.56277779 -0.83553497 1560.00806939 +1 2 4 2 4 -72096.73829112 -74179.71627066 72069.56198047 +1 2 4 2 5 3068.15941042 9477.28040046 -3066.62759630 +1 2 4 2 6 1560.67221257 0.08569589 -539.17714626 +1 2 4 2 7 -1561.46489960 -0.25708768 539.63776170 +1 2 4 2 8 -3066.32766067 -9473.00631771 3063.81034376 +1 2 4 3 1 -80898.55293658 -67086.00291283 72060.77815125 +1 2 4 3 2 -3074.66158644 -1559.30107826 0.52488736 +1 2 4 3 3 82.97505016 -893.35827957 -3055.91560945 +1 2 4 3 4 80908.90071588 72063.49899591 -67096.11502842 +1 2 4 3 5 3079.44984457 2.18524532 -1557.20152883 +1 2 4 3 6 -3081.11020253 535.98497418 -0.29993563 +1 2 4 3 7 3077.91803045 2.60301281 536.90620505 +1 2 4 3 8 -94.95105147 -3065.73850140 -888.68785331 +1 3 4 1 1 -72074.72515813 -80912.17858386 67095.54729312 +1 3 4 1 2 893.78675905 -83.20000189 3055.80848958 +1 3 4 1 3 1560.10447727 3074.55446658 -0.51417537 +1 3 4 1 4 67095.30091742 80903.13766695 -72062.59918902 +1 3 4 1 5 -535.98497418 3081.32444227 -0.29993563 +1 3 4 1 6 -1.08191067 -3078.64644555 1559.45104607 +1 3 4 1 7 3063.58539204 94.23334835 889.22345265 +1 3 4 1 8 -1.09262266 -3079.24631682 -536.45630160 +1 3 4 2 1 -80910.78602557 -72067.71951873 67097.07910724 +1 3 4 2 2 -83.18928990 893.78675905 3055.80848958 +1 3 4 2 3 3074.40449876 1558.70120699 -0.34278358 +1 3 4 2 4 80903.01983510 67084.28899493 -72063.26333220 +1 3 4 2 5 95.28312306 3067.72021896 887.87374231 +1 3 4 2 6 -3079.25702880 -1.09262266 -536.43487763 +1 3 4 2 7 3079.16062092 -534.65668781 -0.28922365 +1 3 4 2 8 -3078.60359761 -1.07119869 1559.44033409 +1 3 4 3 1 72063.67038770 72064.06673121 -74113.23768025 +1 3 4 3 2 -3055.27289024 -3055.28360223 9478.69438273 +1 3 4 3 3 3055.10149845 3055.52997792 -9478.73723067 +1 3 4 3 4 -72062.68488491 -72065.59854533 74112.61638501 +1 3 4 3 5 -539.04860242 -1555.38049107 -1.75676584 +1 3 4 3 6 1556.38741783 538.34161129 2.87081248 +1 3 4 3 7 -1556.32314591 -538.12737155 -3.14932413 +1 3 4 3 8 538.36303526 1556.38741783 2.82796453 +1 1 5 1 1 -0.04284795 0.12854384 -9.14803677 +1 1 5 1 2 -0.85695895 -890.25180339 -0.25708768 +1 1 5 1 3 -0.04284795 -0.04284795 0.94265484 +1 1 5 1 4 0.83553497 890.23037941 -0.08569589 +1 1 5 1 5 -0.01071199 -0.02142397 13.26143972 +1 1 5 1 6 -0.55702332 -889.58766020 -2.52802890 +1 1 5 1 7 0.02142397 0.02142397 0.41776749 +1 1 5 1 8 0.53559934 889.57694822 -2.50660492 +1 1 5 2 1 -0.04284795 -0.02142397 -11786.34557453 +1 1 5 2 2 1560.77933244 3069.28416904 3081.34586624 +1 1 5 2 3 0.01071199 -0.06427192 -2915.33149399 +1 1 5 2 4 -1560.81146840 -3069.32701699 3081.62437790 +1 1 5 2 5 -0.05355993 0.02142397 2966.14915962 +1 1 5 2 6 1558.05848778 -3056.34408893 3073.69750763 +1 1 5 2 7 0.10711987 -0.04284795 -574.38744705 +1 1 5 2 8 -1558.07991176 3056.32266495 3073.71893160 +1 1 5 3 1 -12.89723217 2960.13973500 -0.01071199 +1 1 5 3 2 538.34161129 94.00839662 -536.54199750 +1 1 5 3 3 1.45683021 -3372.02634149 0.12854384 +1 1 5 3 4 538.25591539 93.98697265 536.71338929 +1 1 5 3 5 14.45047026 2963.40689099 -0.02142397 +1 1 5 3 6 -539.51992984 87.23842093 536.11351802 +1 1 5 3 7 -0.47132742 -2914.42097511 0.07498391 +1 1 5 3 8 -539.51992984 87.42052471 -536.00639816 +1 2 5 1 1 -0.00000000 0.07498391 2959.63627162 +1 2 5 1 2 1560.45797284 -3069.54125673 3080.44605934 +1 2 5 1 3 0.06427192 -0.00000000 -573.09129664 +1 2 5 1 4 -1560.52224476 3069.45556083 3080.29609153 +1 2 5 1 5 0.01071199 -0.02142397 -11776.30844285 +1 2 5 1 6 1553.10954986 3059.40771717 3071.89789384 +1 2 5 1 7 -0.02142397 -0.00000000 -2914.77447067 +1 2 5 1 8 -1553.08812588 -3059.43985313 3071.76934999 +1 2 5 2 1 -0.00000000 -0.04284795 -8.79454121 +1 2 5 2 2 0.89980690 -9474.64525169 0.83553497 +1 2 5 2 3 0.02142397 -0.04284795 -0.25708768 +1 2 5 2 4 -0.86767094 9474.60240375 0.98550279 +1 2 5 2 5 0.08569589 0.02142397 13.41140754 +1 2 5 2 6 -0.06427192 -9456.17778636 -3.12790016 +1 2 5 2 7 0.04284795 0.03213596 -0.11783186 +1 2 5 2 8 -0.06427192 9456.22063431 -2.93508440 +1 2 5 3 1 2960.70747030 14.27907848 0.02142397 +1 2 5 3 2 3081.15305048 -3068.66287381 1558.33699944 +1 2 5 3 3 -2913.87466378 2.05670148 0.02142397 +1 2 5 3 4 3081.18518644 -3068.62002586 -1558.12275970 +1 2 5 3 5 -11774.21960541 16.62500360 0.02142397 +1 2 5 3 6 3069.88404031 3053.00194903 1560.52224476 +1 2 5 3 7 -574.69809467 -1.49967816 0.01071199 +1 2 5 3 8 3069.88404031 3053.05550896 -1560.61865264 +1 3 5 1 1 -12.49017667 2960.33255076 -0.07498391 +1 3 5 1 2 -536.09209405 94.73681173 538.32018732 +1 3 5 1 3 -0.23566371 -2914.62450286 -0.02142397 +1 3 5 1 4 -536.08138206 94.86535557 -538.42730718 +1 3 5 1 5 16.60357962 2963.59970675 -0.10711987 +1 3 5 1 6 534.72095973 87.49550862 -537.61319618 +1 3 5 1 7 -1.15689458 -3373.67598746 -0.03213596 +1 3 5 1 8 534.69953576 87.46337266 537.66675612 +1 3 5 2 1 -11787.12754957 -8.03399014 0.01071199 +1 3 5 2 2 3081.77434571 3069.28416904 1556.34456989 +1 3 5 2 3 -572.91990485 0.87838292 -0.02142397 +1 3 5 2 4 3081.74220975 3069.32701699 -1556.32314591 +1 3 5 2 5 2963.80323450 -7.96971822 0.10711987 +1 3 5 2 6 3074.42592273 -3061.35729877 1557.22295281 +1 3 5 2 7 -2916.01706115 -0.79268703 0.03213596 +1 3 5 2 8 3074.34022684 -3061.43228268 -1557.42648056 +1 3 5 3 1 -0.02142397 0.06427192 8.23751789 +1 3 5 3 2 -0.12854384 -886.35264017 -2.12097340 +1 3 5 3 3 -0.03213596 -0.06427192 2.54945287 +1 3 5 3 4 0.13925583 886.43833607 -2.22809327 +1 3 5 3 5 0.03213596 0.02142397 -10.17638751 +1 3 5 3 6 0.14996782 -891.38727399 3.04220427 +1 3 5 3 7 -0.00000000 -0.01071199 -2.17453333 +1 3 5 3 8 -0.14996782 891.26944214 2.83867652 +1 1 6 1 1 74116.23703657 -72002.14073522 72008.75003111 +1 1 6 1 2 0.40705550 -1558.13347169 535.67432656 +1 1 6 1 3 -1.28543842 538.64154692 -1558.85117481 +1 1 6 1 4 -9473.03845367 3064.52804688 -3066.00630107 +1 1 6 1 5 -1.07119869 1557.56573639 -539.66989766 +1 1 6 1 6 -74108.24589438 71998.04875624 -71998.13445213 +1 1 6 1 7 9466.48271771 -3061.73221831 3061.35729877 +1 1 6 1 8 0.44990345 -536.77766121 1556.92301718 +1 1 6 2 1 -67015.21810371 72015.84136640 -80796.89618135 +1 1 6 2 2 -1561.93622702 -1.75676584 -3081.76363373 +1 1 6 2 3 -0.53559934 538.51300308 3077.36100713 +1 1 6 2 4 -3066.00630107 -889.33057252 -95.12244326 +1 1 6 2 5 -891.70863360 -3053.55897234 86.12437430 +1 1 6 2 6 71998.32726790 -67051.53173914 80811.14312386 +1 1 6 2 7 0.42847947 -1557.60858433 3076.37550434 +1 1 6 2 8 536.67054134 -0.59987126 -3076.98608759 +1 1 6 3 1 67029.42219827 -80800.94531238 72003.74753324 +1 1 6 3 2 -540.03410521 -3079.38557265 -0.87838292 +1 1 6 3 3 888.95565298 90.49486493 -3062.77128104 +1 1 6 3 4 3063.40328826 -93.02289383 -888.83782112 +1 1 6 3 5 -1.48896617 3074.85440221 536.71338929 +1 1 6 3 6 -71997.32034113 80808.37943125 -67028.09391190 +1 1 6 3 7 -0.62129524 3076.85754375 -1559.46175806 +1 1 6 3 8 1557.69428023 -3077.28602322 -0.32135961 +1 2 6 1 1 -72004.24028464 67024.60180419 -80796.21061419 +1 2 6 1 2 889.39484444 3065.98487709 -95.07959531 +1 2 6 1 3 -537.82743592 0.36420755 3077.46812700 +1 2 6 1 4 1.75676584 1561.87195510 -3081.75292174 +1 2 6 1 5 1553.38806151 0.21423974 3070.18397594 +1 2 6 1 6 67035.54945475 -72006.46837791 80811.48590744 +1 2 6 1 7 3061.37872275 889.96257974 90.79480057 +1 2 6 1 8 0.59987126 -536.63840538 -3077.00751156 +1 2 6 2 1 72013.43116936 -74113.97680734 72014.96298348 +1 2 6 2 2 -3064.50662291 9473.03845367 -3065.95274113 +1 2 6 2 3 -537.93455579 -0.02142397 -1557.37292062 +1 2 6 2 4 1558.11204772 -0.40705550 535.68503855 +1 2 6 2 5 3057.04036807 -9458.66296731 3055.05865050 +1 2 6 2 6 -72005.10795558 74101.32595087 -72001.66940780 +1 2 6 2 7 -1557.77997612 -0.73912709 -537.59177221 +1 2 6 2 8 536.77766121 -0.43919146 1556.92301718 +1 2 6 3 1 -80801.90939119 67032.57152241 -72004.34740451 +1 2 6 3 2 -93.04431781 3063.43542422 888.84853311 +1 2 6 3 3 90.76266461 889.07348483 3062.79270501 +1 2 6 3 4 -3079.39628463 -540.05552919 0.87838292 +1 2 6 3 5 3072.65844490 -1.92815763 1561.37920371 +1 2 6 3 6 80810.32901286 -72001.45516806 67026.44426593 +1 2 6 3 7 3077.85375853 0.82482299 -536.22063789 +1 2 6 3 8 -3077.29673521 1557.70499222 0.35349557 +1 3 6 1 1 72007.60384851 -80795.10727954 67033.68556904 +1 3 6 1 2 -1.41398226 -3078.11084621 -538.18093149 +1 3 6 1 3 -1558.01563984 3077.59667084 0.34278358 +1 3 6 1 4 -2.82796453 -3080.16754769 1557.11583294 +1 3 6 1 5 536.20992591 3076.73971189 1.84246174 +1 3 6 1 6 -67028.08319992 80799.85268972 -72006.44695393 +1 3 6 1 7 -3061.97859401 91.86599925 890.54102703 +1 3 6 1 8 -891.51581784 -92.62655032 3061.14305904 +1 3 6 2 1 -80797.28181287 72014.55592798 -67032.51796247 +1 3 6 2 2 -3080.16754769 -2.82796453 -1557.07298499 +1 3 6 2 3 3077.28602322 -1559.83667760 -0.21423974 +1 3 6 2 4 -3078.13227018 -1.45683021 538.25591539 +1 3 6 2 5 89.83072175 -3058.57218219 -892.13711307 +1 3 6 2 6 80803.91253273 -67036.53495754 72005.35433127 +1 3 6 2 7 3077.12534342 536.01711014 -0.62129524 +1 3 6 2 8 -92.61583833 -891.49439386 -3061.14305904 +1 3 6 3 1 72000.76960090 -72000.16972964 74100.53326384 +1 3 6 3 2 536.32775776 -1559.33321422 2.37806108 +1 3 6 3 3 3063.01765673 -3062.57846527 9469.52492198 +1 3 6 3 4 1559.33321422 -536.32775776 2.35663711 +1 3 6 3 5 -536.91691704 1558.61551110 3.59922758 +1 3 6 3 6 -72003.52258152 72000.74817693 -74115.18726186 +1 3 6 3 7 -1557.73712818 537.81672393 2.24951724 +1 3 6 3 8 -3061.31445083 3061.36801076 -9465.42223101 +1 1 7 1 1 -0.10711987 -0.01071199 -5.12032972 +1 1 7 1 2 -9468.71081098 0.10711987 2.99935632 +1 1 7 1 3 -0.00000000 -0.00000000 0.53559934 +1 1 7 1 4 9468.73223495 -0.00000000 2.99935632 +1 1 7 1 5 0.05355993 -0.02142397 -0.19281576 +1 1 7 1 6 9470.91748027 0.92123087 -0.85695895 +1 1 7 1 7 -0.02142397 0.03213596 0.44990345 +1 1 7 1 8 -9470.85320835 -0.80339901 -0.84624696 +1 1 7 2 1 -0.00000000 -0.04284795 2957.22607457 +1 1 7 2 2 -3063.56396806 1556.47311373 3075.77563308 +1 1 7 2 3 0.01071199 -0.06427192 -573.32696035 +1 1 7 2 4 3063.56396806 -1556.53738565 3075.68993718 +1 1 7 2 5 -0.00000000 -0.06427192 -2914.26029531 +1 1 7 2 6 -3061.01451519 -1557.18010486 3076.39692831 +1 1 7 2 7 -0.00000000 0.07498391 -11773.68400607 +1 1 7 2 8 3061.03593917 1557.23366480 3076.37550434 +1 1 7 3 1 -1.04977471 2959.47559181 0.04284795 +1 1 7 3 2 -3058.85069385 3075.02579400 1559.60101389 +1 1 7 3 3 0.29993563 -2913.63900007 0.02142397 +1 1 7 3 4 -3058.91496577 3075.04721797 -1559.49389402 +1 1 7 3 5 0.48203941 -574.78379056 -0.00000000 +1 1 7 3 6 3060.60745969 3075.98987281 -1559.06541455 +1 1 7 3 7 -3.06362824 -11773.01986288 0.02142397 +1 1 7 3 8 3060.58603572 3075.97916083 1559.27965428 +1 2 7 1 1 -0.10711987 -0.03213596 -11783.72113775 +1 2 7 1 2 3060.50033982 1561.37920371 3077.55382289 +1 2 7 1 3 0.04284795 0.04284795 -2915.07440631 +1 2 7 1 4 -3060.44677989 -1561.40062768 3077.46812700 +1 2 7 1 5 0.03213596 -0.00000000 -574.65524672 +1 2 7 1 6 3060.82169943 -1557.45861652 3077.57524687 +1 2 7 1 7 0.04284795 -0.09640788 2963.47116291 +1 2 7 1 8 -3060.84312340 1557.54431241 3077.50026296 +1 2 7 2 1 -0.00000000 0.01071199 -2.18524532 +1 2 7 2 2 -888.96636496 0.55702332 2.37806108 +1 2 7 2 3 0.03213596 0.08569589 0.83553497 +1 2 7 2 4 888.97707695 -0.55702332 2.52802890 +1 2 7 2 5 -0.00000000 0.04284795 -1.97100558 +1 2 7 2 6 888.60215741 -0.89980690 0.21423974 +1 2 7 2 7 -0.08569589 -0.00000000 -1.89602167 +1 2 7 2 8 -888.62358139 0.88909491 0.26779967 +1 2 7 3 1 2962.01433270 -2.46375698 -0.12854384 +1 2 7 3 2 89.68075393 539.79844150 -536.49914955 +1 2 7 3 3 -3371.56572605 0.44990345 -0.00000000 +1 2 7 3 4 89.60577003 539.69132163 536.62769339 +1 2 7 3 5 -2914.09961550 0.04284795 -0.00000000 +1 2 7 3 6 89.63790599 -537.97740374 -536.15636597 +1 2 7 3 7 2965.29220067 -1.54252611 0.04284795 +1 2 7 3 8 89.55221009 -538.00953970 536.02782213 +1 3 7 1 1 -1.77818982 -11783.09984251 -0.00000000 +1 3 7 1 2 3062.98552077 3079.58910040 1556.38741783 +1 3 7 1 3 0.77126305 -573.54120009 0.08569589 +1 3 7 1 4 3062.95338481 3079.65337232 -1556.38741783 +1 3 7 1 5 -0.80339901 -2915.58858168 0.14996782 +1 3 7 1 6 -3061.20733096 3076.65401600 -1557.30864870 +1 3 7 1 7 -1.71391790 2959.94691923 0.02142397 +1 3 7 1 8 -3061.16448301 3076.60045606 1557.14796890 +1 3 7 2 1 2960.34326275 -1.67106995 -0.01071199 +1 3 7 2 2 91.99454309 -534.93519947 538.25591539 +1 3 7 2 3 -2914.64592683 0.72841511 -0.00000000 +1 3 7 2 4 91.96240713 -534.91377550 -538.06309963 +1 3 7 2 5 -3373.75097137 -1.11404663 0.08569589 +1 3 7 2 6 90.36632109 535.96355021 537.76316400 +1 3 7 2 7 2963.53543483 -0.08569589 0.02142397 +1 3 7 2 8 90.36632109 535.98497418 -537.92384380 +1 3 7 3 1 -0.02142397 -0.00000000 4.86324203 +1 3 7 3 2 -890.89452260 -0.10711987 -2.91366042 +1 3 7 3 3 -0.03213596 -0.04284795 2.18524532 +1 3 7 3 4 890.90523459 0.17139179 -2.82796453 +1 3 7 3 5 0.02142397 0.04284795 -2.48518095 +1 3 7 3 6 889.00921291 -0.14996782 1.97100558 +1 3 7 3 7 0.02142397 -0.04284795 -2.76369261 +1 3 7 3 8 -888.96636496 0.13925583 1.91744565 +1 1 8 1 1 -74116.62266810 72002.53707873 72009.10352667 +1 1 8 1 2 9473.05987764 -3064.52804688 -3065.97416511 +1 1 8 1 3 1.28543842 -538.62012295 -1558.87259878 +1 1 8 1 4 -0.41776749 1558.14418368 535.68503855 +1 1 8 1 5 1.00692676 -1557.63000831 -539.62704971 +1 1 8 1 6 -0.41776749 536.77766121 1556.98728910 +1 1 8 1 7 -9466.52556566 3061.68937036 3061.34658679 +1 1 8 1 8 74108.63152590 -71998.39153982 -71998.71289942 +1 1 8 2 1 67015.38949550 -72015.88421435 -80797.08899711 +1 1 8 2 2 3066.00630107 889.36270848 -95.13315524 +1 1 8 2 3 0.56773530 -538.55585103 3077.31815918 +1 1 8 2 4 1561.91480305 1.67106995 -3081.79576969 +1 1 8 2 5 891.70863360 3053.51612440 86.14579827 +1 1 8 2 6 -536.63840538 0.57844729 -3076.95395163 +1 1 8 2 7 -0.44990345 1557.65143228 3076.38621633 +1 1 8 2 8 -71998.52008366 67051.57458708 80811.05742797 +1 1 8 3 1 67029.10083867 -80800.48469694 -72003.19050993 +1 1 8 3 2 3063.39257627 -93.01218185 888.82710914 +1 1 8 3 3 888.99850093 90.55913686 3062.74985706 +1 1 8 3 4 -540.04481720 -3079.41770861 0.81411100 +1 1 8 3 5 -1.53181412 3074.76870631 -536.79908518 +1 1 8 3 6 1557.69428023 -3077.27531124 0.32135961 +1 1 8 3 7 -0.64271921 3076.84683176 1559.45104607 +1 1 8 3 8 -71997.02040550 80807.99379973 67027.80468826 +1 2 8 1 1 72004.28313259 -67024.49468432 -80796.04993438 +1 2 8 1 2 -1.73534187 -1561.94693901 -3081.76363373 +1 2 8 1 3 537.80601195 -0.38563153 3077.48955097 +1 2 8 1 4 -889.36270848 -3066.02772504 -95.10101928 +1 2 8 1 5 -1553.37734953 -0.27851166 3070.09828004 +1 2 8 1 6 -0.62129524 536.64911737 -3076.95395163 +1 2 8 1 7 -3061.31445083 -889.93044378 90.81622454 +1 2 8 1 8 -67035.54945475 72006.25413817 80811.43234751 +1 2 8 2 1 -72014.20243241 74114.51240669 72015.47715885 +1 2 8 2 2 -1558.14418368 0.41776749 535.66361458 +1 2 8 2 3 537.76316400 -0.06427192 -1557.28722473 +1 2 8 2 4 3064.53875887 -9473.01702969 -3065.98487709 +1 2 8 2 5 -3057.19033589 9458.79151115 3054.95153063 +1 2 8 2 6 -536.78837320 0.42847947 1557.00871307 +1 2 8 2 7 1556.85874526 0.08569589 -538.25591539 +1 2 8 2 8 72007.26106493 -74101.13313511 -72001.42303210 +1 2 8 3 1 -80801.50233569 67032.10019499 72003.81180517 +1 2 8 3 2 -3079.43913258 -540.07695316 -0.84624696 +1 2 8 3 3 90.75195262 889.07348483 -3062.79270501 +1 2 8 3 4 -93.02289383 3063.43542422 -888.81639715 +1 2 8 3 5 3072.60488497 -1.92815763 -1561.42205165 +1 2 8 3 6 -3077.27531124 1557.69428023 -0.29993563 +1 2 8 3 7 3077.81091058 0.83553497 536.22063789 +1 2 8 3 8 80809.98622928 -72001.19808037 -67025.84439466 +1 3 8 1 1 72007.94663209 -80795.42863915 -67033.99621666 +1 3 8 1 2 -2.82796453 -3080.16754769 -1557.09440897 +1 3 8 1 3 -1558.07991176 3077.55382289 -0.34278358 +1 3 8 1 4 -1.44611823 -3078.15369416 538.32018732 +1 3 8 1 5 536.27419783 3076.69686395 -1.90673366 +1 3 8 1 6 -891.52652982 -92.55156641 -3061.16448301 +1 3 8 1 7 -3061.93574606 91.88742323 -890.49817908 +1 3 8 1 8 -67028.43669548 80800.18476131 72006.76831354 +1 3 8 2 1 -80797.49605261 72014.83443964 67032.65721830 +1 3 8 2 2 -3078.11084621 -1.41398226 -538.19164347 +1 3 8 2 3 3077.30744720 -1559.79382965 0.17139179 +1 3 8 2 4 -3080.12469974 -2.82796453 1557.11583294 +1 3 8 2 5 89.78787380 -3058.57218219 892.22280897 +1 3 8 2 6 -92.57299038 -891.53724181 3061.20733096 +1 3 8 2 7 3077.12534342 536.01711014 0.65343120 +1 3 8 2 8 80804.13748446 -67036.68492536 -72005.84708267 +1 3 8 3 1 -72001.69083177 72000.93028070 74101.21883100 +1 3 8 3 2 -1559.32250223 536.32775776 2.39948506 +1 3 8 3 3 -3063.21047250 3062.49276938 9469.61061787 +1 3 8 3 4 -536.31704577 1559.34392621 2.33521313 +1 3 8 3 5 536.70267730 -1558.55123918 3.51353169 +1 3 8 3 6 3061.33587480 -3061.31445083 -9465.39009505 +1 3 8 3 7 1556.79447333 -538.44873116 1.58537405 +1 3 8 3 8 72005.69711485 -72000.76960090 -74115.17654987 +2 1 1 1 1 -74175.43147592 -72109.42128355 -72075.29289344 +2 1 1 1 2 74174.16746147 72107.66451771 72072.25068917 +2 1 1 1 3 -0.44990345 538.62012295 1558.31557547 +2 1 1 1 4 -0.38563153 -538.98433050 -1559.19395839 +2 1 1 1 5 -0.36420755 1559.72955773 539.00575447 +2 1 1 1 6 -0.13925583 -1560.62936463 -539.24141818 +2 1 1 1 7 -9470.57469669 -3063.15691256 -3059.60053293 +2 1 1 1 8 9472.99560572 3066.29552471 3063.75678383 +2 1 1 2 1 -72107.50383790 -67126.57991903 -80913.63541407 +2 1 1 2 2 67142.32653970 72094.79942150 80912.69275923 +2 1 1 2 3 -539.35925004 0.79268703 3074.21168300 +2 1 1 2 4 -0.52488736 538.66297089 -3074.38307479 +2 1 1 2 5 1559.23680634 1.79961379 3080.44605934 +2 1 1 2 6 888.25937383 -3063.39257627 -93.13001370 +2 1 1 2 7 3058.18655066 -887.94872621 91.65175952 +2 1 1 2 8 -0.68556716 -1557.99421586 -3077.84304654 +2 1 1 3 1 -72074.51091840 -80912.05004002 -67095.51515716 +2 1 1 3 2 67095.21522152 80902.98769914 72062.55634107 +2 1 1 3 3 1560.06162932 3074.55446658 0.53559934 +2 1 1 3 4 893.72248713 -83.25356182 -3055.63709779 +2 1 1 3 5 -536.00639816 3081.32444227 0.25708768 +2 1 1 3 6 -1.09262266 -3079.24631682 536.52057352 +2 1 1 3 7 3063.60681601 94.22263636 -889.20202868 +2 1 1 3 8 -1.11404663 -3078.61430959 -1559.44033409 +2 2 1 1 1 -67136.54206680 -72095.02437322 -80912.89628698 +2 2 1 1 2 72109.26060375 67119.83136731 80913.26049453 +2 2 1 1 3 0.13925583 -537.76316400 3074.46877068 +2 2 1 1 4 538.63083493 -0.51417537 -3074.34022684 +2 2 1 1 5 -888.67714132 3068.44863407 94.67253981 +2 2 1 1 6 -1558.04777580 -0.70699113 -3077.81091058 +2 2 1 1 7 -1.32828637 1557.44790453 3075.85061698 +2 2 1 1 8 -3063.41400025 888.24866185 -93.06574178 +2 2 1 2 1 -72096.40621952 -74176.12775507 -72067.75165469 +2 2 1 2 2 72096.74900310 74179.82339053 72069.50842054 +2 2 1 2 3 539.56277779 0.83553497 1560.05091734 +2 2 1 2 4 -538.98433050 -0.36420755 -1559.23680634 +2 2 1 2 5 -3068.15941042 -9477.25897649 -3066.69186823 +2 2 1 2 6 3066.30623670 9473.01702969 3063.77820780 +2 2 1 2 7 1561.42205165 0.23566371 539.62704971 +2 2 1 2 8 -1560.67221257 -0.13925583 -539.17714626 +2 2 1 3 1 -80910.72175365 -72067.80521463 -67097.01483532 +2 2 1 3 2 80903.07339503 67084.37469083 72063.07051644 +2 2 1 3 3 3074.41521075 1558.65835905 0.38563153 +2 2 1 3 4 -83.23213785 893.78675905 -3055.76564164 +2 2 1 3 5 95.28312306 3067.72021896 -887.89516628 +2 2 1 3 6 -3078.63573357 -1.09262266 -1559.47247005 +2 2 1 3 7 3079.16062092 -534.67811179 0.29993563 +2 2 1 3 8 -3079.22489284 -1.09262266 536.44558962 +2 3 1 1 1 -67090.71618705 -80900.89886170 -72062.63132498 +2 3 1 1 2 72070.67602710 80911.55728862 67094.80816602 +2 3 1 1 3 -893.60465527 83.31783374 3055.82991356 +2 3 1 1 4 -1559.30107826 -3074.68301042 -0.51417537 +2 3 1 1 5 0.05355993 3080.78884292 -536.26348584 +2 3 1 1 6 535.98497418 -3081.15305048 0.38563153 +2 3 1 1 7 2.59230082 3075.90417692 1559.79382965 +2 3 1 1 8 -3065.68494146 -94.96176345 888.66642933 +2 3 1 2 1 -80900.00976679 -67087.20265536 -72062.08501365 +2 3 1 2 2 80911.66440849 72064.10957916 67096.63991578 +2 3 1 2 3 82.79294639 -893.25115971 3055.78706561 +2 3 1 2 4 -3074.65087446 -1559.34392621 -0.51417537 +2 3 1 2 5 3079.28916476 2.07812545 1557.43719255 +2 3 1 2 6 -94.96176345 -3065.72778941 888.64500536 +2 3 1 2 7 3076.95395163 3.31000394 -536.24206187 +2 3 1 2 8 -3081.13162650 535.98497418 0.33207159 +2 3 1 3 1 -72064.22741102 -72064.68802645 -74113.93395940 +2 3 1 3 2 72063.41330002 72066.18770461 74113.30195217 +2 3 1 3 3 -3055.08007448 -3055.48712998 -9478.78007862 +2 3 1 3 4 3055.25146627 3055.23004229 9478.69438273 +2 3 1 3 5 539.02717845 1555.42333902 -1.73534187 +2 3 1 3 6 -538.32018732 -1556.40884181 2.84938850 +2 3 1 3 7 1556.32314591 538.10594758 -3.12790016 +2 3 1 3 8 -1556.36599386 -538.32018732 2.84938850 +2 1 2 1 1 74168.12590089 67132.22513610 67087.80252662 +2 1 2 1 2 112.32589414 -216.86417384 -124.98746260 +2 1 2 1 3 -74173.55687822 -67116.61777126 67078.07604256 +2 1 2 1 4 -1.77818982 5.63450508 6.59858390 +2 1 2 1 5 -74164.99800073 67112.22585665 -67087.88822252 +2 1 2 1 6 0.67485517 7.73405451 8.56958948 +2 1 2 1 7 74056.16421430 -66920.70624370 -66963.33995138 +2 1 2 1 8 2.95650837 -3.65278752 -4.61686633 +2 1 2 2 1 72106.96823856 72098.22725729 80899.65627123 +2 1 2 2 2 -223.10926218 223.90194920 -329274.64983068 +2 1 2 2 3 -72098.58075286 -72107.33244611 80900.26685448 +2 1 2 2 4 0.94265484 -0.83553497 11785.47790359 +2 1 2 2 5 72111.43513708 -72111.33872920 80901.83080456 +2 1 2 2 6 2.34592512 0.06427192 -2959.91478327 +2 1 2 2 7 -71899.86268474 71899.95909263 80707.23685139 +2 1 2 2 8 -0.08569589 -2.36734909 -2959.85051135 +2 1 2 3 1 72073.58968753 80913.77466990 72065.05223400 +2 1 2 3 2 -129.25083337 -329284.87977812 109.93712107 +2 1 2 3 3 72069.91547604 80913.33547844 -72064.80585831 +2 1 2 3 4 -4.45618653 -2968.84858031 8.54816551 +2 1 2 3 5 -72080.29539130 80898.51008863 -72064.18456307 +2 1 2 3 6 6.60929589 11783.18553841 1.22116650 +2 1 2 3 7 -71939.00428470 80702.24506551 71944.24244628 +2 1 2 3 8 2.91366042 -2957.46173828 -0.27851166 +2 2 2 1 1 72107.07535843 72098.53790491 80899.89193494 +2 2 2 1 2 -221.71670389 221.02042474 -329275.43180572 +2 2 2 1 3 -72098.35580113 -72107.09678240 80899.68840719 +2 2 2 1 4 0.74983908 -1.32828637 11785.19939193 +2 2 2 1 5 72110.97452164 -72110.84597780 80901.35947714 +2 2 2 1 6 1.10333465 -1.79961379 -2958.58649690 +2 2 2 1 7 -71900.09834845 71904.34029525 80707.24756337 +2 2 2 1 8 0.14996782 -2.78511658 -2959.80766341 +2 2 2 2 1 67116.29641165 74173.12839875 67077.72254699 +2 2 2 2 2 217.71042080 -112.00453454 -125.21241433 +2 2 2 2 3 -67132.45008783 -74168.27586870 67088.12388623 +2 2 2 2 4 -5.64521707 1.84246174 6.72712774 +2 2 2 2 5 -67112.09731280 74164.95515278 -67087.80252662 +2 2 2 2 6 3.51353169 -3.04220427 -4.62757832 +2 2 2 2 7 66920.43844403 -74055.76787078 -66963.14713561 +2 2 2 2 8 -7.81975040 -0.80339901 8.59101346 +2 2 2 3 1 80913.27120652 72067.65524681 72064.59161857 +2 2 2 3 2 -329283.26226811 -127.06558805 -110.50485638 +2 2 2 3 3 80914.07460553 72073.86819919 -72060.86384715 +2 2 2 3 4 -2970.25185059 -5.52738522 -10.28350738 +2 2 2 3 5 80898.42439274 -72080.25254335 72063.94889936 +2 2 2 3 6 -2958.29727326 4.04913103 -0.66414318 +2 2 2 3 7 80702.52357717 -71939.23994842 -71944.44597403 +2 2 2 3 8 11783.42120212 6.55573595 -1.66035796 +2 3 2 1 1 72073.86819919 80913.86036579 72065.34145765 +2 3 2 1 2 -125.65160579 -329281.95540571 105.93083799 +2 3 2 1 3 72066.89469574 80912.24285578 -72059.55698475 +2 3 2 1 4 -5.29172151 -2970.13401873 6.57715993 +2 3 2 1 5 -72080.32752726 80898.31727287 -72064.14171512 +2 3 2 1 6 6.70570377 11783.33550622 1.04977471 +2 3 2 1 7 -71941.01813823 80701.88085796 71944.09247846 +2 3 2 1 8 4.82039408 -2957.61170610 0.61058325 +2 3 2 2 1 80913.22835857 72069.79764418 72064.60233056 +2 3 2 2 2 -329283.45508387 -126.72280447 -111.57605506 +2 3 2 2 3 80914.07460553 72071.57583400 -72060.90669509 +2 3 2 2 4 -2970.28398655 -5.46311330 -10.45489917 +2 3 2 2 5 80898.46724069 -72080.12399951 72063.75608360 +2 3 2 2 6 -2958.27584929 3.96343514 0.59987126 +2 3 2 2 7 80702.69496896 -71939.53988405 -71944.78875761 +2 3 2 2 8 11783.37835417 6.53431198 -1.54252611 +2 3 2 3 1 67092.85858442 67093.52272760 74101.72229438 +2 3 2 3 2 105.49164653 -104.55970367 5.58094515 +2 3 2 3 3 -67093.96191906 -67093.15852005 74102.09721392 +2 3 2 3 4 -2.28165320 2.35663711 -4.45618653 +2 3 2 3 5 -67082.33941333 67082.38226127 -74073.73187274 +2 3 2 3 6 -0.74983908 -1.71391790 -4.79897011 +2 3 2 3 7 66979.46149159 -66979.44006762 -74121.37879026 +2 3 2 3 8 1.69249392 0.78197504 -4.72398620 +2 1 3 1 1 -0.81411100 -539.53064183 1559.94379747 +2 1 3 1 2 -74179.75911861 -72096.84541098 72069.47628458 +2 1 3 1 3 74176.10633109 72096.36337158 -72067.86948655 +2 1 3 1 4 0.36420755 538.96290653 -1559.23680634 +2 1 3 1 5 9477.30182443 3068.12727446 -3066.67044425 +2 1 3 1 6 0.10711987 1560.65078860 -539.11287434 +2 1 3 1 7 -0.29993563 -1561.43276364 539.63776170 +2 1 3 1 8 -9473.01702969 -3066.29552471 3063.76749581 +2 1 3 2 1 537.82743592 -0.10711987 3074.36165081 +2 1 3 2 2 -67119.78851937 -72109.14277189 80913.09981473 +2 1 3 2 3 72095.00294925 67136.52064283 -80912.71418320 +2 1 3 2 4 0.51417537 -538.70581884 -3074.34022684 +2 1 3 2 5 -3068.48077003 888.68785331 94.62969186 +2 1 3 2 6 -888.27008582 3063.37115230 -93.15143767 +2 1 3 2 7 -1557.45861652 1.38184630 3075.86132897 +2 1 3 2 8 0.64271921 1558.00492785 -3077.81091058 +2 1 3 3 1 1558.67978302 3074.40449876 -0.31064762 +2 1 3 3 2 67084.31041891 80902.81630735 -72062.98482054 +2 1 3 3 3 -72067.65524681 -80910.63605775 67096.88629147 +2 1 3 3 4 893.78675905 -83.23213785 3055.74421766 +2 1 3 3 5 3067.72021896 95.31525902 887.93801423 +2 1 3 3 6 -1.03906272 -3079.24631682 -536.52057352 +2 1 3 3 7 -534.67811179 3079.13919695 -0.26779967 +2 1 3 3 8 -1.04977471 -3078.61430959 1559.45104607 +2 2 3 1 1 -0.81411100 539.36996203 3074.26524293 +2 2 3 1 2 -72094.99223726 -67142.54077944 80912.70347121 +2 2 3 1 3 67126.66561492 72107.61095777 -80913.99962162 +2 2 3 1 4 -538.63083493 0.53559934 -3074.29737889 +2 2 3 1 5 -1.76747783 -1559.27965428 3080.53175524 +2 2 3 1 6 1557.99421586 0.70699113 -3077.81091058 +2 2 3 1 7 888.00228615 -3058.19726265 91.65175952 +2 2 3 1 8 3063.43542422 -888.25937383 -93.09787774 +2 2 3 2 1 -538.62012295 0.42847947 1558.30486348 +2 2 3 2 2 -72107.71807764 -74174.33885326 72072.29353712 +2 2 3 2 3 72109.50697945 74175.47432387 -72075.34645337 +2 2 3 2 4 538.97361851 0.36420755 -1559.19395839 +2 2 3 2 5 -1559.68670978 0.34278358 538.98433050 +2 2 3 2 6 -3066.29552471 -9473.05987764 3063.77820780 +2 2 3 2 7 3063.11406462 9470.57469669 -3059.60053293 +2 2 3 2 8 1560.62936463 0.12854384 -539.20928222 +2 2 3 3 1 3074.55446658 1560.10447727 -0.53559934 +2 2 3 3 2 80902.88057927 67095.07596570 -72062.42779723 +2 2 3 3 3 -80911.90007220 -72074.42522250 67095.40803729 +2 2 3 3 4 -83.26427381 893.74391110 3055.74421766 +2 2 3 3 5 3081.32444227 -535.96355021 -0.36420755 +2 2 3 3 6 -3078.63573357 -1.02835074 1559.47247005 +2 2 3 3 7 94.22263636 3063.62823999 889.23416464 +2 2 3 3 8 -3079.26774079 -1.04977471 -536.49914955 +2 3 3 1 1 -893.35827957 82.95362619 -3055.86204952 +2 3 3 1 2 72064.09886718 80909.45773920 -67096.52208392 +2 3 3 1 3 -67086.40996833 -80898.98141606 72061.18520675 +2 3 3 1 4 -1559.30107826 -3074.68301042 0.47132742 +2 3 3 1 5 2.18524532 3079.41770861 -1557.30864870 +2 3 3 1 6 535.95283822 -3081.13162650 -0.36420755 +2 3 3 1 7 2.63514877 3077.89660647 536.88478108 +2 3 3 1 8 -3065.72778941 -94.96176345 -888.60215741 +2 3 3 2 1 83.25356182 -893.61536726 -3055.86204952 +2 3 3 2 2 80911.12880915 72070.21541167 -67094.42253450 +2 3 3 2 3 -80900.47038223 -67090.39482744 72062.25640544 +2 3 3 2 4 -3074.67229843 -1559.34392621 0.47132742 +2 3 3 2 5 3080.84240286 0.10711987 536.26348584 +2 3 3 2 6 -94.96176345 -3065.70636543 -888.62358139 +2 3 3 2 7 3075.90417692 2.62443678 -1559.80454164 +2 3 3 2 8 -3081.13162650 535.95283822 -0.34278358 +2 3 3 3 1 3055.44428203 3055.24075428 -9478.87648650 +2 3 3 3 2 -72065.91990494 -72065.25576176 74112.89489667 +2 3 3 3 3 72065.13792990 72064.93440215 -74114.18033509 +2 3 3 3 4 -3055.29431421 -3055.29431421 9478.69438273 +2 3 3 3 5 -1555.32693114 -538.83436268 -1.73534187 +2 3 3 3 6 538.34161129 1556.38741783 2.76369261 +2 3 3 3 7 -538.72724282 -1555.42333902 -2.48518095 +2 3 3 3 8 1556.36599386 538.34161129 2.78511658 +2 1 4 1 1 -0.04284795 0.04284795 897.62165034 +2 1 4 1 2 -0.68556716 0.47132742 -5.48453727 +2 1 4 1 3 -0.06427192 0.12854384 897.66449829 +2 1 4 1 4 0.81411100 -0.44990345 -5.59165714 +2 1 4 1 5 -0.00000000 -0.00000000 -894.83653376 +2 1 4 1 6 -0.07498391 -0.32135961 -1.19974253 +2 1 4 1 7 0.04284795 -0.00000000 -886.58830388 +2 1 4 1 8 -0.00000000 0.27851166 -1.17831855 +2 1 4 2 1 -538.68439487 538.70581884 -83.01789811 +2 1 4 2 2 6.76997569 -1.42469425 -2969.41631561 +2 1 4 2 3 538.57727500 -538.59869897 -80.72553292 +2 1 4 2 4 -2.81725254 5.44168932 -2969.55557144 +2 1 4 2 5 -540.24834495 -540.24834495 -83.12501798 +2 1 4 2 6 -0.27851166 -0.06427192 3371.85494970 +2 1 4 2 7 535.55649471 535.55649471 -99.79286952 +2 1 4 2 8 0.98550279 0.85695895 2913.94964769 +2 1 4 3 1 -1559.83667760 -3074.96152208 -3058.42221437 +2 1 4 3 2 8.82667717 11785.60644743 6.17010443 +2 1 4 3 3 -1559.79382965 -3074.87582618 3058.40079040 +2 1 4 3 4 -5.74162495 -2970.54107423 0.85695895 +2 1 4 3 5 1560.82218039 -3075.15433784 3060.02901240 +2 1 4 3 6 -0.81411100 2915.31007002 -1.07119869 +2 1 4 3 7 1556.38741783 -3078.66786953 -3064.48519893 +2 1 4 3 8 -0.02142397 573.20912850 -1.28543842 +2 2 4 1 1 538.62012295 -538.70581884 -83.03932209 +2 2 4 1 2 2.20666929 -4.78825812 -2970.38039443 +2 2 4 1 3 -538.55585103 538.66297089 -80.89692471 +2 2 4 1 4 -6.07369655 0.92123087 -2970.34825847 +2 2 4 1 5 540.26976892 540.24834495 -80.89692471 +2 2 4 1 6 -0.94265484 -0.66414318 2913.74611994 +2 2 4 1 7 -535.66361458 -535.62076663 -99.94283734 +2 2 4 1 8 0.17139179 -0.06427192 3371.72640585 +2 2 4 2 1 -0.00000000 0.02142397 897.60022637 +2 2 4 2 2 -0.44990345 0.69627915 -5.50596124 +2 2 4 2 3 0.06427192 0.08569589 897.57880239 +2 2 4 2 4 0.51417537 -0.85695895 -5.46311330 +2 2 4 2 5 0.04284795 0.02142397 -895.00792555 +2 2 4 2 6 -0.26779967 -0.00000000 -1.19974253 +2 2 4 2 7 -0.04284795 0.08569589 -886.48118401 +2 2 4 2 8 0.27851166 -0.06427192 -1.29615041 +2 2 4 3 1 -3074.87582618 -1559.92237350 -3058.22939861 +2 2 4 3 2 11785.64929538 8.88023710 -6.13796847 +2 2 4 3 3 -3074.85440221 -1559.79382965 3058.35794245 +2 2 4 3 4 -2970.40181840 -5.69877701 -0.77126305 +2 2 4 3 5 -3075.21860976 1560.77933244 -3059.77192472 +2 2 4 3 6 573.08058465 -0.06427192 1.19974253 +2 2 4 3 7 -3078.62502158 1556.51596168 3064.54947085 +2 2 4 3 8 2915.22437412 -0.71770312 1.04977471 +2 3 4 1 1 -1559.75098171 -3074.94009810 3058.29367053 +2 3 4 1 2 -5.67735303 -2970.50893827 -0.72841511 +2 3 4 1 3 -1559.77240568 -3074.81155426 -3058.31509451 +2 3 4 1 4 8.76240525 11785.60644743 -6.14868045 +2 3 4 1 5 1560.75790847 -3075.21860976 -3059.81477267 +2 3 4 1 6 -0.04284795 573.19841651 1.24259047 +2 3 4 1 7 1556.49453770 -3078.73214145 3064.46377496 +2 3 4 1 8 -0.74983908 2915.35291796 1.03906272 +2 3 4 2 1 -3074.96152208 -1559.81525363 3058.29367053 +2 3 4 2 2 -2970.47680231 -5.67735303 0.63200722 +2 3 4 2 3 -3074.94009810 -1559.79382965 -3058.22939861 +2 3 4 2 4 11785.60644743 8.84810114 6.10583251 +2 3 4 2 5 -3075.19718579 1560.75790847 3059.81477267 +2 3 4 2 6 2915.33149399 -0.79268703 -1.09262266 +2 3 4 2 7 -3078.66786953 1556.51596168 -3064.46377496 +2 3 4 2 8 573.19841651 0.04284795 -1.30686240 +2 3 4 3 1 -0.04284795 -0.02142397 9480.08694102 +2 3 4 3 2 9.46939638 -9.45868439 -6.74855172 +2 3 4 3 3 -0.04284795 -0.02142397 9480.27975678 +2 3 4 3 4 -9.41583644 9.55509227 -6.66285582 +2 3 4 3 5 0.04284795 0.04284795 -9484.05037615 +2 3 4 3 6 -1.27472644 -1.32828637 -2.61372479 +2 3 4 3 7 -0.04284795 0.04284795 -9457.20613710 +2 3 4 3 8 1.24259047 1.33899836 -2.63514877 +2 1 5 1 1 -1.37113432 1559.48318203 -536.74552525 +2 1 5 1 2 -74173.56759021 72113.86675809 -72082.25568489 +2 1 5 1 3 9477.44108026 -3068.12727446 3067.24889154 +2 1 5 1 4 0.21423974 -540.84821621 1560.26515707 +2 1 5 1 5 74163.21981091 -72101.89075679 72063.22048425 +2 1 5 1 6 -1.04977471 -1561.03642013 541.72659913 +2 1 5 1 7 -1.13547061 538.39517122 -1558.10133573 +2 1 5 1 8 -9463.80472100 3060.09328432 -3055.18719435 +2 1 5 2 1 1560.02949336 -0.37491954 3080.53175524 +2 1 5 2 2 67117.81751378 -72109.50697945 80902.50565973 +2 1 5 2 3 3068.91996149 888.06655807 94.88677954 +2 1 5 2 4 -0.52488736 -540.18407303 -3074.68301042 +2 1 5 2 5 -72100.32680671 67159.12293509 -80923.66183376 +2 1 5 2 6 889.54481225 3054.26596348 -86.85278940 +2 1 5 2 7 -533.90684873 -3.63136354 3077.32887117 +2 1 5 2 8 -1.56395008 1552.14547104 -3070.03400812 +2 1 5 3 1 537.93455579 3080.68172306 -0.39634351 +2 1 5 3 2 -67092.28013713 80902.75203543 -72062.01002974 +2 1 5 3 3 -3066.95966790 94.73681173 888.06655807 +2 1 5 3 4 -891.08733836 -81.19686035 3057.41528761 +2 1 5 3 5 72059.81407243 -80921.73367613 67085.81009707 +2 1 5 3 6 3.05291625 -3077.59667084 -534.78523165 +2 1 5 3 7 -1556.53738565 3074.92938612 3.52424367 +2 1 5 3 8 6.08440853 -3072.58346099 1562.17189073 +2 2 5 1 1 -888.08798204 -3068.91996149 94.89749153 +2 2 5 1 2 72109.53911541 -67117.89249769 80902.48423576 +2 2 5 1 3 0.39634351 -1560.05091734 3080.57460319 +2 2 5 1 4 540.16264905 0.55702332 -3074.64016247 +2 2 5 1 5 -67159.14435906 72100.39107863 -80923.83322555 +2 2 5 1 6 -1552.10262309 1.60679803 -3070.05543210 +2 2 5 1 7 3.64207553 533.90684873 3077.29673521 +2 2 5 1 8 -3054.30881142 -889.57694822 -86.90634934 +2 2 5 2 1 3068.10585049 -9477.40894430 3067.23817955 +2 2 5 2 2 -72113.93103002 74173.47118233 -72082.21283694 +2 2 5 2 3 -1559.47247005 1.43540624 -536.73481326 +2 2 5 2 4 540.79465628 -0.23566371 1560.30800502 +2 2 5 2 5 72101.93360474 -74163.28408283 72063.02766849 +2 2 5 2 6 -3060.05043638 9463.82614497 -3055.18719435 +2 2 5 2 7 -538.38445924 1.13547061 -1558.10133573 +2 2 5 2 8 1560.99357218 1.01763875 541.66232721 +2 2 5 3 1 94.71538776 -3066.95966790 -888.12011800 +2 2 5 3 2 80902.81630735 -67092.44081693 72062.11714961 +2 2 5 3 3 3080.68172306 537.91313182 0.36420755 +2 2 5 3 4 -81.17543637 -891.10876234 -3057.45813556 +2 2 5 3 5 -80921.89435593 72059.87834435 -67085.87436899 +2 2 5 3 6 -3072.57274901 6.08440853 -1562.15046676 +2 2 5 3 7 3074.94009810 -1556.53738565 -3.53495566 +2 2 5 3 8 -3077.61809482 3.05291625 534.84950358 +2 3 5 1 1 -0.94265484 3079.87832404 538.45944314 +2 3 5 1 2 -72076.28910821 80899.54915136 -67091.74453778 +2 3 5 1 3 -0.27851166 3080.51033127 -1555.12340339 +2 3 5 1 4 1560.82218039 -3074.44734671 0.47132742 +2 3 5 1 5 67094.89386192 -80910.01476251 72055.57212564 +2 3 5 1 6 -530.70396466 -3076.84683176 0.51417537 +2 3 5 1 7 889.63050815 93.59062914 -3056.76185641 +2 3 5 1 8 3062.81412898 -92.15522290 -891.29086611 +2 3 5 2 1 3080.51033127 -0.26779967 1555.09126742 +2 3 5 2 2 80899.49559142 -72076.25697225 67091.74453778 +2 3 5 2 3 3079.86761205 -1.00692676 -538.44873116 +2 3 5 2 4 -3074.42592273 1560.86502834 -0.42847947 +2 3 5 2 5 -80910.05761046 67094.85101397 -72055.33646193 +2 3 5 2 6 -92.11237495 3062.77128104 891.32300207 +2 3 5 2 7 93.60134112 889.66264411 3056.79399237 +2 3 5 2 8 -3076.86825574 -530.67182870 -0.50346338 +2 3 5 3 1 -536.90620505 1557.46932851 -2.82796453 +2 3 5 3 2 -72066.43408031 72066.63760806 -74083.89754826 +2 3 5 3 3 -1557.42648056 536.90620505 -2.82796453 +2 3 5 3 4 -3056.79399237 3057.11535198 -9483.08629733 +2 3 5 3 5 72059.12850528 -72061.37802251 74120.17904773 +2 3 5 3 6 540.67682442 -1552.85246217 -6.34149622 +2 3 5 3 7 3064.05671946 -3064.05671946 9465.69003069 +2 3 5 3 8 1553.62372523 -539.85200144 -6.90923152 +2 1 6 1 1 0.12854384 886.41691209 -1.15689458 +2 1 6 1 2 0.08569589 2.37806108 8.83738915 +2 1 6 1 3 -0.21423974 -886.45976004 -1.19974253 +2 1 6 1 4 0.08569589 -0.04284795 -0.29993563 +2 1 6 1 5 -0.47132742 891.28015412 3.34213990 +2 1 6 1 6 0.20352775 -2.29236519 -8.86952511 +2 1 6 1 7 -0.08569589 -891.30157810 -1.09262266 +2 1 6 1 8 0.19281576 0.04284795 0.33207159 +2 1 6 2 1 -1561.16496397 -3065.98487709 -3079.41770861 +2 1 6 2 2 6.98421543 -0.08569589 11784.99586418 +2 1 6 2 3 1561.14354000 3065.92060517 -3079.22489284 +2 1 6 2 4 -0.18210378 -0.10711987 2915.26722207 +2 1 6 2 5 -1560.37227694 3055.76564164 -3077.03964753 +2 1 6 2 6 -2.32450115 3.83489129 -2964.86372120 +2 1 6 2 7 1555.18767531 -3059.10778153 -3074.06171518 +2 1 6 2 8 0.79268703 -0.23566371 574.52670288 +2 1 6 3 1 -539.04860242 -90.73052865 536.58484545 +2 1 6 3 2 6.42719211 -2961.02882991 -0.50346338 +2 1 6 3 3 -539.09145037 -90.75195262 -536.54199750 +2 1 6 3 4 -0.80339901 3371.85494970 -0.53559934 +2 1 6 3 5 542.28362245 -86.98133325 -534.31390423 +2 1 6 3 6 -5.13104170 -2964.30669788 -1.39255829 +2 1 6 3 7 535.36367894 -92.25163078 537.76316400 +2 1 6 3 8 -0.00000000 2914.30314325 -1.11404663 +2 2 6 1 1 -1558.52981520 3063.30688038 -3078.06799826 +2 2 6 1 2 1.75676584 4.67042627 -2955.29791694 +2 2 6 1 3 1558.44411931 -3063.19976051 -3078.15369416 +2 2 6 1 4 -0.67485517 -0.06427192 573.66974393 +2 2 6 1 5 -1552.65964641 -3060.92881930 -3072.66915689 +2 2 6 1 6 -6.28793628 0.74983908 11771.78798439 +2 2 6 1 7 1557.77997612 3055.33716216 -3075.58281731 +2 2 6 1 8 0.08569589 0.12854384 2914.09961550 +2 2 6 2 1 -0.42847947 9471.68874332 -1.97100558 +2 2 6 2 2 -0.02142397 -3.06362824 6.94136748 +2 2 6 2 3 0.44990345 -9471.62447140 -1.97100558 +2 2 6 2 4 -0.81411100 0.10711987 -0.21423974 +2 2 6 2 5 1.17831855 9463.44051345 5.78447290 +2 2 6 2 6 0.01071199 3.14932413 -6.98421543 +2 2 6 2 7 0.36420755 -9463.44051345 -1.94958161 +2 2 6 2 8 -0.79268703 -0.10711987 0.12854384 +2 2 6 3 1 -3078.11084621 3061.63581043 -1559.04399057 +2 2 6 3 2 -2959.50772777 -3.92058719 1.53181412 +2 2 6 3 3 -3078.15369416 3061.59296248 1559.06541455 +2 2 6 3 4 2913.71398398 -0.62129524 1.00692676 +2 2 6 3 5 -3070.37679170 -3054.33023540 -1562.40755445 +2 2 6 3 6 11772.96630295 -4.02770706 1.54252611 +2 2 6 3 7 -3075.56139334 -3061.35729877 1557.35149665 +2 2 6 3 8 574.78379056 1.11404663 1.03906272 +2 3 6 1 1 535.49222279 -94.37260418 -538.34161129 +2 3 6 1 2 5.12032972 -2955.72639641 -2.58158883 +2 3 6 1 3 535.57791868 -94.39402815 538.29876334 +2 3 6 1 4 0.03213596 2915.50288578 -1.28543842 +2 3 6 1 5 -531.78587534 -98.05752765 539.75559355 +2 3 6 1 6 -6.44861609 -2959.05782433 0.83553497 +2 3 6 1 7 -538.77009076 -88.41673949 -536.04924610 +2 3 6 1 8 0.79268703 3374.69362621 -0.55702332 +2 3 6 2 1 -3080.61745113 -3069.39128891 -1556.34456989 +2 3 6 2 2 11786.37771049 8.56958948 -3.54566765 +2 3 6 2 3 -3080.70314703 -3069.43413686 1556.32314591 +2 3 6 2 4 572.99488876 -0.14996782 -1.26401445 +2 3 6 2 5 -3078.08942224 3060.28610009 -1554.73777186 +2 3 6 2 6 -2963.12837933 8.44104564 0.36420755 +2 3 6 2 7 -3073.01194047 3060.07186035 1559.85810157 +2 3 6 2 8 2916.01706115 1.43540624 -0.68556716 +2 3 6 3 1 0.12854384 885.32428943 2.46375698 +2 3 6 3 2 -2.39948506 3.48139573 -2.67799671 +2 3 6 3 3 -0.17139179 -885.36713738 2.48518095 +2 3 6 3 4 1.07119869 -0.08569589 -1.86388571 +2 3 6 3 5 -0.42847947 890.10183557 -7.45554285 +2 3 6 3 6 1.42469425 1.94958161 2.63514877 +2 3 6 3 7 -0.34278358 -896.80753934 2.50660492 +2 3 6 3 8 0.66414318 1.27472644 1.84246174 +2 1 7 1 1 -9469.58919390 3060.51105181 3063.71393588 +2 1 7 1 2 74060.92033646 -71905.42220592 -71940.73962657 +2 1 7 1 3 -0.19281576 -1555.80897054 -535.51364676 +2 1 7 1 4 -0.69627915 535.94212623 1555.65900273 +2 1 7 1 5 -1.01763875 -534.44244807 -1556.40884181 +2 1 7 1 6 -0.96407882 1554.24502046 535.79215842 +2 1 7 1 7 -74051.60090790 71902.41213761 71937.42962264 +2 1 7 1 8 9463.16200179 -3057.43671158 -3059.97545247 +2 1 7 2 1 -3065.19219007 -890.86238664 93.19428562 +2 1 7 2 2 -66918.29604666 71901.25524303 80696.62127241 +2 1 7 2 3 -1561.19709993 0.66414318 3079.20346887 +2 1 7 2 4 0.35349557 535.42795087 -3078.30366197 +2 1 7 2 5 538.17021950 -2.74226863 3075.53996937 +2 1 7 2 6 -890.29465133 -3058.82926988 -90.85907249 +2 1 7 2 7 71896.13491332 -66927.43337144 -80700.32761986 +2 1 7 2 8 0.12854384 -1557.40505658 -3075.04721797 +2 1 7 3 1 -3060.50033982 90.22706526 -890.13397153 +2 1 7 3 2 -66969.62788766 80709.22928094 71950.99099799 +2 1 7 3 3 540.01268124 3075.39000155 -0.49275140 +2 1 7 3 4 -884.81011407 -101.65675524 -3065.12791814 +2 1 7 3 5 -1559.93308548 3079.56767642 1.77818982 +2 1 7 3 6 -0.85695895 -3073.03336444 537.46322837 +2 1 7 3 7 71939.62557994 -80702.99490459 -66976.26931951 +2 1 7 3 8 -3.96343514 -3076.83611978 -1558.30486348 +2 2 7 1 1 0.21423974 1561.78625921 3079.80334013 +2 2 7 1 2 -71903.80469591 66918.51028640 80696.89978407 +2 2 7 1 3 891.04449041 3065.10649417 93.32282946 +2 2 7 1 4 -535.42795087 -0.42847947 -3078.34650992 +2 2 7 1 5 2.99935632 -538.12737155 3075.41142552 +2 2 7 1 6 1557.39434460 -0.14996782 -3075.04721797 +2 2 7 1 7 66928.72952185 -71897.00258425 -80701.29169868 +2 2 7 1 8 3058.76499795 890.24109140 -90.79480057 +2 2 7 2 1 1555.83039452 0.23566371 -535.47079881 +2 2 7 2 2 71905.26152612 -74060.84535255 -71940.55752280 +2 2 7 2 3 -3060.53247578 9469.65346582 3063.69251191 +2 2 7 2 4 -535.97426219 0.70699113 1555.59473081 +2 2 7 2 5 534.44244807 0.96407882 -1556.51596168 +2 2 7 2 6 3057.43671158 -9463.14057781 -3060.02901240 +2 2 7 2 7 -71902.24074582 74051.44022810 71937.32250277 +2 2 7 2 8 -1554.18074854 1.02835074 535.80287040 +2 2 7 3 1 3075.39000155 539.99125726 0.47132742 +2 2 7 3 2 80709.40067273 -66969.85283938 -71951.14096581 +2 2 7 3 3 90.21635328 -3060.52176380 890.12325954 +2 2 7 3 4 -101.65675524 -884.78869009 3065.04222225 +2 2 7 3 5 3079.64266033 -1559.90094952 -1.79961379 +2 2 7 3 6 -3076.85754375 -4.02770706 1558.31557547 +2 2 7 3 7 -80703.27341625 71939.86124365 66976.37643938 +2 2 7 3 8 -3073.03336444 -0.83553497 -537.45251638 +2 3 7 1 1 3.53495566 3077.93945442 1556.83732128 +2 3 7 1 2 -71942.21788076 80699.11716535 66981.27181737 +2 3 7 1 3 2.48518095 3075.53996937 -537.99882771 +2 3 7 1 4 1556.86945724 -3078.90353324 0.51417537 +2 3 7 1 5 891.39798598 92.57299038 3063.88532767 +2 3 7 1 6 -538.50229109 -3072.51918907 -0.29993563 +2 3 7 1 7 66969.13513626 -80705.09445401 -71954.82588929 +2 3 7 1 8 3057.32959172 -88.63097922 890.76597876 +2 3 7 2 1 3075.51854539 2.47446896 538.03096367 +2 3 7 2 2 80699.28855714 -71942.34642460 -66981.41107320 +2 3 7 2 3 3077.88589449 3.51353169 -1556.85874526 +2 3 7 2 4 -3078.93566920 1556.83732128 -0.47132742 +2 3 7 2 5 92.50871846 891.38727399 -3063.79963178 +2 3 7 2 6 -88.57741929 3057.39386364 -890.72313081 +2 3 7 2 7 -80705.30869375 66969.18869620 71955.05084101 +2 3 7 2 8 -3072.51918907 -538.44873116 0.36420755 +2 3 7 3 1 1559.10826249 -536.75623723 -3.21359606 +2 3 7 3 2 71946.24558782 -71946.22416384 -74126.15633640 +2 3 7 3 3 536.79908518 -1559.08683852 -3.21359606 +2 3 7 3 4 3067.70950698 -3067.69879499 -9458.19163989 +2 3 7 3 5 -3058.14370272 3058.20797464 9466.35417387 +2 3 7 3 6 -536.20992591 1559.45104607 2.91366042 +2 3 7 3 7 -71955.95064791 71956.00420784 74118.46512984 +2 3 7 3 8 -1559.42962210 536.20992591 2.99935632 +2 1 8 1 1 9471.64589538 -0.38563153 -1.99242955 +2 1 8 1 2 3.02078029 0.02142397 6.95207947 +2 1 8 1 3 -9471.53877551 0.38563153 -1.97100558 +2 1 8 1 4 -0.08569589 0.81411100 -0.23566371 +2 1 8 1 5 -9463.50478537 -1.19974253 5.74162495 +2 1 8 1 6 0.13925583 0.77126305 0.25708768 +2 1 8 1 7 9463.48336139 -0.49275140 -1.99242955 +2 1 8 1 8 -3.08505221 0.06427192 -6.88780755 +2 1 8 2 1 3063.32830435 -1558.52981520 -3077.98230237 +2 1 8 2 2 -4.69185024 -1.77818982 -2955.30862893 +2 1 8 2 3 -3063.22118448 1558.50839123 -3078.17511813 +2 1 8 2 4 0.08569589 0.68556716 573.75543983 +2 1 8 2 5 3060.84312340 1552.55252654 -3072.58346099 +2 1 8 2 6 -0.04284795 -0.19281576 2914.04605557 +2 1 8 2 7 -3055.20861832 -1557.71570420 -3075.58281731 +2 1 8 2 8 -0.81411100 6.39505615 11771.69157651 +2 1 8 3 1 3061.50726659 -3078.08942224 -1559.04399057 +2 1 8 3 2 -4.77754614 -2958.82216061 -0.83553497 +2 1 8 3 3 3061.61438646 -3078.08942224 1558.89402276 +2 1 8 3 4 -0.79268703 2913.66042404 -0.85695895 +2 1 8 3 5 -3054.39450732 -3070.33394376 1562.55752226 +2 1 8 3 6 0.95336683 574.82663851 -1.11404663 +2 1 8 3 7 -3059.08635756 -3075.43284950 -1557.28722473 +2 1 8 3 8 -4.94893793 11772.39856764 -2.31378916 +2 2 8 1 1 -3065.96345312 -1561.10069205 -3079.46055655 +2 2 8 1 2 0.10711987 -6.98421543 11784.98515220 +2 2 8 1 3 3066.00630107 1561.12211602 -3079.16062092 +2 2 8 1 4 0.05355993 0.17139179 2915.28864604 +2 2 8 1 5 -3055.74421766 1560.26515707 -3076.99679958 +2 2 8 1 6 0.17139179 -0.77126305 574.46243096 +2 2 8 1 7 3059.12920551 -1555.18767531 -3074.14741108 +2 2 8 1 8 -3.79204335 2.48518095 -2964.81016127 +2 2 8 2 1 886.39548812 0.17139179 -1.09262266 +2 2 8 2 2 -2.42090903 -0.13925583 8.76240525 +2 2 8 2 3 -886.45976004 -0.25708768 -1.17831855 +2 2 8 2 4 -0.00000000 -0.06427192 -0.32135961 +2 2 8 2 5 -891.21588220 0.40705550 3.34213990 +2 2 8 2 6 -0.05355993 -0.06427192 0.27851166 +2 2 8 2 7 891.36585002 0.23566371 -1.09262266 +2 2 8 2 8 2.37806108 -0.18210378 -8.86952511 +2 2 8 3 1 -90.75195262 -539.02717845 536.60626942 +2 2 8 3 2 -2961.97148475 7.03777536 -0.23566371 +2 2 8 3 3 -90.81622454 -539.13429832 -536.62769339 +2 2 8 3 4 3371.66213393 -0.96407882 0.53559934 +2 2 8 3 5 -84.90320780 542.19792656 534.14251244 +2 2 8 3 6 2914.08890352 0.14996782 1.24259047 +2 2 8 3 7 -92.23020681 535.29940702 -537.78458797 +2 2 8 3 8 -2965.14223286 -5.70948899 1.94958161 +2 3 8 1 1 -3069.34844096 -3080.59602716 -1556.32314591 +2 3 8 1 2 8.50531756 11786.39913446 2.34592512 +2 3 8 1 3 -3069.26274507 -3080.59602716 1556.43026578 +2 3 8 1 4 -0.19281576 573.02702472 1.00692676 +2 3 8 1 5 3062.55704130 -3078.02515032 1554.60922802 +2 3 8 1 6 1.45683021 2916.01706115 1.04977471 +2 3 8 1 7 3057.84376708 -3072.90482060 -1559.90094952 +2 3 8 1 8 8.39819769 -2963.10695536 0.92123087 +2 3 8 2 1 -94.43687610 535.57791868 -538.32018732 +2 3 8 2 2 -2955.75853237 5.20602561 2.49589294 +2 3 8 2 3 -94.52257199 535.53507073 538.25591539 +2 3 8 2 4 2915.46003783 -0.02142397 1.28543842 +2 3 8 2 5 -98.03610368 -531.82872328 -539.62704971 +2 3 8 2 6 3374.60793032 0.74983908 0.47132742 +2 3 8 2 7 -88.45958743 -538.83436268 536.02782213 +2 3 8 2 8 -2958.99355240 -6.39505615 -0.91051888 +2 3 8 3 1 885.30286546 0.17139179 2.37806108 +2 3 8 3 2 -1.73534187 1.22116650 -2.57087684 +2 3 8 3 3 -885.36713738 -0.19281576 2.46375698 +2 3 8 3 4 0.52488736 -0.92123087 -1.79961379 +2 3 8 3 5 -892.24423294 0.40705550 -7.45554285 +2 3 8 3 6 -0.86767094 -0.72841511 1.75676584 +2 3 8 3 7 894.47232621 0.17139179 2.42090903 +2 3 8 3 8 -0.19281576 -0.09640788 2.64586075 +3 1 1 1 1 -0.04284795 0.08569589 4.69185024 +3 1 1 1 2 -0.64271921 -0.00000000 -897.66449829 +3 1 1 1 3 0.01071199 0.02142397 4.54188243 +3 1 1 1 4 0.67485517 -0.08569589 -897.49310650 +3 1 1 1 5 0.04284795 0.02142397 1.60679803 +3 1 1 1 6 -0.70699113 0.06427192 891.92287334 +3 1 1 1 7 -0.00000000 0.06427192 0.55702332 +3 1 1 1 8 0.62129524 -0.00000000 891.86931340 +3 1 1 2 1 0.06427192 0.02142397 2970.18757867 +3 1 1 2 2 -539.11287434 539.09145037 80.63983703 +3 1 1 2 3 0.06427192 0.08569589 2970.36968244 +3 1 1 2 4 538.97361851 -538.89863461 80.68268498 +3 1 1 2 5 0.02142397 -0.12854384 -2913.72469596 +3 1 1 2 6 -537.54892426 -537.63462016 91.65175952 +3 1 1 2 7 0.04284795 0.01071199 -3371.82281374 +3 1 1 2 8 537.61319618 537.65604413 91.69460746 +3 1 1 3 1 7.02706338 2969.23421184 0.11783186 +3 1 1 3 2 1560.54366873 3074.81155426 -3058.35794245 +3 1 1 3 3 -12.64014449 -11784.25673709 0.02142397 +3 1 1 3 4 1560.58651668 3074.83297823 3058.40079040 +3 1 1 3 5 -0.71770312 -573.39123227 0.08569589 +3 1 1 3 6 -1557.95136791 3077.01822355 3060.07186035 +3 1 1 3 7 1.00692676 -2915.16010220 -0.02142397 +3 1 1 3 8 -1557.84424805 3076.98608759 -3059.95402849 +3 2 1 1 1 0.04284795 -0.11783186 2970.23042661 +3 2 1 1 2 538.27733937 -538.34161129 81.04689253 +3 2 1 1 3 0.04284795 -0.00000000 2970.15544271 +3 2 1 1 4 -538.26662738 538.34161129 81.19686035 +3 2 1 1 5 -0.01071199 0.04284795 -3371.81210175 +3 2 1 1 6 538.19164347 538.32018732 91.52321567 +3 2 1 1 7 0.02142397 0.03213596 -2913.68184802 +3 2 1 1 8 -538.29876334 -538.34161129 91.42680779 +3 2 1 2 1 -0.14996782 -0.05355993 4.53117044 +3 2 1 2 2 -0.00000000 0.74983908 -897.49310650 +3 2 1 2 3 0.05355993 -0.08569589 4.71327422 +3 2 1 2 4 0.07498391 -0.72841511 -897.32171471 +3 2 1 2 5 0.06427192 0.04284795 1.58537405 +3 2 1 2 6 -0.23566371 -0.59987126 891.92287334 +3 2 1 2 7 0.02142397 0.03213596 0.46061543 +3 2 1 2 8 -0.00000000 0.62129524 891.85860142 +3 2 1 3 1 2969.12709197 6.95207947 0.01071199 +3 2 1 3 2 3074.91867413 1559.02256660 -3058.46506232 +3 2 1 3 3 -11784.26744908 -7.66978259 -0.04284795 +3 2 1 3 4 3074.96152208 1559.04399057 3058.31509451 +3 2 1 3 5 -2915.17081419 0.89980690 0.06427192 +3 2 1 3 6 3076.91110368 -1559.25823031 -3059.72907677 +3 2 1 3 7 -573.41265625 0.44990345 0.02142397 +3 2 1 3 8 3076.80398381 -1559.34392621 3059.88975657 +3 3 1 1 1 -7.58408669 -11784.32100901 -0.03213596 +3 3 1 1 2 1559.04399057 3074.96152208 3058.50791027 +3 3 1 1 3 6.89851953 2969.19136389 0.06427192 +3 3 1 1 4 1559.04399057 3075.02579400 -3058.44363835 +3 3 1 1 5 0.88909491 -2915.16010220 0.06427192 +3 3 1 1 6 -1559.38677415 3076.86825574 -3059.94331651 +3 3 1 1 7 0.53559934 -573.32696035 0.01071199 +3 3 1 1 8 -1559.40819813 3076.83611978 3059.93260452 +3 3 1 2 1 -11784.42812888 -12.51160064 0.07498391 +3 3 1 2 2 3074.94009810 1560.47939681 3058.25082259 +3 3 1 2 3 2969.15922793 7.15560722 -0.06427192 +3 3 1 2 4 3074.86511419 1560.58651668 -3058.10085477 +3 3 1 2 5 -573.27340042 -0.72841511 -0.06427192 +3 3 1 2 6 3076.91110368 -1557.95136791 3060.11470830 +3 3 1 2 7 -2915.22437412 1.00692676 -0.05355993 +3 3 1 2 8 3076.97537560 -1557.95136791 -3060.11470830 +3 3 1 3 1 -0.06427192 0.06427192 11.24758620 +3 3 1 3 2 0.10711987 -0.06427192 -9480.12978896 +3 3 1 3 3 0.02142397 -0.06427192 11.16189030 +3 3 1 3 4 -0.07498391 -0.00000000 -9480.06551704 +3 3 1 3 5 0.01071199 0.02142397 3.92058719 +3 3 1 3 6 0.17139179 0.12854384 9465.28297519 +3 3 1 3 7 -0.02142397 -0.02142397 3.11718817 +3 3 1 3 8 -0.21423974 -0.12854384 9465.26155121 +3 1 2 1 1 -0.85695895 -539.56277779 1559.91166151 +3 1 2 1 2 -74179.69484669 -72096.74900310 72069.39058868 +3 1 2 1 3 74175.97778725 72096.19197979 -72067.48385502 +3 1 2 1 4 0.37491954 538.98433050 -1559.15111044 +3 1 2 1 5 9477.31253642 3068.17012241 -3066.67044425 +3 1 2 1 6 0.16067980 1560.65078860 -539.21999421 +3 1 2 1 7 -0.25708768 -1561.43276364 539.66989766 +3 1 2 1 8 -9473.05987764 -3066.27410074 3063.74607184 +3 1 2 2 1 -0.57844729 538.99504249 3074.40449876 +3 1 2 2 2 -72093.98531050 -67136.92769833 80911.73939240 +3 1 2 2 3 67125.08024087 72103.30473906 -80912.20000783 +3 1 2 2 4 -538.69510686 0.74983908 -3074.38307479 +3 1 2 2 5 -1.98171757 -1559.53674197 3080.25324358 +3 1 2 2 6 1557.35149665 1.58537405 -3077.14676739 +3 1 2 2 7 889.24487662 -3060.01830042 90.39845705 +3 1 2 2 8 3063.49969614 -888.05584608 -93.03360582 +3 1 2 3 1 -893.33685560 82.97505016 -3055.85133753 +3 1 2 3 2 72063.69181167 80909.16851555 -67096.30784418 +3 1 2 3 3 -67086.14216866 -80898.70290440 72061.14235880 +3 1 2 3 4 -1559.26894230 -3074.64016247 0.59987126 +3 1 2 3 5 2.18524532 3079.46055655 -1557.26580076 +3 1 2 3 6 536.02782213 -3081.17447445 -0.34278358 +3 1 2 3 7 2.63514877 3077.88589449 536.89549306 +3 1 2 3 8 -3065.72778941 -94.97247544 -888.66642933 +3 2 2 1 1 537.89170784 -0.31064762 3074.43663472 +3 2 2 1 2 -67119.38146386 -72106.87183068 80913.15337466 +3 2 2 1 3 72091.97145697 67135.51371607 -80913.99962162 +3 2 2 1 4 1.34971034 -538.10594758 -3073.52611584 +3 2 2 1 5 -3068.60931387 888.49503754 94.60826789 +3 2 2 1 6 -887.97015019 3063.41400025 -92.91577396 +3 2 2 1 7 -1556.79447333 0.47132742 3075.22932175 +3 2 2 1 8 1.49967816 1557.42648056 -3076.98608759 +3 2 2 2 1 -538.64154692 0.42847947 1558.26201553 +3 2 2 2 2 -72107.65380572 -74174.14603750 72072.33638507 +3 2 2 2 3 72109.41057156 74175.38862797 -72075.34645337 +3 2 2 2 4 538.97361851 0.38563153 -1559.19395839 +3 2 2 2 5 -1559.71884575 0.36420755 538.92005858 +3 2 2 2 6 -3066.30623670 -9473.01702969 3063.82105575 +3 2 2 2 7 3063.13548859 9470.58540868 -3059.57910895 +3 2 2 2 8 1560.69363655 0.09640788 -539.20928222 +3 2 2 3 1 83.29640977 -893.59394329 -3055.82991356 +3 2 2 3 2 80911.27877696 72070.39751544 -67094.63677423 +3 2 2 3 3 -80900.57750210 -67090.39482744 72062.44922120 +3 2 2 3 4 -3074.67229843 -1559.30107826 0.47132742 +3 2 2 3 5 3080.88525081 0.10711987 536.28490981 +3 2 2 3 6 -94.95105147 -3065.77063736 -888.68785331 +3 2 2 3 7 3075.88275295 2.62443678 -1559.79382965 +3 2 2 3 8 -3081.13162650 535.98497418 -0.35349557 +3 3 2 1 1 1558.74405494 3074.40449876 -0.32135961 +3 3 2 1 2 67084.16045109 80902.76274741 -72062.98482054 +3 3 2 1 3 -72067.52670297 -80910.57178583 67096.80059558 +3 3 2 1 4 893.76533507 -83.21071387 3055.74421766 +3 3 2 1 5 3067.72021896 95.22956312 888.02371012 +3 3 2 1 6 -1.11404663 -3079.20346887 -536.39202968 +3 3 2 1 7 -534.72095973 3079.14990894 -0.26779967 +3 3 2 1 8 -1.02835074 -3078.63573357 1559.50460601 +3 3 2 2 1 3074.59731452 1560.11518926 -0.54631133 +3 3 2 2 2 80902.79488338 67095.00098179 -72062.32067736 +3 3 2 2 3 -80911.81437631 -72074.38237455 67095.25806947 +3 3 2 2 4 -83.22142586 893.78675905 3055.74421766 +3 3 2 2 5 3081.30301829 -535.98497418 -0.38563153 +3 3 2 2 6 -3078.64644555 -1.04977471 1559.49389402 +3 3 2 2 7 94.24406033 3063.59610402 889.20202868 +3 3 2 2 8 -3079.18204490 -1.11404663 -536.40274167 +3 3 2 3 1 3055.48712998 3055.31573819 -9478.86577451 +3 3 2 3 2 -72065.34145765 -72064.62375453 74112.07007368 +3 3 2 3 3 72065.08436997 72064.91297818 -74112.16648157 +3 3 2 3 4 -3055.92632144 -3055.93703342 9477.79457583 +3 3 2 3 5 -1555.29479517 -538.92005858 -1.64964598 +3 3 2 3 6 538.24520341 1556.45168975 2.59230082 +3 3 2 3 7 -538.77009076 -1555.44476299 -2.49589294 +3 3 2 3 8 1556.47311373 538.24520341 2.63514877 +3 1 3 1 1 0.64271921 -0.07498391 -11.75104958 +3 1 3 1 2 74172.21787986 67121.29890951 -67081.84666193 +3 1 3 1 3 3.37427586 -0.42847947 107.03417264 +3 1 3 1 4 -74176.08490712 -67120.94541395 -67081.37533451 +3 1 3 1 5 3.62065156 0.08569589 9.85502790 +3 1 3 1 6 -74114.57667861 67021.68814376 67030.98614835 +3 1 3 1 7 0.74983908 0.03213596 -4.16696289 +3 1 3 1 8 74110.19547598 -67021.61315986 67031.22181206 +3 1 3 2 1 -0.08569589 -0.20352775 -11785.57431147 +3 1 3 2 2 72096.29909966 72106.66830293 -80899.92407090 +3 1 3 2 3 -1.83174975 -3.29929195 329268.90820573 +3 1 3 2 4 -72094.36023004 -72104.91153709 -80898.81002427 +3 1 3 2 5 0.08569589 -0.12854384 2960.08617506 +3 1 3 2 6 72011.81365935 -71998.67005148 -80802.48783848 +3 1 3 2 7 -0.70699113 -0.91051888 2960.71818229 +3 1 3 2 8 -72011.28877199 72001.30520024 -80802.65923027 +3 1 3 3 1 4.69185024 2970.58392218 1.94958161 +3 1 3 3 2 -72069.49770855 -80912.14644790 72059.73908853 +3 1 3 3 3 111.45822321 329278.05624250 2.35663711 +3 1 3 3 4 -72068.66217357 -80911.19308107 -72063.00624452 +3 1 3 3 5 -8.89094909 2954.21600627 -0.29993563 +3 1 3 3 6 72017.66240417 -80799.61702601 -72002.26927906 +3 1 3 3 7 -1.58537405 -11781.05385302 0.28922365 +3 1 3 3 8 72014.75945573 -80798.96359481 72001.43374408 +3 2 3 1 1 -0.04284795 -0.21423974 -11785.60644743 +3 2 3 1 2 72094.69230163 72105.02936894 -80898.76717632 +3 2 3 1 3 0.84624696 -0.53559934 329269.31526123 +3 2 3 1 4 -72094.91725335 -72105.44713643 -80898.98141606 +3 2 3 1 5 0.05355993 -0.10711987 2960.10759904 +3 2 3 1 6 72012.35997067 -71999.78409811 -80803.40906935 +3 2 3 1 7 -0.70699113 -0.97479080 2960.64319838 +3 2 3 1 8 -72012.31712273 72001.85151157 -80803.26981352 +3 2 3 2 1 0.49275140 0.17139179 -6.94136748 +3 2 3 2 2 67130.41481032 74170.00049859 -67084.05333122 +3 2 3 2 3 5.58094515 0.98550279 133.83556374 +3 2 3 2 4 -67134.68889308 -74174.48882108 -67084.07475520 +3 2 3 2 5 3.82417931 0.29993563 -15.36098915 +3 2 3 2 6 -67016.97486955 74116.72978797 67028.92944688 +3 2 3 2 7 -1.19974253 0.93194286 -1.14618259 +3 2 3 2 8 67012.69007481 -74114.59810258 67028.84375098 +3 2 3 3 1 2972.70489558 6.17010443 0.10711987 +3 2 3 3 2 -80912.37139962 -72074.20027078 72059.29989706 +3 2 3 3 3 329275.20685400 138.95589346 0.66414318 +3 2 3 3 4 -80911.60013657 -72073.28975189 -72058.33581825 +3 2 3 3 5 -11779.81126255 -10.71198685 -0.06427192 +3 2 3 3 6 -80800.24903323 72005.41860319 72001.30520024 +3 2 3 3 7 2957.23678656 -0.95336683 -0.65343120 +3 2 3 3 8 -80800.98816032 72008.40724753 -72002.08717528 +3 3 3 1 1 5.93444072 2971.92292054 0.04284795 +3 3 3 1 2 -72069.26204484 -80911.93220816 72059.47128885 +3 3 3 1 3 110.68696015 329276.19235679 0.68556716 +3 3 3 1 4 -72068.94068523 -80911.53586465 -72059.10708130 +3 3 3 1 5 -9.04091690 2954.38739806 -0.66414318 +3 3 3 1 6 72017.40531648 -80799.35993832 -72002.01219137 +3 3 3 1 7 -1.39255829 -11781.28951673 -0.06427192 +3 3 3 1 8 72014.50236805 -80798.67437116 72001.34804819 +3 3 3 2 1 2972.61919968 6.15939244 0.19281576 +3 3 3 2 2 -80912.32855167 -72074.10386290 72059.29989706 +3 3 3 2 3 329275.39966976 139.19155717 0.85695895 +3 3 3 2 4 -80911.87864823 -72073.58968753 -72058.67860183 +3 3 3 2 5 -11779.85411049 -10.71198685 -0.14996782 +3 3 3 2 6 -80800.23832124 72005.37575525 72001.34804819 +3 3 3 2 7 2957.27963451 -0.98550279 -0.67485517 +3 3 3 2 8 -80801.03100827 72008.36439958 -72002.09788727 +3 3 3 3 1 0.62129524 0.04284795 1.09262266 +3 3 3 3 2 67094.78674205 67096.50065995 -74104.17533937 +3 3 3 3 3 3.98485911 0.59987126 -4.52045845 +3 3 3 3 4 -67098.84658507 -67098.38596963 -74104.02537156 +3 3 3 3 5 3.72777142 0.23566371 6.62000788 +3 3 3 3 6 -67033.97479269 67032.44297857 74102.71850916 +3 3 3 3 7 -0.00000000 0.89980690 -0.86767094 +3 3 3 3 8 67029.82925377 -67032.30372274 74103.00773281 +3 1 4 1 1 0.94265484 539.35925004 1559.84738959 +3 1 4 1 2 -0.34278358 -538.98433050 -1559.19395839 +3 1 4 1 3 -74176.69549037 -72097.19890655 -72068.66217357 +3 1 4 1 4 74179.78054258 72098.95567239 72069.56198047 +3 1 4 1 5 -9477.41965629 -3068.34151420 -3066.54190041 +3 1 4 1 6 9473.03845367 3066.28481272 3063.75678383 +3 1 4 1 7 0.89980690 1560.53295675 540.29119290 +3 1 4 1 8 -0.08569589 -1560.72577251 -539.16643428 +3 1 4 2 1 0.57844729 -539.01646646 3074.45805869 +3 1 4 2 2 538.44873116 -0.42847947 -3074.42592273 +3 1 4 2 3 -67122.94855549 -72105.46856040 -80912.30712770 +3 1 4 2 4 72093.73893480 67137.39902575 80911.92149617 +3 1 4 2 5 1.99242955 1559.55816594 3080.27466756 +3 1 4 2 6 -3064.30309516 888.90209304 -92.48729449 +3 1 4 2 7 -889.26630060 3060.01830042 90.38774507 +3 1 4 2 8 -1558.16560765 -0.77126305 -3077.73592667 +3 1 4 3 1 -893.31543163 82.95362619 3055.88347349 +3 1 4 3 2 -1559.40819813 -3074.46877068 -0.42847947 +3 1 4 3 3 -67086.38854436 -80901.01669356 -72061.07808688 +3 1 4 3 4 72064.54877062 80910.14330636 67097.05768326 +3 1 4 3 5 2.20666929 3079.46055655 1557.26580076 +3 1 4 3 6 -3065.64209351 -94.80108365 888.60215741 +3 1 4 3 7 2.63514877 3077.89660647 -536.89549306 +3 1 4 3 8 535.36367894 -3080.22110762 -0.29993563 +3 2 4 1 1 -537.87028387 0.28922365 3074.45805869 +3 2 4 1 2 -1.02835074 537.81672393 -3073.52611584 +3 2 4 1 3 -72094.59589375 -67133.64983035 -80914.49237302 +3 2 4 1 4 67120.01347109 72106.98966253 80913.54971818 +3 2 4 1 5 3068.57717791 -888.49503754 94.60826789 +3 2 4 1 6 -0.65343120 -1558.29415149 -3077.53239892 +3 2 4 1 7 1556.83732128 -0.43919146 3075.20789777 +3 2 4 1 8 888.79497318 -3064.20668728 -92.27305475 +3 2 4 2 1 539.00575447 -0.58915928 1558.46554328 +3 2 4 2 2 -539.00575447 -0.33207159 -1559.20467038 +3 2 4 2 3 -72107.23603823 -74173.80325392 -72073.71823137 +3 2 4 2 4 72102.90839554 74174.06034160 72071.96146553 +3 2 4 2 5 1561.55059550 -1.69249392 537.63462016 +3 2 4 2 6 -1560.68292456 -0.12854384 -539.15572229 +3 2 4 2 7 -3062.74985706 -9470.44615285 -3059.72907677 +3 2 4 2 8 3066.30623670 9473.01702969 3063.77820780 +3 2 4 3 1 83.31783374 -893.60465527 3055.82991356 +3 2 4 3 2 -3074.46877068 -1559.37606217 -0.42847947 +3 2 4 3 3 -80902.91271523 -67090.58764320 -72062.83485273 +3 2 4 3 4 80912.40353558 72071.06165863 67095.81509279 +3 2 4 3 5 3080.87453882 0.08569589 -536.26348584 +3 2 4 3 6 -3080.22110762 535.29940702 -0.27851166 +3 2 4 3 7 3075.90417692 2.62443678 1559.81525363 +3 2 4 3 8 -94.82250762 -3065.60995755 888.58073344 +3 3 4 1 1 1558.67978302 3074.40449876 0.28922365 +3 3 4 1 2 893.42255150 -83.06074606 -3055.91560945 +3 3 4 1 3 -72063.40258803 -80910.85029749 -67097.10053121 +3 3 4 1 4 67082.62863697 80901.74510866 72062.02074173 +3 3 4 1 5 3067.73093095 95.27241107 -887.95943820 +3 3 4 1 6 -2.84938850 -3077.33958316 -1558.14418368 +3 3 4 1 7 -534.67811179 3079.11777297 0.28922365 +3 3 4 1 8 -1.41398226 -3079.41770861 536.58484545 +3 3 4 2 1 3074.55446658 1560.07234131 0.56773530 +3 3 4 2 2 -83.06074606 893.41183951 -3055.93703342 +3 3 4 2 3 -80911.84651227 -72070.09757981 -67095.21522152 +3 3 4 2 4 80901.59514085 67093.32991184 72061.46371841 +3 3 4 2 5 3081.32444227 -535.98497418 0.32135961 +3 3 4 2 6 -3079.41770861 -1.45683021 536.60626942 +3 3 4 2 7 94.24406033 3063.60681601 -889.22345265 +3 3 4 2 8 -3077.31815918 -2.86010049 -1558.18703163 +3 3 4 3 1 -3055.42285806 -3055.26217825 -9478.83363855 +3 3 4 3 2 3056.06557727 3056.03344131 9478.00881557 +3 3 4 3 3 -72067.38744714 -72067.22676734 -74112.38072130 +3 3 4 3 4 72067.00181561 72066.24126455 74113.70900767 +3 3 4 3 5 1555.31621915 538.87721063 -1.69249392 +3 3 4 3 6 -1555.43405100 -538.70581884 1.88530969 +3 3 4 3 7 538.68439487 1555.42333902 -2.52802890 +3 3 4 3 8 -538.68439487 -1555.43405100 1.92815763 +3 1 5 1 1 -0.02142397 0.01071199 -0.12854384 +3 1 5 1 2 9474.64525169 -0.81411100 0.92123087 +3 1 5 1 3 0.09640788 -0.10711987 -8.67670935 +3 1 5 1 4 -9474.69881163 0.89980690 0.89980690 +3 1 5 1 5 0.08569589 0.02142397 13.38998357 +3 1 5 1 6 -9456.28490623 -0.00000000 -3.08505221 +3 1 5 1 7 0.02142397 0.03213596 -0.16067980 +3 1 5 1 8 9456.17778636 0.07498391 -3.09576420 +3 1 5 2 1 0.12854384 0.07498391 -573.11272061 +3 1 5 2 2 3069.58410468 -1560.52224476 3080.36036345 +3 1 5 2 3 0.99621478 -0.64271921 2958.99355240 +3 1 5 2 4 -3069.50912077 1560.52224476 3080.42463537 +3 1 5 2 5 0.88909491 0.55702332 -11775.53717979 +3 1 5 2 6 3057.22247185 1553.23809370 3071.89789384 +3 1 5 2 7 0.23566371 -0.11783186 -2914.66735081 +3 1 5 2 8 -3059.40771717 -1553.18453376 3071.72650205 +3 1 5 3 1 1.99242955 -2913.89608775 -0.04284795 +3 1 5 3 2 -3068.74856970 3081.19589842 -1558.05848778 +3 1 5 3 3 14.17195861 2960.92171004 -0.04284795 +3 1 5 3 4 -3068.69500977 3081.19589842 1558.37984739 +3 1 5 3 5 16.69998750 -11774.25174137 0.02142397 +3 1 5 3 6 3053.10906890 3069.81976839 1560.43654886 +3 1 5 3 7 -1.54252611 -574.69809467 -0.03213596 +3 1 5 3 8 3052.95910108 3069.83048037 -1560.50082079 +3 2 5 1 1 -0.12854384 -0.13925583 -2915.42790187 +3 2 5 1 2 -3069.24132110 -1560.80075642 3081.41013816 +3 2 5 1 3 -0.89980690 0.57844729 -11785.62787141 +3 2 5 1 4 3069.29488103 1560.82218039 3081.23874637 +3 2 5 1 5 -0.93194286 -0.66414318 2965.42074452 +3 2 5 1 6 -3054.05172374 1558.07991176 3073.61181173 +3 2 5 1 7 -0.17139179 0.07498391 -574.35531109 +3 2 5 1 8 3056.21554508 -1558.02635182 3073.75106756 +3 2 5 2 1 0.23566371 0.17139179 0.81411100 +3 2 5 2 2 890.27322736 0.89980690 -0.25708768 +3 2 5 2 3 0.91051888 -0.77126305 -8.41962167 +3 2 5 2 4 -890.25180339 -0.89980690 -0.08569589 +3 2 5 2 5 0.92123087 0.66414318 12.61872051 +3 2 5 2 6 -889.45911636 -0.55702332 -2.31378916 +3 2 5 2 7 0.17139179 -0.08569589 0.37491954 +3 2 5 2 8 887.31671899 0.54631133 -2.52802890 +3 2 5 3 1 -3372.09061341 1.34971034 0.10711987 +3 2 5 3 2 94.02982060 538.23449142 536.43487763 +3 2 5 3 3 2959.25064009 -12.23308899 0.64271921 +3 2 5 3 4 93.96554868 538.25591539 -536.62769339 +3 2 5 3 5 2962.47494813 13.75419112 -0.59987126 +3 2 5 3 6 89.53078612 -539.51992984 536.19921392 +3 2 5 3 7 -2914.66735081 -0.28922365 -0.01071199 +3 2 5 3 8 87.36696477 -539.57348978 -536.02782213 +3 3 5 1 1 0.72841511 -573.03773671 0.17139179 +3 3 5 1 2 3069.26274507 3081.79576969 -1556.45168975 +3 3 5 1 3 -8.98735697 -11786.31343857 0.68556716 +3 3 5 1 4 3069.31630500 3081.62437790 1556.40884181 +3 3 5 1 5 -8.90166107 2963.10695536 -0.66414318 +3 3 5 1 6 -3059.15062948 3074.55446658 1557.39434460 +3 3 5 1 7 -0.94265484 -2915.98492519 -0.07498391 +3 3 5 1 8 -3061.35729877 3074.46877068 -1557.36220864 +3 3 5 2 1 -2915.22437412 -0.32135961 -0.02142397 +3 3 5 2 2 94.71538776 -536.22063789 -538.29876334 +3 3 5 2 3 2957.64384206 -11.84745746 -0.64271921 +3 3 5 2 4 96.90063307 -536.28490981 538.42730718 +3 3 5 2 5 2960.80387818 16.02513233 0.66414318 +3 3 5 2 6 89.70217791 534.78523165 -537.78458797 +3 3 5 2 7 -3374.31870667 -1.07119869 0.09640788 +3 3 5 2 8 89.61648201 534.69953576 537.81672393 +3 3 5 3 1 0.17139179 -0.10711987 2.88152446 +3 3 5 3 2 888.55930946 0.08569589 -2.03527750 +3 3 5 3 3 0.89980690 0.64271921 10.13353956 +3 3 5 3 4 -890.69099485 -0.08569589 -2.27094121 +3 3 5 3 5 0.83553497 -0.66414318 -12.12596912 +3 3 5 3 6 -891.21588220 0.08569589 2.91366042 +3 3 5 3 7 0.17139179 0.05355993 -2.45304499 +3 3 5 3 8 891.32300207 -0.09640788 2.88152446 +3 1 6 1 1 -1.54252611 -536.68125333 -1558.99043064 +3 1 6 1 2 -0.04284795 1558.21916759 536.16707796 +3 1 6 1 3 -74117.21182737 72014.13816049 72010.47466099 +3 1 6 1 4 9473.78829275 -3064.07814343 -3064.99937430 +3 1 6 1 5 -9460.46258110 3056.06557727 3053.38758055 +3 1 6 1 6 74104.98945037 -72006.46837791 -71995.75639105 +3 1 6 1 7 -0.64271921 -1556.90159320 -538.74866679 +3 1 6 1 8 0.98550279 535.57791868 1558.62622309 +3 1 6 2 1 -0.44990345 -537.24898863 3076.66472799 +3 1 6 2 2 1562.06477087 1.86388571 -3081.60295392 +3 1 6 2 3 67024.11976478 -72004.13316477 -80798.58867527 +3 1 6 2 4 3065.93131716 889.26630060 -94.95105147 +3 1 6 2 5 -0.58915928 1552.85246217 3069.32701699 +3 1 6 2 6 -72004.77588398 67036.04220615 80814.39956786 +3 1 6 2 7 889.69478007 3061.36801076 90.54842487 +3 1 6 2 8 -536.00639816 -0.05355993 -3076.03272076 +3 1 6 3 1 888.43076562 91.43751978 3061.92503408 +3 1 6 3 2 -539.92698534 -3079.48198053 0.92123087 +3 1 6 3 3 67030.68621272 -80802.29502272 -72004.69018809 +3 1 6 3 4 3064.37807907 -92.42302257 889.48054033 +3 1 6 3 5 -1.83174975 3072.69058086 1561.12211602 +3 1 6 3 6 -72000.35183341 80809.42920596 67027.49404064 +3 1 6 3 7 0.72841511 3077.75735064 -536.42416564 +3 1 6 3 8 1557.84424805 -3077.17890335 0.23566371 +3 2 6 1 1 537.87028387 0.08569589 3076.40764030 +3 2 6 1 2 -889.22345265 -3065.89918120 -94.94033948 +3 2 6 1 3 72016.49479760 -67015.92509484 -80800.02408151 +3 2 6 1 4 -1.84246174 -1562.02192292 -3081.58152995 +3 2 6 1 5 -3053.48398844 -891.62293770 85.99583046 +3 2 6 1 6 -67052.13161040 71998.99141108 80813.84254455 +3 2 6 1 7 -1557.71570420 0.36420755 3076.20411255 +3 2 6 1 8 0.02142397 536.01711014 -3076.08628070 +3 2 6 2 1 537.39895645 -0.02142397 -1560.56509271 +3 2 6 2 2 3064.72086264 -9472.85634989 -3065.58853358 +3 2 6 2 3 -72000.95170468 74114.99444610 72002.82630238 +3 2 6 2 4 -1558.27272752 0.23566371 535.98497418 +3 2 6 2 5 1557.82282407 -0.85695895 -540.14122508 +3 2 6 2 6 71996.82758974 -74107.02472788 -71992.24285936 +3 2 6 2 7 -3061.95717004 9466.34346188 3060.99309122 +3 2 6 2 8 -535.49222279 -0.82482299 1558.73334295 +3 2 6 3 1 91.03046428 888.21652588 -3061.74293030 +3 2 6 3 2 -92.85150204 3063.33901634 -888.75212523 +3 2 6 3 3 -80804.00894062 67030.08634146 72004.54022027 +3 2 6 3 4 -3078.46434178 -539.39138600 -0.17139179 +3 2 6 3 5 3073.79391551 -2.31378916 536.32775776 +3 2 6 3 6 80810.84318823 -71997.40603703 -67030.32200517 +3 2 6 3 7 3076.76113587 -0.42847947 -1559.37606217 +3 2 6 3 8 -3077.12534342 1557.79068811 -0.36420755 +3 3 6 1 1 -1559.85810157 3077.32887117 -0.18210378 +3 3 6 1 2 -1.37113432 -3078.00372634 538.37374725 +3 3 6 1 3 72014.83443964 -80797.34608479 -67034.79961567 +3 3 6 1 4 -2.93508440 -3080.29609153 -1556.92301718 +3 3 6 1 5 -3058.51862226 89.83072175 -892.22280897 +3 3 6 1 6 -67037.15625278 80804.56596393 72006.40410598 +3 3 6 1 7 536.04924610 3077.12534342 -0.65343120 +3 3 6 1 8 -890.85167465 -93.22642158 -3060.23254015 +3 3 6 2 1 3077.03964753 -1558.29415149 0.54631133 +3 3 6 2 2 -3080.44605934 -2.87081248 1556.85874526 +3 3 6 2 3 -80795.49291107 72009.21064654 67037.41334046 +3 3 6 2 4 -3078.90353324 -1.94958161 -538.98433050 +3 3 6 2 5 3073.93317134 534.22820834 -0.04284795 +3 3 6 2 6 80805.85140235 -67027.64400845 -72006.31841009 +3 3 6 2 7 91.37324786 -3061.65723440 890.20895544 +3 3 6 2 8 -93.40852536 -890.94808253 3060.32894803 +3 3 6 3 1 -3063.00694475 3064.00315953 9468.50728323 +3 3 6 3 2 -536.37060571 1559.31179024 2.42090903 +3 3 6 3 3 -71999.58057036 72000.59820911 74099.69772887 +3 3 6 3 4 -1559.31179024 536.32775776 2.39948506 +3 3 6 3 5 1559.54745396 -535.96355021 3.94201116 +3 3 6 3 6 71998.74503538 -72005.93277856 -74113.02344051 +3 3 6 3 7 538.57727500 -1556.96586512 1.48896617 +3 3 6 3 8 3061.33587480 -3061.36801076 -9465.39009505 +3 1 7 1 1 0.06427192 -0.04284795 0.64271921 +3 1 7 1 2 -0.57844729 889.00921291 2.39948506 +3 1 7 1 3 0.08569589 0.06427192 -2.20666929 +3 1 7 1 4 0.55702332 -889.05206086 2.14239737 +3 1 7 1 5 -0.06427192 0.10711987 -1.92815763 +3 1 7 1 6 -0.83553497 888.60215741 0.21423974 +3 1 7 1 7 0.02142397 -0.04284795 -1.92815763 +3 1 7 1 8 0.85695895 -888.62358139 0.24637570 +3 1 7 2 1 0.06427192 0.18210378 -2915.08511829 +3 1 7 2 2 -1561.33635576 -3058.27224656 3077.57524687 +3 1 7 2 3 -0.62129524 0.87838292 -11783.14269046 +3 1 7 2 4 1561.35777973 3058.22939861 3077.85375853 +3 1 7 2 5 -0.09640788 0.10711987 -574.86948646 +3 1 7 2 6 -1557.37292062 3060.80027546 3077.38243110 +3 1 7 2 7 0.66414318 0.92123087 2962.94627555 +3 1 7 2 8 1557.39434460 -3063.01765673 3077.44670303 +3 1 7 3 1 0.70699113 -3372.07990142 -0.01071199 +3 1 7 3 2 539.79844150 91.80172733 536.58484545 +3 1 7 3 3 -3.94201116 2960.30041480 0.04284795 +3 1 7 3 4 539.83057746 91.84457528 -536.71338929 +3 1 7 3 5 -0.16067980 -2914.49595902 -0.04284795 +3 1 7 3 6 -538.06309963 89.42366625 -536.02782213 +3 1 7 3 7 -0.25708768 2963.38546701 -0.07498391 +3 1 7 3 8 -537.93455579 89.63790599 536.14565398 +3 2 7 1 1 -0.08569589 -0.19281576 -573.42336823 +3 2 7 1 2 -1556.45168975 3063.52112012 3075.66851321 +3 2 7 1 3 0.68556716 -0.96407882 2957.90092975 +3 2 7 1 4 1556.47311373 -3063.56396806 3075.96844884 +3 2 7 1 5 0.07498391 -0.17139179 -2914.53880696 +3 2 7 1 6 -1557.33007268 -3061.10021109 3076.35408037 +3 2 7 1 7 -0.62129524 -0.88909491 -11774.32672528 +3 2 7 1 8 1557.15868089 3063.25332045 3076.33265639 +3 2 7 2 1 -0.02142397 -0.03213596 0.66414318 +3 2 7 2 2 -0.08569589 9468.73223495 2.97793235 +3 2 7 2 3 -0.03213596 -0.02142397 -3.83489129 +3 2 7 2 4 0.12854384 -9468.68938700 2.78511658 +3 2 7 2 5 0.04284795 0.12854384 -0.32135961 +3 2 7 2 6 0.66414318 9468.71081098 -0.94265484 +3 2 7 2 7 -0.02142397 0.02142397 -0.93194286 +3 2 7 2 8 -0.79268703 -9468.67867502 -0.98550279 +3 2 7 3 1 -2913.78896788 0.06427192 0.02142397 +3 2 7 3 2 3074.98294605 -3058.85069385 -1559.68670978 +3 2 7 3 3 2960.15044698 -1.92815763 0.64271921 +3 2 7 3 4 3075.04721797 -3058.87211782 1559.45104607 +3 2 7 3 5 -574.76236659 0.32135961 -0.06427192 +3 2 7 3 6 3076.13984063 3060.54318777 -1559.36535018 +3 2 7 3 7 -11773.78041395 -4.17767487 -0.74983908 +3 2 7 3 8 3076.07556871 3062.82484097 1559.31179024 +3 3 7 1 1 0.85695895 -2914.62450286 0.04284795 +3 3 7 1 2 -534.87092755 92.03739104 -538.27733937 +3 3 7 1 3 -1.67106995 2960.27899083 -0.04284795 +3 3 7 1 4 -534.94591146 91.97311912 538.34161129 +3 3 7 1 5 -1.04977471 -3373.78310733 0.02142397 +3 3 7 1 6 535.89927829 90.40916904 537.91313182 +3 3 7 1 7 -0.00000000 2963.53543483 -0.02142397 +3 3 7 1 8 535.89927829 90.32347315 -537.87028387 +3 3 7 2 1 -573.45550419 1.02835074 -0.13925583 +3 3 7 2 2 3079.56767642 3062.94267283 -1556.38741783 +3 3 7 2 3 -11783.83896960 -0.87838292 -0.70699113 +3 3 7 2 4 3079.59981238 3062.98552077 1556.15175412 +3 3 7 2 5 -2915.63142962 -0.53559934 -0.00000000 +3 3 7 2 6 3076.56832010 -3061.07878711 -1557.18010486 +3 3 7 2 7 2960.57892646 -0.73912709 0.62129524 +3 3 7 2 8 3076.58974408 -3063.37115230 1557.19081685 +3 3 7 3 1 -0.02142397 -0.03213596 2.19595730 +3 3 7 3 2 0.19281576 890.91594657 -2.84938850 +3 3 7 3 3 -0.05355993 -0.00000000 4.77754614 +3 3 7 3 4 -0.10711987 -890.74455478 -2.78511658 +3 3 7 3 5 0.02142397 0.02142397 -2.48518095 +3 3 7 3 6 -0.14996782 888.96636496 1.97100558 +3 3 7 3 7 0.04284795 -0.01071199 -2.77440459 +3 3 7 3 8 0.08569589 -888.95565298 2.00314154 +3 1 8 1 1 1.22116650 536.49914955 -1559.18324640 +3 1 8 1 2 -9472.84563790 3064.68872668 -3065.65280550 +3 1 8 1 3 74113.44120800 -72013.13123373 72009.44631025 +3 1 8 1 4 0.21423974 -1558.31557547 535.98497418 +3 1 8 1 5 9458.56655943 -3057.37243966 3054.60874706 +3 1 8 1 6 -0.85695895 -535.44937484 1558.82975084 +3 1 8 1 7 0.23566371 1557.07298499 -538.60941096 +3 1 8 1 8 -74099.91196861 72006.06132240 -71995.43503145 +3 1 8 2 1 0.23566371 537.18471671 3076.51476017 +3 1 8 2 2 -3065.85633325 -889.27701258 -94.91891551 +3 1 8 2 3 -67025.19096347 72004.77588398 -80799.06000269 +3 1 8 2 4 -1562.04334689 -1.84246174 -3081.53868200 +3 1 8 2 5 -0.31064762 -1553.47375741 3069.92688826 +3 1 8 2 6 536.00639816 0.06427192 -3076.07556871 +3 1 8 2 7 -889.84474789 -3061.26089089 90.63412076 +3 1 8 2 8 72006.98255327 -67036.17074999 80814.66736753 +3 1 8 3 1 888.38791767 91.38395984 -3061.93574606 +3 1 8 3 2 3063.32830435 -92.83007807 -888.75212523 +3 1 8 3 3 67032.96786592 -80804.43742009 72004.60449219 +3 1 8 3 4 -539.45565792 -3078.47505376 -0.21423974 +3 1 8 3 5 -1.83174975 3072.75485278 -1561.20781192 +3 1 8 3 6 1557.79068811 -3077.12534342 -0.47132742 +3 1 8 3 7 0.74983908 3077.77877462 536.42416564 +3 1 8 3 8 -72001.94791945 80810.93959611 -67028.77947906 +3 2 8 1 1 -537.89170784 -0.11783186 3076.42906427 +3 2 8 1 2 1.79961379 1562.04334689 -3081.61366591 +3 2 8 1 3 -72016.45194965 67015.98936676 -80800.19547330 +3 2 8 1 4 889.26630060 3065.87775722 -94.95105147 +3 2 8 1 5 3053.47327645 891.66578565 85.93155854 +3 2 8 1 6 -0.04284795 -536.00639816 -3076.05414473 +3 2 8 1 7 1557.71570420 -0.34278358 3076.19340056 +3 2 8 1 8 67052.13161040 -71999.02354704 80814.09963223 +3 2 8 2 1 -537.46322837 -0.18210378 -1560.51153277 +3 2 8 2 2 1558.16560765 -0.06427192 536.11351802 +3 2 8 2 3 72001.62655985 -74118.18661818 72003.29762980 +3 2 8 2 4 -3064.07814343 9473.76686877 -3064.91367841 +3 2 8 2 5 -1557.73712818 0.66414318 -540.16264905 +3 2 8 2 6 535.57791868 0.96407882 1558.59408713 +3 2 8 2 7 3061.29302685 -9467.27540474 3060.36108400 +3 2 8 2 8 -71997.44888498 74110.18476400 -71992.83201864 +3 2 8 3 1 91.15900812 888.32364575 3061.85005017 +3 2 8 3 2 -3079.48198053 -539.83057746 0.89980690 +3 2 8 3 3 -80800.89175244 67027.19410501 -72003.70468530 +3 2 8 3 4 -92.35875065 3064.35665509 889.48054033 +3 2 8 3 5 3074.72585837 -1.64964598 -536.92762902 +3 2 8 3 6 -3077.16819137 1557.82282407 0.27851166 +3 2 8 3 7 3076.97537560 -0.46061543 1559.29036627 +3 2 8 3 8 80807.07256886 -71995.79923900 67028.83303900 +3 3 8 1 1 -1559.83667760 3077.32887117 0.14996782 +3 3 8 1 2 -2.84938850 -3080.47819531 1556.83732128 +3 3 8 1 3 72014.72731977 -80795.37507921 67034.92815952 +3 3 8 1 4 -1.97100558 -3078.90353324 -539.02717845 +3 3 8 1 5 -3058.50791027 89.78787380 892.22280897 +3 3 8 1 6 -890.95879452 -93.45137331 3060.37179598 +3 3 8 1 7 536.02782213 3077.09320746 0.65343120 +3 3 8 1 8 -67036.74919728 80803.78398889 -72005.93277856 +3 3 8 2 1 3077.21103932 -1558.18703163 -0.43919146 +3 3 8 2 2 -3077.98230237 -1.36042233 538.37374725 +3 3 8 2 3 -80796.64980565 72008.82501501 -67036.85631715 +3 3 8 2 4 -3080.28537954 -2.93508440 -1556.92301718 +3 3 8 2 5 3074.86511419 534.95662344 -0.62129524 +3 3 8 2 6 -93.24784556 -890.87309862 -3060.30752406 +3 3 8 2 7 91.48036773 -3061.79649023 -890.29465133 +3 3 8 2 8 80804.67308380 -67028.64022323 72007.03611321 +3 3 8 3 1 3063.17833654 -3063.88532767 9468.58226714 +3 3 8 3 2 1559.32250223 -536.33846975 2.41019704 +3 3 8 3 3 72000.45895328 -72001.15523243 74100.55468782 +3 3 8 3 4 536.33846975 -1559.30107826 2.39948506 +3 3 8 3 5 -1558.66907103 536.62769339 3.29929195 +3 3 8 3 6 -3061.37872275 3061.33587480 -9465.34724711 +3 3 8 3 7 -538.36303526 1556.91230519 1.42469425 +3 3 8 3 8 -72000.83387282 72005.80423472 -74113.00201654 +4 1 1 1 1 74175.26008413 72107.09678240 -72075.07865370 +4 1 1 1 2 0.32135961 539.16643428 -1559.26894230 +4 1 1 1 3 0.42847947 -538.62012295 1558.20845560 +4 1 1 1 4 -74173.53545425 -72106.60403101 72071.34017029 +4 1 1 1 5 0.37491954 -1559.70813376 538.92005858 +4 1 1 1 6 -9472.92062181 -3066.09199696 3063.86390370 +4 1 1 1 7 9470.53184874 3063.13548859 -3059.60053293 +4 1 1 1 8 -0.53559934 1561.58273146 -538.52371507 +4 1 1 2 1 72106.62545498 67123.79480245 -80913.06767877 +4 1 1 2 2 0.42847947 -538.47015513 -3074.44734671 +4 1 1 2 3 539.15572229 -0.66414318 3074.42592273 +4 1 1 2 4 -67139.60569504 -72093.92103857 80911.96434412 +4 1 1 2 5 -1559.39748614 -1.84246174 3080.44605934 +4 1 1 2 6 0.73912709 1558.20845560 -3077.74663866 +4 1 1 2 7 -3059.08635756 888.61286940 90.98761633 +4 1 1 2 8 -888.92351702 3064.33523112 -92.48729449 +4 1 1 3 1 -72073.35402382 -80911.05382524 67094.51894238 +4 1 1 3 2 893.78675905 -83.22142586 3055.75492965 +4 1 1 3 3 1560.28658105 3074.42592273 -0.59987126 +4 1 1 3 4 67092.82644846 80902.68776351 -72062.34210133 +4 1 1 3 5 -535.78144643 3081.38871419 -0.23566371 +4 1 1 3 6 -1.06048670 -3078.64644555 1559.47247005 +4 1 1 3 7 3064.50662291 93.62276510 889.83403590 +4 1 1 3 8 -1.09262266 -3079.24631682 -536.45630160 +4 2 1 1 1 67134.29254956 72094.91725335 -80912.69275923 +4 2 1 1 2 -538.47015513 0.42847947 -3074.43663472 +4 2 1 1 3 -0.10711987 537.82743592 3074.38307479 +4 2 1 1 4 -72108.24296500 -67119.16722413 80912.73560717 +4 2 1 1 5 888.66642933 -3068.42721010 94.71538776 +4 2 1 1 6 3064.30309516 -888.88066907 -92.46587052 +4 2 1 1 7 1.39255829 -1557.45861652 3075.88275295 +4 2 1 1 8 1558.18703163 0.74983908 -3077.70379071 +4 2 1 2 1 72092.97838373 74174.46739710 -72066.57333614 +4 2 1 2 2 539.17714626 0.26779967 -1559.32250223 +4 2 1 2 3 -539.41280997 -1.19974253 1560.13661323 +4 2 1 2 4 -72096.06343594 -74174.89587658 72068.94068523 +4 2 1 2 5 3069.44484885 9475.43793872 -3067.95588267 +4 2 1 2 6 1561.55059550 -0.47132742 -538.57727500 +4 2 1 2 7 -1561.63629139 -0.63200722 539.44494594 +4 2 1 2 8 -3066.07057299 -9472.96346976 3063.83176774 +4 2 1 3 1 -80907.35818977 -72066.79828786 67095.99719656 +4 2 1 3 2 -83.44637759 893.85103097 3055.82991356 +4 2 1 3 3 3074.57589055 1558.59408713 -0.38563153 +4 2 1 3 4 80899.66698321 67083.49630791 -72062.04216570 +4 2 1 3 5 95.48665081 3067.78449088 888.02371012 +4 2 1 3 6 -3080.15683570 -0.42847947 -537.14186876 +4 2 1 3 7 3080.03900384 -535.31011901 0.35349557 +4 2 1 3 8 -3078.79641337 -1.14618259 1559.37606217 +4 3 1 1 1 -67090.78045897 -80901.40232508 72062.95268458 +4 3 1 1 2 -1559.30107826 -3074.61873850 0.52488736 +4 3 1 1 3 -893.34756759 83.01789811 -3055.87276150 +4 3 1 1 4 72068.69430953 80914.12816547 -67095.10810166 +4 3 1 1 5 0.92123087 3079.99615590 535.68503855 +4 3 1 1 6 -3065.71707742 -94.95105147 -888.64500536 +4 3 1 1 7 3.44925977 3075.04721797 -1559.22609435 +4 3 1 1 8 536.00639816 -3081.11020253 -0.34278358 +4 3 1 2 1 -80900.84530177 -67087.74896669 72062.40637325 +4 3 1 2 2 -3074.61873850 -1559.29036627 0.52488736 +4 3 1 2 3 82.62155460 -893.18688778 -3055.78706561 +4 3 1 2 4 80913.74253394 72064.01317128 -67096.69347571 +4 3 1 2 5 3079.08563701 2.01385353 -1557.41576857 +4 3 1 2 6 -3081.14233849 536.00639816 -0.32135961 +4 3 1 2 7 3076.09699268 3.89916321 535.63147862 +4 3 1 2 8 -94.95105147 -3065.72778941 -888.64500536 +4 3 1 3 1 72061.67795815 72062.13857358 -74113.49476794 +4 3 1 3 2 -3055.20861832 -3055.20861832 9478.51227895 +4 3 1 3 3 3055.10149845 3055.57282587 -9478.69438273 +4 3 1 3 4 -72061.52799033 -72064.27025896 74111.50233838 +4 3 1 3 5 -539.02717845 -1555.40191504 -1.75676584 +4 3 1 3 6 1557.40505658 537.82743592 3.59922758 +4 3 1 3 7 -1556.30172194 -538.08452360 -3.13861215 +4 3 1 3 8 537.82743592 1557.40505658 3.58851560 +4 1 2 1 1 -0.02142397 -0.00000000 897.49310650 +4 1 2 1 2 -0.81411100 0.51417537 -5.49524926 +4 1 2 1 3 -0.02142397 -0.00000000 897.62165034 +4 1 2 1 4 0.84624696 -0.47132742 -5.44168932 +4 1 2 1 5 0.04284795 -0.04284795 -895.17931734 +4 1 2 1 6 0.01071199 -0.29993563 -1.32828637 +4 1 2 1 7 -0.04284795 -0.08569589 -886.63115183 +4 1 2 1 8 0.04284795 0.32135961 -1.24259047 +4 1 2 2 1 538.64154692 -538.57727500 -82.99647414 +4 1 2 2 2 1.47825419 -5.47382528 -2969.45916356 +4 1 2 2 3 -538.74866679 538.72724282 -83.03932209 +4 1 2 2 4 -5.47382528 1.56395008 -2969.46987555 +4 1 2 2 5 540.20549700 540.18407303 -80.89692471 +4 1 2 2 6 -0.73912709 -0.81411100 2913.96035967 +4 1 2 2 7 -535.70646252 -535.55649471 -99.87856542 +4 1 2 2 8 0.17139179 0.17139179 3371.86566168 +4 1 2 3 1 -1559.79382965 -3074.91867413 3058.48648630 +4 1 2 3 2 -5.03463382 -2969.84479509 -1.70320591 +4 1 2 3 3 -1559.77240568 -3074.89725015 -3056.17269714 +4 1 2 3 4 8.11968603 11785.02800014 -7.17703119 +4 1 2 3 5 1560.88645231 -3075.17576181 -3060.02901240 +4 1 2 3 6 -0.04284795 573.30553638 1.07119869 +4 1 2 3 7 1556.49453770 -3078.68929350 3064.50662291 +4 1 2 3 8 -0.77126305 2915.25651008 0.87838292 +4 2 2 1 1 -538.59869897 538.62012295 -83.01789811 +4 2 2 1 2 5.50596124 -1.55323809 -2969.43773959 +4 2 2 1 3 538.70581884 -538.64154692 -83.08217003 +4 2 2 1 4 -1.58537405 5.39884137 -2969.44845157 +4 2 2 1 5 -540.24834495 -540.22692098 -80.89692471 +4 2 2 1 6 -0.09640788 -0.06427192 3371.94064559 +4 2 2 1 7 535.51364676 535.59934265 -99.79286952 +4 2 2 1 8 0.74983908 0.83553497 2914.00320762 +4 2 2 2 1 -0.02142397 -0.06427192 897.40741060 +4 2 2 2 2 -0.49275140 0.79268703 -5.40955336 +4 2 2 2 3 0.06427192 0.04284795 897.57880239 +4 2 2 2 4 0.54631133 -0.83553497 -5.44168932 +4 2 2 2 5 0.04284795 0.02142397 -895.00792555 +4 2 2 2 6 -0.27851166 0.02142397 -1.17831855 +4 2 2 2 7 0.06427192 -0.04284795 -886.60972786 +4 2 2 2 8 0.27851166 -0.03213596 -1.14618259 +4 2 2 3 1 -3074.89725015 -1559.75098171 3058.22939861 +4 2 2 3 2 -2969.74838720 -5.06676978 -0.14996782 +4 2 2 3 3 -3075.02579400 -1559.75098171 -3056.17269714 +4 2 2 3 4 11784.94230425 8.09826206 5.29172151 +4 2 2 3 5 -3075.17576181 1560.86502834 3060.02901240 +4 2 2 3 6 2915.24579810 -0.68556716 -1.32828637 +4 2 2 3 7 -3078.66786953 1556.58023360 -3064.39950304 +4 2 2 3 8 573.24126446 -0.14996782 -1.51039015 +4 3 2 1 1 -1559.79382965 -3074.85440221 -3058.35794245 +4 3 2 1 2 8.76240525 11785.57431147 6.13796847 +4 3 2 1 3 -1559.77240568 -3074.85440221 3058.35794245 +4 3 2 1 4 -5.72020098 -2970.47680231 0.81411100 +4 3 2 1 5 1560.84360436 -3075.11148989 3059.85762061 +4 3 2 1 6 -0.85695895 2915.35291796 -0.98550279 +4 3 2 1 7 1556.58023360 -3078.71071747 -3064.50662291 +4 3 2 1 8 0.02142397 573.13414459 -1.26401445 +4 3 2 2 1 -3074.89725015 -1559.81525363 -3058.33651848 +4 3 2 2 2 11785.67071936 8.88023710 -6.14868045 +4 3 2 2 3 -3074.96152208 -1559.77240568 3058.35794245 +4 3 2 2 4 -2970.55178622 -5.72020098 -0.79268703 +4 3 2 2 5 -3075.17576181 1560.77933244 -3059.85762061 +4 3 2 2 6 573.15556856 -0.00000000 1.26401445 +4 3 2 2 7 -3078.62502158 1556.55880962 3064.46377496 +4 3 2 2 8 2915.31007002 -0.82482299 1.09262266 +4 3 2 3 1 0.02142397 0.04284795 9477.92311967 +4 3 2 3 2 10.06926764 -8.89094909 -7.55195073 +4 3 2 3 3 0.02142397 0.06427192 9480.19406088 +4 3 2 3 4 -10.10140360 8.80525319 -7.64835861 +4 3 2 3 5 -0.02142397 -0.00000000 -9481.99367468 +4 3 2 3 6 -1.34971034 -1.15689458 -2.89223645 +4 3 2 3 7 0.02142397 -0.02142397 -9454.99946781 +4 3 2 3 8 1.37113432 1.27472644 -2.92437241 +4 1 3 1 1 1.11404663 539.33782607 1559.91166151 +4 1 3 1 2 -0.98550279 -539.63776170 -1558.30486348 +4 1 3 1 3 -74175.68856360 -72096.66330721 -72070.11900379 +4 1 3 1 4 74178.28086442 72099.64123955 72070.54748326 +4 1 3 1 5 -9476.48771343 -3068.94138546 -3067.31316346 +4 1 3 1 6 9473.11343757 3066.24196478 3063.99244754 +4 1 3 1 7 1.11404663 1560.60794065 540.18407303 +4 1 3 1 8 -0.23566371 -1560.57580469 -539.02717845 +4 1 3 2 1 -537.97740374 0.28922365 3074.46877068 +4 1 3 2 2 -1.09262266 537.79529996 -3073.51540385 +4 1 3 2 3 -72094.52090984 -67133.64983035 -80914.36382918 +4 1 3 2 4 67120.10987897 72106.92539061 80913.67826202 +4 1 3 2 5 3068.55575394 -888.51646152 94.58684391 +4 1 3 2 6 -0.68556716 -1558.31557547 -3077.59667084 +4 1 3 2 7 1556.83732128 -0.44990345 3075.21860976 +4 1 3 2 8 888.79497318 -3064.20668728 -92.28376674 +4 1 3 3 1 1558.65835905 3074.39378677 0.33207159 +4 1 3 3 2 893.40112752 -83.06074606 -3055.92632144 +4 1 3 3 3 -72063.34902810 -80910.63605775 -67096.92913942 +4 1 3 3 4 67082.62863697 80901.68083674 72061.67795815 +4 1 3 3 5 3067.69879499 95.29383505 -887.95943820 +4 1 3 3 6 -2.87081248 -3077.38243110 -1558.18703163 +4 1 3 3 7 -534.67811179 3079.12848496 0.28922365 +4 1 3 3 8 -1.41398226 -3079.39628463 536.61698141 +4 2 3 1 1 0.44990345 -538.82365070 3074.52233062 +4 2 3 1 2 537.61319618 -0.99621478 -3073.61181173 +4 2 3 1 3 -67120.24913480 -72104.89011311 -80914.06389354 +4 2 3 1 4 72093.68537486 67135.27805235 80912.26427975 +4 2 3 1 5 2.02456552 1559.72955773 3080.16754769 +4 2 3 1 6 -3065.11720616 889.43769239 -91.65175952 +4 2 3 1 7 -889.90901981 3060.92881930 89.74502586 +4 2 3 1 8 -1558.44411931 -0.73912709 -3077.48955097 +4 2 3 2 1 538.83436268 -0.52488736 1558.35842341 +4 2 3 2 2 -539.51992984 -1.10333465 -1558.17631964 +4 2 3 2 3 -72110.97452164 -74174.93872452 -72077.06037127 +4 2 3 2 4 72107.21461426 74175.66713963 72073.84677521 +4 2 3 2 5 1560.61865264 -1.07119869 538.29876334 +4 2 3 2 6 -1559.64386184 -0.85695895 -539.69132163 +4 2 3 2 7 -3062.98552077 -9470.47828881 -3059.66480485 +4 2 3 2 8 3066.37050862 9473.19913347 3063.87461568 +4 2 3 3 1 3074.61873850 1560.09376528 0.57844729 +4 2 3 3 2 -83.10359401 893.41183951 -3055.90489746 +4 2 3 3 3 -80911.79295233 -72070.01188392 -67095.21522152 +4 2 3 3 4 80901.47730899 67093.20136800 72061.07808688 +4 2 3 3 5 3081.31373028 -535.96355021 0.29993563 +4 2 3 3 6 -3079.41770861 -1.41398226 536.58484545 +4 2 3 3 7 94.20121239 3063.58539204 -889.24487662 +4 2 3 3 8 -3077.36100713 -2.88152446 -1558.19774361 +4 3 3 1 1 -893.35827957 82.96433818 3055.88347349 +4 3 3 1 2 -1559.57958992 -3074.39378677 -0.48203941 +4 3 3 1 3 -67084.21401103 -80901.08096548 -72060.94954304 +4 3 3 1 4 72063.67038770 80909.58628304 67096.45781200 +4 3 3 1 5 2.21738128 3079.48198053 1557.20152883 +4 3 3 1 6 -3066.55261240 -94.17978841 889.22345265 +4 3 3 1 7 2.67799671 3077.90731846 -536.87406909 +4 3 3 1 8 535.10659126 -3080.32822749 -0.23566371 +4 3 3 2 1 83.51064951 -893.69035117 3055.93703342 +4 3 3 2 2 -3074.40449876 -1559.57958992 -0.48203941 +4 3 3 2 3 -80901.88436449 -67087.65255881 -72061.63511020 +4 3 3 2 4 80909.41489125 72070.16185173 67094.65819821 +4 3 3 2 5 3081.80648168 -0.59987126 -536.92762902 +4 3 3 2 6 -3080.32822749 535.17086318 -0.27851166 +4 3 3 2 7 3076.03272076 2.72084466 1559.70813376 +4 3 3 2 8 -94.15836444 -3066.55261240 889.20202868 +4 3 3 3 1 -3055.52997792 -3055.10149845 -9478.78007862 +4 3 3 3 2 3055.93703342 3055.92632144 9477.76243987 +4 3 3 3 3 -72064.25954698 -72063.75608360 -74111.05243493 +4 3 3 3 4 72065.14864189 72062.25640544 74111.86654593 +4 3 3 3 5 1555.38049107 539.07002640 -1.69249392 +4 3 3 3 6 -1556.44097777 -538.29876334 2.63514877 +4 3 3 3 7 538.12737155 1556.36599386 -3.14932413 +4 3 3 3 8 -538.29876334 -1556.44097777 2.61372479 +4 1 4 1 1 -74167.86881320 -67132.10730425 67088.54165371 +4 1 4 1 2 2.12097340 -5.62379310 7.29486305 +4 1 4 1 3 74174.06034160 67119.38146386 67080.43267967 +4 1 4 1 4 -115.00389085 213.51132196 -123.83056802 +4 1 4 1 5 74170.60036985 -67112.39724844 -67088.53094173 +4 1 4 1 6 -1.14618259 3.74919540 -8.50531756 +4 1 4 1 7 -74062.48428654 66921.46679477 -66963.46849522 +4 1 4 1 8 -0.36420755 -7.75547848 8.25894186 +4 1 4 2 1 -72109.04636401 -72098.14156139 80899.57057533 +4 1 4 2 2 -1.04977471 2.06741346 11786.03492691 +4 1 4 2 3 72098.14156139 72106.94681459 80899.83837500 +4 1 4 2 4 224.35185265 -222.12375939 -329275.61390950 +4 1 4 2 5 -72115.45213215 72109.00351606 80901.80938058 +4 1 4 2 6 1.77818982 2.80654056 -2957.25821053 +4 1 4 2 7 71902.15504993 -71902.15504993 80705.06231805 +4 1 4 2 8 -0.74983908 1.71391790 -2959.42203188 +4 1 4 3 1 72071.85434566 80911.31091292 -72063.58469181 +4 1 4 3 2 -5.01320985 -2970.33754648 -6.90923152 +4 1 4 3 3 72067.01252760 80914.34240520 72060.00688820 +4 1 4 3 4 -122.05237820 -329280.77708716 -108.19106722 +4 1 4 3 5 -72081.31303005 80900.65248600 72062.59918902 +4 1 4 3 6 6.70570377 -2956.65833927 -0.27851166 +4 1 4 3 7 -71944.31743018 80700.02768423 -71944.98157337 +4 1 4 3 8 7.02706338 11781.39663660 1.52110213 +4 2 4 1 1 -72109.41057156 -72098.72000868 80899.81695103 +4 2 4 1 2 -0.42847947 1.36042233 11785.11369604 +4 2 4 1 3 72098.07728947 72106.58260703 80899.66698321 +4 2 4 1 4 223.35563787 -219.03870717 -329277.49921918 +4 2 4 1 5 -72115.58067599 72108.76785235 80901.98077237 +4 2 4 1 6 1.69249392 2.72084466 -2957.42960232 +4 2 4 1 7 71903.05485683 -71903.27980855 80708.00811444 +4 2 4 1 8 -0.79268703 1.81032578 -2959.59342367 +4 2 4 2 1 -67118.22456928 -74175.37791599 67079.97206423 +4 2 4 2 2 5.48453727 -1.55323809 7.11275927 +4 2 4 2 3 67135.19235646 74168.57580433 67091.05897063 +4 2 4 2 4 -220.20631374 114.48971549 -124.04480776 +4 2 4 2 5 67118.71732068 -74169.04713176 -67089.64498836 +4 2 4 2 6 6.95207947 0.57844729 6.55573595 +4 2 4 2 7 -66924.08051956 74057.52463663 -66964.67894973 +4 2 4 2 8 -3.83489129 4.91680197 -6.14868045 +4 2 4 3 1 80912.67133525 72070.05473187 -72065.10579394 +4 2 4 3 2 -2970.15544271 -4.95964991 10.48703513 +4 2 4 3 3 80912.01790406 72068.21227013 72057.73594698 +4 2 4 3 4 -329277.20999554 -122.99503305 112.11165440 +4 2 4 3 5 80896.86044266 -72079.95260772 -72061.65653417 +4 2 4 3 6 11782.30715548 7.66978259 1.11404663 +4 2 4 3 7 80700.12409211 -71944.87445350 71945.33506893 +4 2 4 3 8 -2956.48694748 6.60929589 -0.02142397 +4 3 4 1 1 72071.68295387 80911.37518484 -72063.56326783 +4 3 4 1 2 -4.97036190 -2970.33754648 -6.88780755 +4 3 4 1 3 72066.86255978 80914.12816547 72059.62125667 +4 3 4 1 4 -122.02024224 -329280.15579192 -108.46957887 +4 3 4 1 5 -72081.28089409 80900.58821408 72062.81342875 +4 3 4 1 6 6.69499178 -2956.65833927 -0.21423974 +4 3 4 1 7 -71943.97464660 80699.85629244 -71944.61736582 +4 3 4 1 8 7.09133530 11781.30022872 1.48896617 +4 3 4 2 1 80912.49994346 72069.87262809 -72065.06294599 +4 3 4 2 2 -2970.11259476 -4.95964991 10.51917109 +4 3 4 2 3 80912.02861604 72068.21227013 72057.77879493 +4 3 4 2 4 -329277.27426746 -122.84506523 111.29754340 +4 3 4 2 5 80896.81759471 -72079.84548785 -72061.42087046 +4 3 4 2 6 11782.24288356 7.77690246 0.96407882 +4 3 4 2 7 80700.35975583 -71944.96014939 71945.57073265 +4 3 4 2 8 -2956.50837145 6.59858390 -0.09640788 +4 3 4 3 1 -67096.30784418 -67097.92535420 74105.35365793 +4 3 4 3 2 4.34906666 -1.46754220 -7.12347126 +4 3 4 3 3 67094.73318212 67093.13709607 74109.12427730 +4 3 4 3 4 -107.88041960 110.91191188 4.58473037 +4 3 4 3 5 67086.95627966 -67087.33119920 -74078.23090722 +4 3 4 3 6 -0.88909491 -1.11404663 -5.99871264 +4 3 4 3 7 -66981.47534512 66981.07900160 -74121.55018205 +4 3 4 3 8 0.64271921 2.61372479 -5.98800065 +4 1 5 1 1 1.30686240 -1559.55816594 -536.92762902 +4 1 5 1 2 -0.21423974 540.80536827 1560.30800502 +4 1 5 1 3 -9477.32324841 3068.19154638 3067.05607578 +4 1 5 1 4 74173.47118233 -72113.84533412 -72079.65267209 +4 1 5 1 5 -74162.65207560 72101.22661361 72062.02074173 +4 1 5 1 6 9463.84756895 -3060.07186035 -3055.14434640 +4 1 5 1 7 0.55702332 -537.76316400 -1559.04399057 +4 1 5 1 8 1.04977471 1561.01499615 541.65161523 +4 1 5 2 1 -1560.00806939 0.37491954 3080.60673915 +4 1 5 2 2 0.23566371 539.92698534 -3074.61873850 +4 1 5 2 3 -3068.90924950 -888.08798204 94.95105147 +4 1 5 2 4 -67118.25670525 72109.47484348 80903.18051490 +4 1 5 2 5 72102.62988389 -67157.19477746 -80923.70468171 +4 1 5 2 6 0.73912709 -1552.98100601 -3070.56960747 +4 1 5 2 7 533.88542476 3.67421149 3077.27531124 +4 1 5 2 8 -890.38034723 -3055.08007448 -86.33861404 +4 1 5 3 1 537.95597976 3080.69243504 0.36420755 +4 1 5 3 2 -890.89452260 -81.12187644 -3057.53311947 +4 1 5 3 3 -3066.99180386 94.69396378 -888.06655807 +4 1 5 3 4 -67091.70168984 80902.47352377 72061.63511020 +4 1 5 3 5 72057.84306685 -80921.94791587 -67086.28142449 +4 1 5 3 6 7.01635139 -3071.96216576 -1561.50774755 +4 1 5 3 7 -1556.53738565 3074.92938612 -3.53495566 +4 1 5 3 8 3.23502003 -3077.67165475 534.88163954 +4 2 5 1 1 888.06655807 3068.93067348 94.88677954 +4 2 5 1 2 -540.16264905 -0.47132742 -3074.66158644 +4 2 5 1 3 -0.39634351 1559.98664542 3080.46748332 +4 2 5 1 4 -72109.92474693 67118.39596107 80902.75203543 +4 2 5 1 5 67159.65853443 -72100.92667798 -80924.24028106 +4 2 5 1 6 3054.27667546 889.54481225 -86.89563735 +4 2 5 1 7 -3.66349950 -533.89613675 3077.30744720 +4 2 5 1 8 1552.14547104 -1.60679803 -3069.96973620 +4 2 5 2 1 -3069.32701699 9475.36295481 3068.47005804 +4 2 5 2 2 -540.71967237 0.14996782 1560.14732522 +4 2 5 2 3 1560.64007661 -1.00692676 -536.15636597 +4 2 5 2 4 72113.71679028 -74171.01813734 -72081.98788522 +4 2 5 2 5 -72101.65509308 74162.74848349 72060.64960741 +4 2 5 2 6 -1560.04020535 -0.57844729 542.36931835 +4 2 5 2 7 537.74174003 -0.78197504 -1559.24751832 +4 2 5 2 8 3059.64338088 -9464.82235975 -3054.46949123 +4 2 5 3 1 94.67253981 -3066.99180386 888.12011800 +4 2 5 3 2 -81.13258843 -891.18374624 3057.27603178 +4 2 5 3 3 3080.62816312 537.97740374 -0.47132742 +4 2 5 3 4 80904.42310538 -67093.73696734 -72063.28475617 +4 2 5 3 5 -80923.98319337 72062.10643762 67085.91721694 +4 2 5 3 6 -3076.60045606 3.51353169 -534.09966450 +4 2 5 3 7 3074.96152208 -1556.52667366 3.55637964 +4 2 5 3 8 -3072.99051650 5.07748177 1562.87888187 +4 3 5 1 1 -1.58537405 3078.94638119 -537.81672393 +4 3 5 1 2 1560.58651668 -3074.75799433 -0.68556716 +4 3 5 1 3 -0.21423974 3080.31751550 1555.20909928 +4 3 5 1 4 -72075.29289344 80900.22400653 67090.52337128 +4 3 5 1 5 67095.81509279 -80906.99398222 -72056.42908459 +4 3 5 1 6 3062.98552077 -92.48729449 891.40869797 +4 3 5 1 7 889.60908418 93.36567741 3056.70829648 +4 3 5 1 8 -531.95726712 -3078.65715754 0.74983908 +4 3 5 2 1 3080.63887511 -0.43919146 -1554.99485954 +4 3 5 2 2 -3074.68301042 1560.53295675 0.50346338 +4 3 5 2 3 3080.78884292 -0.27851166 539.11287434 +4 3 5 2 4 80897.57814578 -72076.97467537 -67092.08732136 +4 3 5 2 5 -80907.37961375 67096.80059558 72055.31503796 +4 3 5 2 6 -3077.67165475 -531.48593970 -0.04284795 +4 3 5 2 7 93.68703702 889.83403590 -3056.89040025 +4 3 5 2 8 -92.91577396 3062.02144196 -890.78740273 +4 3 5 3 1 536.94905300 -1557.46932851 -2.79582857 +4 3 5 3 2 3057.07250403 -3056.72972045 -9482.87205760 +4 3 5 3 3 1557.45861652 -536.92762902 -2.78511658 +4 3 5 3 4 72065.11650593 -72064.76301036 -74082.62282182 +4 3 5 3 5 -72059.20348918 72057.02895585 74119.92196005 +4 3 5 3 6 -1553.81654099 540.29119290 -7.06991132 +4 3 5 3 7 -3064.09956741 3064.05671946 9465.71145466 +4 3 5 3 8 -539.43423395 1554.64136398 -7.60551067 +4 1 6 1 1 -9471.68874332 0.42847947 -1.88530969 +4 1 6 1 2 0.53559934 -0.61058325 -0.10711987 +4 1 6 1 3 9471.73159127 -0.44990345 -2.05670148 +4 1 6 1 4 -1.21045451 -1.39255829 6.94136748 +4 1 6 1 5 9461.21242018 1.22116650 5.87016880 +4 1 6 1 6 4.89537799 1.32828637 -6.87709556 +4 1 6 1 7 -9465.60433479 0.40705550 -1.94958161 +4 1 6 1 8 0.19281576 -0.89980690 0.14996782 +4 1 6 2 1 -3065.44927775 1558.55123918 -3077.98230237 +4 1 6 2 2 -0.66414318 -0.73912709 573.18770452 +4 1 6 2 3 3067.67737102 -1558.48696726 -3078.06799826 +4 1 6 2 4 1.92815763 2.44233300 -2958.47937704 +4 1 6 2 5 -3060.86454738 -1552.70249436 -3072.54061305 +4 1 6 2 6 -1.88530969 -6.91994351 11774.93730853 +4 1 6 2 7 3059.62195690 1557.82282407 -3075.45427347 +4 1 6 2 8 -0.44990345 0.17139179 2914.44239908 +4 1 6 3 1 3061.65723440 -3078.00372634 1559.04399057 +4 1 6 3 2 -1.11404663 2913.81039186 0.54631133 +4 1 6 3 3 3065.94202915 -3078.08942224 -1558.97971865 +4 1 6 3 4 -6.56644794 -2960.02190314 -1.64964598 +4 1 6 3 5 -3056.66544853 -3070.33394376 -1562.62179418 +4 1 6 3 6 -6.72712774 11773.54475024 4.77754614 +4 1 6 3 7 -3056.96538416 -3075.53996937 1557.26580076 +4 1 6 3 8 0.51417537 574.76236659 1.45683021 +4 2 6 1 1 3065.89918120 1561.14354000 -3079.48198053 +4 2 6 1 2 -0.02142397 -0.17139179 2915.20295015 +4 2 6 1 3 -3065.87775722 -1561.07926808 -3079.48198053 +4 2 6 1 4 -0.07498391 7.00563940 11783.82825762 +4 2 6 1 5 3053.62324426 -1560.28658105 -3077.03964753 +4 2 6 1 6 3.81346732 -2.39948506 -2963.36404304 +4 2 6 1 7 -3057.15819993 1555.16625133 -3074.08313915 +4 2 6 1 8 -0.23566371 0.70699113 574.67667069 +4 2 6 2 1 -890.70170683 -0.17139179 -1.15689458 +4 2 6 2 2 0.57844729 0.02142397 -0.55702332 +4 2 6 2 3 886.26694428 0.08569589 -1.15689458 +4 2 6 2 4 5.06676978 0.83553497 6.96279145 +4 2 6 2 5 889.07348483 -0.40705550 3.29929195 +4 2 6 2 6 0.43919146 -0.44990345 -6.87709556 +4 2 6 2 7 -891.34442605 -0.17139179 -1.07119869 +4 2 6 2 8 0.59987126 0.20352775 0.62129524 +4 2 6 3 1 -90.70910467 -539.02717845 -536.64911737 +4 2 6 3 2 3371.64070996 -0.82482299 -0.77126305 +4 2 6 3 3 -90.77337659 -539.15572229 536.62769339 +4 2 6 3 4 -2961.93934879 6.98421543 -0.96407882 +4 2 6 3 5 -87.04560517 542.28362245 -534.31390423 +4 2 6 3 6 -2965.24935273 -5.74162495 -0.53559934 +4 2 6 3 7 -89.98068957 535.36367894 537.80601195 +4 2 6 3 8 2914.02463160 0.11783186 -1.01763875 +4 3 6 1 1 -3065.06364622 -3080.70314703 1556.38741783 +4 3 6 1 2 -0.72841511 573.31624836 -0.78197504 +4 3 6 1 3 -3067.16319565 -3080.68172306 -1556.40884181 +4 3 6 1 4 5.81660886 11784.47097683 -0.34278358 +4 3 6 1 5 3064.78513457 -3078.00372634 -1554.78061981 +4 3 6 1 6 5.73091297 -2961.15737375 -2.91366042 +4 3 6 1 7 3055.67994574 -3072.94766855 1559.92237350 +4 3 6 1 8 0.81411100 2915.69570154 -1.17831855 +4 3 6 2 1 -96.57927347 535.49222279 538.19164347 +4 3 6 2 2 2915.50288578 -0.24637570 -1.30686240 +4 3 6 2 3 -94.41545212 535.55649471 -538.21306745 +4 3 6 2 4 -2955.74782039 6.42719211 -2.48518095 +4 3 6 2 5 -95.87228234 -531.74302739 539.49850587 +4 3 6 2 6 -2958.95070446 -7.62693464 0.89980690 +4 3 6 2 7 -88.56670730 -538.77009076 -536.00639816 +4 3 6 2 8 3374.57579436 0.98550279 -0.43919146 +4 3 6 3 1 -885.38856136 -0.10711987 2.42090903 +4 3 6 3 2 -0.89980690 0.91051888 -1.99242955 +4 3 6 3 3 887.57380667 0.19281576 2.61372479 +4 3 6 3 4 -0.18210378 -1.24259047 -3.96343514 +4 3 6 3 5 892.20138499 -0.59987126 -7.41269490 +4 3 6 3 6 -1.61751001 0.10711987 3.87773924 +4 3 6 3 7 -892.13711307 -0.08569589 2.44233300 +4 3 6 3 8 0.55702332 0.74983908 1.96029359 +4 1 7 1 1 9469.50349801 -3060.32894803 3063.82105575 +4 1 7 1 2 0.64271921 -536.16707796 1555.77683458 +4 1 7 1 3 0.87838292 1556.77304936 -534.87092755 +4 1 7 1 4 -74060.30975321 71902.24074582 -71939.98978750 +4 1 7 1 5 1.09262266 534.61383986 -1556.60165757 +4 1 7 1 6 -9463.10844185 3057.22247185 -3060.00758843 +4 1 7 1 7 74050.93676471 -71899.38064533 71936.81903939 +4 1 7 1 8 0.34278358 -1555.12340339 535.12801523 +4 1 7 2 1 3064.20668728 890.15539551 93.68703702 +4 1 7 2 2 -0.38563153 -535.46008683 -3078.36793390 +4 1 7 2 3 1561.08998006 -0.51417537 3079.05350105 +4 1 7 2 4 66920.29918820 -71901.25524303 80698.90292561 +4 1 7 2 5 -537.74174003 2.07812545 3074.42592273 +4 1 7 2 6 -0.11783186 1557.43719255 -3075.00437002 +4 1 7 2 7 -71897.54889558 66928.76165781 -80701.76302610 +4 1 7 2 8 890.23037941 3058.80784590 -90.81622454 +4 1 7 3 1 -3059.57910895 90.83764851 889.48054033 +4 1 7 3 2 -884.51017843 -101.45322749 3065.36358186 +4 1 7 3 3 540.19478501 3075.30430566 0.47132742 +4 1 7 3 4 -66970.30274283 80708.32947404 -71949.58772772 +4 1 7 3 5 -1559.75098171 3079.71764424 -1.64964598 +4 1 7 3 6 -2.21738128 -3075.60424129 1556.98728910 +4 1 7 3 7 71936.66907157 -80703.77687963 66976.95488667 +4 1 7 3 8 -0.47132742 -3073.19404425 -537.62390817 +4 2 7 1 1 -0.44990345 -1561.74341126 3079.73906821 +4 2 7 1 2 535.81358239 0.53559934 -3078.19654211 +4 2 7 1 3 -890.35892326 -3064.14241535 93.70846099 +4 2 7 1 4 71905.44362989 -66921.68103450 80700.27405993 +4 2 7 1 5 -2.24951724 537.65604413 3074.40449876 +4 2 7 1 6 -3056.98680814 -889.00921291 -92.10166296 +4 2 7 1 7 -66934.21405912 71898.48083844 -80702.48072922 +4 2 7 1 8 -1557.05156102 -0.05355993 -3075.19718579 +4 2 7 2 1 -1555.93751439 -0.06427192 -535.36367894 +4 2 7 2 2 536.02782213 -0.58915928 1555.58401882 +4 2 7 2 3 3061.16448301 -9468.73223495 3064.35665509 +4 2 7 2 4 -71906.13990904 74059.80628983 -71941.46804168 +4 2 7 2 5 -534.33532821 -0.81411100 -1556.58023360 +4 2 7 2 6 1554.09505265 -0.74983908 535.89927829 +4 2 7 2 7 71901.76941840 -74052.84349837 71936.95829522 +4 2 7 2 8 -3056.81541635 9464.09394464 -3059.30059730 +4 2 7 3 1 3076.31123242 540.66611244 -1.14618259 +4 2 7 3 2 -101.95669087 -884.86367400 -3065.44927775 +4 2 7 3 3 90.40916904 -3060.60745969 -890.20895544 +4 2 7 3 4 80704.86950229 -66967.82827387 71949.52345579 +4 2 7 3 5 3079.81405212 -1559.81525363 1.90673366 +4 2 7 3 6 -3074.95081009 -1.90673366 538.83436268 +4 2 7 3 7 -80698.02454269 71937.30107879 -66975.86226401 +4 2 7 3 8 -3076.54689613 -2.86010049 -1557.45861652 +4 3 7 1 1 5.48453727 3079.31058874 -1557.96207990 +4 3 7 1 2 1556.96586512 -3078.74285344 -0.55702332 +4 3 7 1 3 2.77440459 3075.30430566 537.95597976 +4 3 7 1 4 -71947.45604233 80700.16694006 -66984.34615759 +4 3 7 1 5 891.07662637 93.36567741 -3062.70700912 +4 3 7 1 6 3057.27603178 -88.43816346 -890.61601094 +4 3 7 1 7 66971.77028503 -80709.42209670 71957.31107024 +4 3 7 1 8 -537.80601195 -3071.57653423 0.99621478 +4 3 7 2 1 3075.56139334 2.24951724 -538.30947533 +4 3 7 2 2 -3078.64644555 1557.10512095 0.46061543 +4 3 7 2 3 3077.35029514 2.72084466 1556.10890618 +4 3 7 2 4 80699.50279688 -71939.83981968 66983.63916646 +4 3 7 2 5 93.09787774 890.53031505 3062.98552077 +4 3 7 2 6 -3071.65151814 -537.67746810 -0.87838292 +4 3 7 2 7 -80707.36539523 66966.68209127 -71955.26508075 +4 3 7 2 8 -87.73117233 3058.17583868 891.34442605 +4 3 7 3 1 -1559.30107826 537.32397254 -2.94579638 +4 3 7 3 2 -3067.63452307 3067.61309909 -9457.99882413 +4 3 7 3 3 -534.90306351 1561.78625921 -1.28543842 +4 3 7 3 4 -71944.41383807 71937.89023807 -74124.67808221 +4 3 7 3 5 3058.44363835 -3057.56525543 9466.09708619 +4 3 7 3 6 1560.44726085 -535.77073444 2.18524532 +4 3 7 3 7 71951.70870111 -71950.78747024 74116.21561260 +4 3 7 3 8 535.79215842 -1560.43654886 2.24951724 +4 1 8 1 1 -0.19281576 -886.43833607 -1.15689458 +4 1 8 1 2 -0.00000000 0.23566371 -0.35349557 +4 1 8 1 3 0.10711987 886.37406415 -1.37113432 +4 1 8 1 4 -0.81411100 -1.41398226 8.20538193 +4 1 8 1 5 0.42847947 -891.19445823 3.34213990 +4 1 8 1 6 -0.20352775 0.19281576 0.34278358 +4 1 8 1 7 0.23566371 888.98778894 -1.09262266 +4 1 8 1 8 0.38563153 3.27786798 -8.23751789 +4 1 8 2 1 1561.14354000 3065.96345312 -3079.41770861 +4 1 8 2 2 0.06427192 -0.09640788 2915.23508611 +4 1 8 2 3 -1561.14354000 -3065.96345312 -3079.39628463 +4 1 8 2 4 -6.39505615 -0.72841511 11784.34243299 +4 1 8 2 5 1560.30800502 -3053.68751619 -3076.99679958 +4 1 8 2 6 -0.68556716 0.06427192 574.69809467 +4 1 8 2 7 -1555.14482736 3059.10778153 -3074.08313915 +4 1 8 2 8 1.84246174 -4.65971428 -2964.22100199 +4 1 8 3 1 -538.98433050 -90.73052865 -536.60626942 +4 1 8 3 2 -0.81411100 3371.73711784 0.61058325 +4 1 8 3 3 -539.09145037 -90.75195262 536.62769339 +4 1 8 3 4 6.39505615 -2961.07167785 0.34278358 +4 1 8 3 5 542.24077450 -87.06702914 534.14251244 +4 1 8 3 6 0.10711987 2914.21744736 1.17831855 +4 1 8 3 7 535.29940702 -92.12308694 -537.76316400 +4 1 8 3 8 -5.14175369 -2964.29598590 1.31757438 +4 2 8 1 1 1558.50839123 -3065.49212570 -3078.08942224 +4 2 8 1 2 1.00692676 0.31064762 573.34838433 +4 2 8 1 3 -1558.55123918 3067.63452307 -3077.93945442 +4 2 8 1 4 -3.79204335 -3.79204335 -2957.10824272 +4 2 8 1 5 1552.70249436 3058.59360616 -3072.54061305 +4 2 8 1 6 -0.40705550 -0.02142397 2914.30314325 +4 2 8 1 7 -1557.73712818 -3057.43671158 -3075.58281731 +4 2 8 1 8 8.29107782 0.14996782 11773.71614203 +4 2 8 2 1 0.42847947 -9471.62447140 -1.92815763 +4 2 8 2 2 0.89980690 -0.31064762 -0.23566371 +4 2 8 2 3 -0.42847947 9473.93826056 -1.97100558 +4 2 8 2 4 -0.57844729 2.14239737 6.25580032 +4 2 8 2 5 -1.17831855 -9463.44051345 5.65592906 +4 2 8 2 6 0.69627915 -0.14996782 0.36420755 +4 2 8 2 7 -0.32135961 9463.56905729 -1.97100558 +4 2 8 2 8 0.72841511 -4.01699507 -6.23437635 +4 2 8 3 1 -3078.11084621 3061.63581043 1558.97971865 +4 2 8 3 2 2913.91751173 -0.94265484 -1.18903054 +4 2 8 3 3 -3078.02515032 3065.98487709 -1558.80832686 +4 2 8 3 4 -2960.77174222 -5.76304893 -2.87081248 +4 2 8 3 5 -3070.37679170 -3054.45877924 1562.49325034 +4 2 8 3 6 574.69809467 0.70699113 -0.79268703 +4 2 8 3 7 -3075.45427347 -3061.29302685 -1557.33007268 +4 2 8 3 8 11774.25174137 -5.83803283 -0.42847947 +4 3 8 1 1 535.47079881 -96.60069744 538.38445924 +4 3 8 1 2 -0.44990345 2915.17081419 0.94265484 +4 3 8 1 3 535.53507073 -94.47972404 -538.25591539 +4 3 8 1 4 7.70191855 -2957.60099411 -0.02142397 +4 3 8 1 5 -531.87157123 -91.58748759 -539.45565792 +4 3 8 1 6 1.18903054 3374.34013065 0.92123087 +4 3 8 1 7 -538.70581884 -88.48101141 536.02782213 +4 3 8 1 8 -8.86952511 -2960.78245421 1.60679803 +4 3 8 2 1 -3080.68172306 -3064.99937430 1556.28029797 +4 3 8 2 2 573.32696035 -0.81411100 1.18903054 +4 3 8 2 3 -3080.63887511 -3067.18461962 -1556.40884181 +4 3 8 2 4 11784.55667272 5.76304893 2.93508440 +4 3 8 2 5 -3078.04657429 3062.59988925 1554.60922802 +4 3 8 2 6 2915.72783750 0.92123087 0.79268703 +4 3 8 2 7 -3072.92624457 3057.97231093 -1559.92237350 +4 3 8 2 8 -2961.24306964 5.69877701 0.25708768 +4 3 8 3 1 -0.10711987 -885.36713738 2.48518095 +4 3 8 3 2 -0.85695895 0.19281576 -2.08883744 +4 3 8 3 3 0.12854384 887.61665462 2.52802890 +4 3 8 3 4 0.54631133 -2.54945287 -4.62757832 +4 3 8 3 5 0.38563153 -890.08041160 -7.36984695 +4 3 8 3 6 -0.84624696 -1.09262266 2.01385353 +4 3 8 3 7 0.23566371 892.22280897 2.52802890 +4 3 8 3 8 0.57844729 -1.04977471 4.59544236 +5 1 1 1 1 -0.02142397 -0.03213596 -9.10518883 +5 1 1 1 2 -0.83553497 -890.29465133 -0.14996782 +5 1 1 1 3 0.03213596 -0.04284795 0.87838292 +5 1 1 1 4 0.88909491 890.14468352 -0.29993563 +5 1 1 1 5 -0.11783186 -0.06427192 13.28286370 +5 1 1 1 6 -0.62129524 -889.56623623 -2.35663711 +5 1 1 1 7 0.06427192 0.04284795 0.43919146 +5 1 1 1 8 0.53559934 889.50196431 -2.49589294 +5 1 1 2 1 1.24259047 -1.84246174 2959.80766341 +5 1 1 2 2 1560.54366873 -3071.70507807 3080.36036345 +5 1 1 2 3 -0.16067980 -0.34278358 -573.00560075 +5 1 1 2 4 -1560.55438072 3071.70507807 3080.42463537 +5 1 1 2 5 -1.24259047 -1.82103777 -11776.28701887 +5 1 1 2 6 1553.15239780 3059.42914114 3071.76934999 +5 1 1 2 7 0.14996782 -0.32135961 -2914.66735081 +5 1 1 2 8 -1553.10954986 -3055.03722653 3071.87646986 +5 1 1 3 1 -13.11147191 2961.20022170 0.61058325 +5 1 1 3 2 -536.04924610 94.73681173 538.23449142 +5 1 1 3 3 -0.22495172 -2914.47453504 0.17139179 +5 1 1 3 4 -536.15636597 94.75823570 -538.17021950 +5 1 1 3 5 17.32128274 2964.45666570 -0.68556716 +5 1 1 3 6 534.67811179 87.36696477 -537.69889208 +5 1 1 3 7 -1.24259047 -3373.61171554 -0.07498391 +5 1 1 3 8 534.72095973 85.31026330 537.84885989 +5 2 1 1 1 -1.30686240 1.78890180 -11786.34557453 +5 2 1 1 2 1560.86502834 3071.46941436 3081.45298611 +5 2 1 1 3 0.17139179 0.34278358 -2915.31007002 +5 2 1 1 4 -1560.79004443 -3071.38371847 3081.45298611 +5 2 1 1 5 1.31757438 1.73534187 2966.06346373 +5 2 1 1 6 1558.07991176 -3056.30124098 3073.65465968 +5 2 1 1 7 -0.19281576 0.36420755 -574.32317513 +5 2 1 1 8 -1558.05848778 3051.86647842 3073.59038776 +5 2 1 2 1 -0.00000000 -0.04284795 -8.81596518 +5 2 1 2 2 0.79268703 -9474.68809964 0.85695895 +5 2 1 2 3 -0.04284795 -0.04284795 -0.17139179 +5 2 1 2 4 -0.80339901 9474.62382772 1.11404663 +5 2 1 2 5 -0.00000000 -0.00000000 13.36855959 +5 2 1 2 6 -0.12854384 -9456.11351444 -2.91366042 +5 2 1 2 7 -0.06427192 0.02142397 -0.20352775 +5 2 1 2 8 0.06427192 9456.19921033 -2.96722036 +5 2 1 3 1 -11784.51382478 -4.48832249 -0.02142397 +5 2 1 3 2 3081.75292174 3064.99937430 1556.30172194 +5 2 1 3 3 -573.29482439 1.69249392 0.02142397 +5 2 1 3 4 3081.80648168 3065.04222225 -1556.32314591 +5 2 1 3 5 2961.16808574 -4.32764269 -0.04284795 +5 2 1 3 6 3074.46877068 -3061.35729877 1557.35149665 +5 2 1 3 7 -2915.73854949 -0.08569589 0.01071199 +5 2 1 3 8 3074.53304260 -3061.34658679 -1557.33007268 +5 3 1 1 1 -12.21166501 2959.22921612 -0.58915928 +5 3 1 1 2 538.27733937 94.05124457 -536.52057352 +5 3 1 1 3 1.39255829 -3372.17630930 -0.10711987 +5 3 1 1 4 538.19164347 94.00839662 536.45630160 +5 3 1 1 5 13.76490311 2962.50708409 0.64271921 +5 3 1 1 6 -539.45565792 87.28126888 536.07067008 +5 3 1 1 7 -0.29993563 -2914.66735081 0.07498391 +5 3 1 1 8 -539.54135382 89.50936214 -536.02782213 +5 3 1 2 1 2958.07232153 10.61557897 -0.03213596 +5 3 1 2 2 3081.15305048 -3064.33523112 1558.27272752 +5 3 1 2 3 -2913.56401616 1.26401445 0.02142397 +5 3 1 2 4 3081.17447445 -3064.24953522 -1558.29415149 +5 3 1 2 5 -11771.71300049 13.11147191 0.02142397 +5 3 1 2 6 3069.81976839 3052.95910108 1560.60794065 +5 3 1 2 7 -574.99803030 -2.23880525 0.03213596 +5 3 1 2 8 3069.84119236 3052.93767711 -1560.51153277 +5 3 1 3 1 0.04284795 0.02142397 8.22680590 +5 3 1 3 2 -0.10711987 -886.33121620 -1.94958161 +5 3 1 3 3 0.02142397 0.06427192 2.63514877 +5 3 1 3 4 0.12854384 886.43833607 -2.05670148 +5 3 1 3 5 0.04284795 0.04284795 -10.32635533 +5 3 1 3 6 0.14996782 -891.30157810 2.91366042 +5 3 1 3 7 0.02142397 -0.03213596 -2.23880525 +5 3 1 3 8 -0.21423974 891.24801816 2.94579638 +5 1 2 1 1 -1.30686240 1559.55816594 -536.94905300 +5 1 2 1 2 -74173.54616623 72114.10242181 -72080.03830361 +5 1 2 1 3 9477.33396039 -3068.19154638 3067.09892373 +5 1 2 1 4 0.21423974 -540.82679224 1560.32942900 +5 1 2 1 5 74162.80204342 -72101.41942937 72062.32067736 +5 1 2 1 6 -1.03906272 -1561.01499615 541.68375119 +5 1 2 1 7 -0.49275140 537.69889208 -1559.06541455 +5 1 2 1 8 -9463.82614497 3060.06114836 -3055.20861832 +5 1 2 2 1 -888.13082999 -3068.93067348 94.91891551 +5 1 2 2 2 72109.71050720 -67118.04246551 80902.60206761 +5 1 2 2 3 0.37491954 -1560.07234131 3080.55317921 +5 1 2 2 4 540.15193707 0.51417537 -3074.64016247 +5 1 2 2 5 -67159.40144675 72100.60531837 -80923.96176940 +5 1 2 2 6 -1552.13475905 1.52110213 -3069.96973620 +5 1 2 2 7 3.68492348 533.86400078 3077.29673521 +5 1 2 2 8 -3054.28738745 -889.59837219 -86.90634934 +5 1 2 3 1 -0.96407882 3079.87832404 538.44873116 +5 1 2 3 2 -72076.78185961 80900.02047878 -67092.25871315 +5 1 2 3 3 -0.25708768 3080.53175524 -1555.10197941 +5 1 2 3 4 1560.81146840 -3074.42592273 0.47132742 +5 1 2 3 5 67095.39732530 -80910.50751391 72055.91490922 +5 1 2 3 6 -530.69325268 -3076.84683176 0.42847947 +5 1 2 3 7 889.67335610 93.55849317 -3056.79399237 +5 1 2 3 8 3062.79270501 -92.16593488 -891.29086611 +5 2 2 1 1 1560.02949336 -0.34278358 3080.55317921 +5 2 2 1 2 67116.25356370 -72107.95374135 80901.40232508 +5 2 2 1 3 3068.87711354 888.06655807 94.95105147 +5 2 2 1 4 -0.61058325 -540.11980111 -3074.89725015 +5 2 2 1 5 -72098.23796928 67157.04480964 -80923.70468171 +5 2 2 1 6 889.99471570 3055.25146627 -86.12437430 +5 2 2 1 7 -533.88542476 -3.66349950 3077.27531124 +5 2 2 1 8 -2.57087684 1551.70627958 -3069.28416904 +5 2 2 2 1 3068.21297036 -9477.30182443 3067.09892373 +5 2 2 2 2 -72113.95245399 74173.65328610 -72080.02759163 +5 2 2 2 3 -1559.56887793 1.30686240 -536.92762902 +5 2 2 2 4 540.81608025 -0.23566371 1560.30800502 +5 2 2 2 5 72101.40871738 -74162.81275541 72062.36352530 +5 2 2 2 6 -3060.07186035 9463.84756895 -3055.18719435 +5 2 2 2 7 -537.67746810 0.50346338 -1559.04399057 +5 2 2 2 8 1560.97214821 1.01763875 541.68375119 +5 2 2 3 1 3080.48890729 -0.29993563 1555.09126742 +5 2 2 3 2 80900.03119077 -72076.84613153 67092.29084911 +5 2 2 3 3 3079.86761205 -0.96407882 -538.42730718 +5 2 2 3 4 -3074.40449876 1560.80075642 -0.40705550 +5 2 2 3 5 -80910.51822590 67095.42946126 -72055.91490922 +5 2 2 3 6 -92.09095098 3062.81412898 891.23730618 +5 2 2 3 7 93.55849317 889.69478007 3056.82612833 +5 2 2 3 8 -3076.91110368 -530.67182870 -0.46061543 +5 3 2 1 1 537.91313182 3080.69243504 -0.37491954 +5 3 2 1 2 -67092.62292071 80902.98769914 -72062.15999755 +5 3 2 1 3 -3066.97037988 94.71538776 888.08798204 +5 3 2 1 4 -891.09805035 -81.21828432 3057.39386364 +5 3 2 1 5 72060.04973614 -80922.01218779 67086.06718475 +5 3 2 1 6 3.08505221 -3077.55382289 -534.82807960 +5 3 2 1 7 -1556.55880962 3074.97223406 3.57780361 +5 3 2 1 8 6.06298456 -3072.57274901 1562.17189073 +5 3 2 2 1 94.73681173 -3066.95966790 -888.13082999 +5 3 2 2 2 80903.00912311 -67092.44081693 72062.20284550 +5 3 2 2 3 3080.67101107 537.89170784 0.40705550 +5 3 2 2 4 -81.22899631 -891.04449041 -3057.41528761 +5 3 2 2 5 -80922.00147580 72060.00688820 -67086.04576078 +5 3 2 2 6 -3072.59417298 6.06298456 -1562.15046676 +5 3 2 2 7 3075.00437002 -1556.56952161 -3.54566765 +5 3 2 2 8 -3077.53239892 3.07434023 534.81736761 +5 3 2 3 1 -536.86335710 1557.44790453 -2.81725254 +5 3 2 3 2 -72066.28411249 72066.61618409 -74083.90826025 +5 3 2 3 3 -1557.44790453 536.94905300 -2.82796453 +5 3 2 3 4 -3056.81541635 3057.09392801 -9483.02202541 +5 3 2 3 5 72059.08565733 -72061.33517457 74120.22189568 +5 3 2 3 6 540.68753641 -1552.85246217 -6.34149622 +5 3 2 3 7 3064.03529549 -3064.05671946 9465.72216665 +5 3 2 3 8 1553.68799715 -539.86271342 -6.89851953 +5 1 3 1 1 -0.06427192 0.02142397 -0.26779967 +5 1 3 1 2 9474.66667567 -0.81411100 0.81411100 +5 1 3 1 3 -0.04284795 -0.02142397 -8.76240525 +5 1 3 1 4 -9474.62382772 0.70699113 0.47132742 +5 1 3 1 5 0.05355993 -0.02142397 13.47567946 +5 1 3 1 6 -9456.19921033 -0.02142397 -2.82796453 +5 1 3 1 7 0.04284795 0.05355993 -0.14996782 +5 1 3 1 8 9456.13493841 -0.00000000 -3.07434023 +5 1 3 2 1 -0.00000000 -0.01071199 -2915.58858168 +5 1 3 2 2 -3069.28416904 -1560.73648450 3081.34586624 +5 1 3 2 3 -0.02142397 -0.00000000 -11786.27059062 +5 1 3 2 4 3069.24132110 1560.77933244 3081.23874637 +5 1 3 2 5 -0.04284795 -0.00000000 2965.97776783 +5 1 3 2 6 -3056.27981700 1558.10133573 3073.61181173 +5 1 3 2 7 0.02142397 0.06427192 -574.32317513 +5 1 3 2 8 3056.32266495 -1558.04777580 3073.62252372 +5 1 3 3 1 0.77126305 -573.03773671 0.02142397 +5 1 3 3 2 3069.30559302 3081.73149777 -1556.32314591 +5 1 3 3 3 -9.03020492 -11786.35628651 0.55702332 +5 1 3 3 4 3069.30559302 3081.79576969 1556.28029797 +5 1 3 3 5 -8.85881313 2963.14980330 -0.62129524 +5 1 3 3 6 -3059.15062948 3074.46877068 1557.26580076 +5 1 3 3 7 -0.85695895 -2916.01706115 -0.02142397 +5 1 3 3 8 -3061.44299467 3074.31880286 -1557.37292062 +5 2 3 1 1 -0.00000000 -0.01071199 -573.01631273 +5 2 3 1 2 3069.39128891 -1560.56509271 3080.57460319 +5 2 3 1 3 0.05355993 -0.06427192 2959.63627162 +5 2 3 1 4 -3069.53054474 1560.45797284 3080.51033127 +5 2 3 1 5 0.04284795 -0.04284795 -11776.37271477 +5 2 3 1 6 3059.40771717 1553.10954986 3071.94074178 +5 2 3 1 7 0.04284795 -0.00000000 -2914.74233471 +5 2 3 1 8 -3059.38629319 -1553.09883787 3071.76934999 +5 2 3 2 1 0.08569589 -0.05355993 1.00692676 +5 2 3 2 2 890.20895544 0.85695895 -0.19281576 +5 2 3 2 3 -0.00000000 -0.14996782 -7.88402232 +5 2 3 2 4 -890.19824345 -0.92123087 0.17139179 +5 2 3 2 5 -0.06427192 -0.04284795 12.08312117 +5 2 3 2 6 -887.48811078 -0.40705550 -2.52802890 +5 2 3 2 7 0.08569589 0.02142397 0.21423974 +5 2 3 2 8 887.38099091 0.57844729 -2.46375698 +5 2 3 3 1 -2915.01013439 -0.34278358 -0.03213596 +5 2 3 3 2 94.77965968 -536.09209405 -538.29876334 +5 2 3 3 3 2958.49008902 -11.20473825 0.12854384 +5 2 3 3 4 94.80108365 -536.11351802 538.29876334 +5 2 3 3 5 2961.76795700 15.44668504 -0.04284795 +5 2 3 3 6 89.61648201 534.74238371 -537.78458797 +5 2 3 3 7 -3374.10446694 -0.95336683 -0.00000000 +5 2 3 3 8 89.70217791 534.71024775 537.74174003 +5 3 3 1 1 1.92815763 -2913.87466378 0.02142397 +5 3 3 1 2 -3068.74856970 3081.11020253 -1558.22987957 +5 3 3 1 3 14.19338258 2960.87886209 -0.06427192 +5 3 3 1 4 -3068.67358579 3081.21732240 1558.16560765 +5 3 3 1 5 16.67856353 -11774.20889342 -0.00000000 +5 3 3 1 6 3053.08764492 3069.84119236 1560.65078860 +5 3 3 1 7 -1.47825419 -574.68738268 -0.05355993 +5 3 3 1 8 3052.98052505 3069.83048037 -1560.55438072 +5 3 3 2 1 -3372.13346135 1.29615041 -0.00000000 +5 3 3 2 2 94.05124457 538.27733937 536.60626942 +5 3 3 2 3 2959.32562400 -12.16881707 0.72841511 +5 3 3 2 4 94.01910861 538.25591539 -536.54199750 +5 3 3 2 5 2962.52850807 13.71134317 -0.57844729 +5 3 3 2 6 89.53078612 -539.47708190 536.02782213 +5 3 3 2 7 -2914.64592683 -0.31064762 -0.10711987 +5 3 3 2 8 87.38838875 -539.54135382 -536.04924610 +5 3 3 3 1 0.14996782 -0.11783186 2.69942069 +5 3 3 3 2 886.39548812 0.10711987 -2.03527750 +5 3 3 3 3 0.97479080 0.66414318 8.84810114 +5 3 3 3 4 -888.46290158 -0.02142397 -1.84246174 +5 3 3 3 5 0.92123087 -0.59987126 -10.92622659 +5 3 3 3 6 -891.32300207 0.08569589 2.95650837 +5 3 3 3 7 0.14996782 0.07498391 -2.28165320 +5 3 3 3 8 891.28015412 -0.08569589 2.81725254 +5 1 4 1 1 1.28543842 -1559.56887793 -536.91691704 +5 1 4 1 2 -0.34278358 540.64468846 1560.22230913 +5 1 4 1 3 -9477.33396039 3068.19154638 3067.09892373 +5 1 4 1 4 74173.97464571 -72114.61659717 -72080.20969540 +5 1 4 1 5 -74162.52353176 72103.32616303 72061.87077391 +5 1 4 1 6 9463.94397683 -3060.22182817 -3055.10149845 +5 1 4 1 7 0.53559934 -537.76316400 -1559.02256660 +5 1 4 1 8 0.36420755 1560.10447727 542.32647040 +5 1 4 2 1 888.04513410 3068.93067348 94.89749153 +5 1 4 2 2 -540.16264905 -0.53559934 -3074.64016247 +5 1 4 2 3 -0.35349557 1560.05091734 3080.46748332 +5 1 4 2 4 -72109.66765925 67117.96748160 80902.68776351 +5 1 4 2 5 67159.33717483 -72100.41250261 -80923.76895363 +5 1 4 2 6 3054.26596348 889.56623623 -86.89563735 +5 1 4 2 7 -3.64207553 -533.89613675 3077.28602322 +5 1 4 2 8 1552.14547104 -1.56395008 -3070.03400812 +5 1 4 3 1 -0.89980690 3079.84618808 -538.47015513 +5 1 4 3 2 1560.86502834 -3074.46877068 -0.46061543 +5 1 4 3 3 -0.28922365 3080.53175524 1555.08055544 +5 1 4 3 4 -72076.52477192 80899.60271129 67091.98020149 +5 1 4 3 5 67095.01169377 -80910.10045841 -72055.57212564 +5 1 4 3 6 3062.79270501 -92.12308694 891.23730618 +5 1 4 3 7 889.73762802 93.55849317 3056.79399237 +5 1 4 3 8 -530.71467665 -3076.86825574 -0.49275140 +5 2 4 1 1 -1560.00806939 0.36420755 3080.55317921 +5 2 4 1 2 0.64271921 540.07695316 -3074.81155426 +5 2 4 1 3 -3068.90924950 -888.04513410 94.86535557 +5 2 4 1 4 -67116.39281953 72107.97516533 80901.33805316 +5 2 4 1 5 72098.30224120 -67157.10908156 -80923.87607350 +5 2 4 1 6 2.58158883 -1551.67414362 -3069.24132110 +5 2 4 1 7 533.94969668 3.65278752 3077.29673521 +5 2 4 1 8 -890.01613968 -3055.26217825 -86.18864622 +5 2 4 2 1 -3068.25581831 9477.33396039 3067.09892373 +5 2 4 2 2 -540.65540045 0.28922365 1560.21159714 +5 2 4 2 3 1559.59030190 -1.30686240 -536.97047697 +5 2 4 2 4 72115.03436466 -74174.42454916 -72080.83099064 +5 2 4 2 5 -72103.56182674 74162.87702733 72062.02074173 +5 2 4 2 6 -1560.14732522 -0.40705550 542.28362245 +5 2 4 2 7 537.76316400 -0.54631133 -1559.03327859 +5 2 4 2 8 3060.22182817 -9463.93326484 -3055.06936249 +5 2 4 3 1 3080.48890729 -0.29993563 -1555.11269140 +5 2 4 3 2 -3074.68301042 1560.55438072 0.46061543 +5 2 4 3 3 3079.88903603 -0.92123087 538.47015513 +5 2 4 3 4 80899.31348765 -72076.63189179 -67091.89450560 +5 2 4 3 5 -80907.86165316 67097.03625929 72055.50785372 +5 2 4 3 6 -3077.70379071 -531.46451573 -0.00000000 +5 2 4 3 7 93.62276510 889.69478007 -3056.79399237 +5 2 4 3 8 -92.91577396 3062.00001798 -890.76597876 +5 3 4 1 1 537.91313182 3080.66029908 0.43919146 +5 3 4 1 2 -891.15161028 -81.20757233 -3057.43671158 +5 3 4 1 3 -3066.95966790 94.71538776 -888.10940602 +5 3 4 1 4 -67092.34440905 80902.83773132 72062.17070954 +5 3 4 1 5 72059.95332826 -80921.90506792 -67086.06718475 +5 3 4 1 6 6.06298456 -3072.60488497 -1562.19331471 +5 3 4 1 7 -1556.51596168 3074.95081009 -3.55637964 +5 3 4 1 8 3.10647619 -3077.56453488 534.79594364 +5 3 4 2 1 94.73681173 -3066.94895591 888.10940602 +5 3 4 2 2 -81.19686035 -891.10876234 3057.44742357 +5 3 4 2 3 3080.68172306 537.95597976 -0.38563153 +5 3 4 2 4 80902.84844331 -67092.36583302 -72062.02074173 +5 3 4 2 5 -80921.91577991 72059.92119230 67085.89579296 +5 3 4 2 6 -3077.54311091 3.10647619 -534.74238371 +5 3 4 2 7 3074.96152208 -1556.56952161 3.53495566 +5 3 4 2 8 -3072.60488497 6.08440853 1562.17189073 +5 3 4 3 1 536.88478108 -1557.44790453 -2.76369261 +5 3 4 3 2 3057.02965608 -3056.72972045 -9482.85063362 +5 3 4 3 3 1557.44790453 -536.88478108 -2.82796453 +5 3 4 3 4 72064.98796208 -72064.74158639 -74082.62282182 +5 3 4 3 5 -72059.06423335 72056.85756406 74120.05050389 +5 3 4 3 6 -1553.84867695 540.24834495 -7.11275927 +5 3 4 3 7 -3064.05671946 3064.03529549 9465.70074267 +5 3 4 3 8 -539.39138600 1554.68421192 -7.66978259 +5 1 5 1 1 0.77126305 -1.06048670 16.05726829 +5 1 5 1 2 74158.14232914 -67155.81293115 67095.98648458 +5 1 5 1 3 -0.26779967 0.04284795 -8.09826206 +5 1 5 1 4 -74157.97093735 67155.84506711 67095.77224484 +5 1 5 1 5 -2.11026141 -1.92815763 -387.68822819 +5 1 5 1 6 -73990.13552734 -66819.74576761 -66907.41266802 +5 1 5 1 7 1.37113432 1.03906272 8.13039802 +5 1 5 1 8 73990.15695131 66821.92030094 -66912.20092614 +5 1 5 2 1 -0.00000000 0.08569589 2959.14352022 +5 1 5 2 2 -72101.71936500 72101.71936500 -80905.50501605 +5 1 5 2 3 0.01071199 -0.06427192 2959.10067227 +5 1 5 2 4 72101.88004481 -72101.89075679 -80905.79423969 +5 1 5 2 5 -0.06427192 0.29993563 328882.97674338 +5 1 5 2 6 -71808.43587695 -71808.42516497 -80608.60087644 +5 1 5 2 7 0.06427192 -0.08569589 -11773.06271083 +5 1 5 2 8 71808.40374099 71808.26448516 -80608.27951684 +5 1 5 3 1 14.41833430 -11771.85225631 -1.25330246 +5 1 5 3 2 72062.59918902 -80922.22642753 72055.34717392 +5 1 5 3 3 12.57587257 2960.87886209 -0.19281576 +5 1 5 3 4 72062.17070954 -80921.94791587 -72054.97225438 +5 1 5 3 5 -387.76321210 328883.51234273 1.00692676 +5 1 5 3 6 -71879.94910118 -80593.49697498 -71890.75749592 +5 1 5 3 7 -4.11340295 2953.94820660 0.07498391 +5 1 5 3 8 -71879.85269330 -80588.96580454 71890.48969625 +5 2 5 1 1 -0.00000000 0.02142397 2959.18636817 +5 2 5 1 2 -72101.74078898 72101.63366911 -80905.55857598 +5 2 5 1 3 -0.01071199 -0.04284795 2959.16494419 +5 2 5 1 4 72101.86933282 -72101.91218077 -80905.62284790 +5 2 5 1 5 -0.09640788 0.25708768 328883.16955915 +5 2 5 1 6 -71808.35018106 -71808.53228483 -80608.51518055 +5 2 5 1 7 0.02142397 -0.08569589 -11773.00915089 +5 2 5 1 8 71808.42516497 71808.39302900 -80608.39734869 +5 2 5 2 1 0.12854384 -0.09640788 -7.85188636 +5 2 5 2 2 67156.12357877 -74158.05663324 67095.99719656 +5 2 5 2 3 -0.22495172 0.10711987 18.08183381 +5 2 5 2 4 -67155.74865923 74157.99236132 67095.85794074 +5 2 5 2 5 -1.47825419 -1.02835074 -389.61638582 +5 2 5 2 6 -66817.62479421 -73990.13552734 -66907.71260365 +5 2 5 2 7 1.37113432 1.30686240 7.93758226 +5 2 5 2 8 66817.64621819 73990.07125541 -66912.26519806 +5 2 5 3 1 2965.52786438 18.09254579 0.05355993 +5 2 5 3 2 -80923.68325774 72056.15057293 -72055.21863007 +5 2 5 3 3 -11768.79934006 15.44668504 -0.00000000 +5 2 5 3 4 -80923.01911455 72055.52927769 72054.52235093 +5 2 5 3 5 328878.97046030 -384.32466432 0.29993563 +5 2 5 3 6 -80591.86875298 -71878.63152680 -71889.60060134 +5 2 5 3 7 2955.18008508 -3.02078029 -0.01071199 +5 2 5 3 8 -80592.25438450 -71879.03858230 71889.96480889 +5 3 5 1 1 14.50403020 -11771.85225631 -1.28543842 +5 3 5 1 2 72062.38494928 -80922.01218779 72055.16507014 +5 3 5 1 3 12.51160064 2960.90028606 -0.19281576 +5 3 5 1 4 72062.24569345 -80921.92649189 -72055.10079822 +5 3 5 1 5 -387.61324428 328883.38379888 1.52110213 +5 3 5 1 6 -71880.03479708 -80593.66836677 -71890.67180002 +5 3 5 1 7 -4.09197898 2954.00176653 0.22495172 +5 3 5 1 8 -71879.80984535 -80588.98722851 71890.51112022 +5 3 5 2 1 2965.48501644 18.11396977 0.02142397 +5 3 5 2 2 -80923.81180158 72056.08630101 -72055.24005405 +5 3 5 2 3 -11768.74578013 15.55380491 0.06427192 +5 3 5 2 4 -80922.76202687 72055.05795027 72054.09387145 +5 3 5 2 5 328878.61696473 -384.17469650 0.59987126 +5 3 5 2 6 -80591.80448106 -71878.58867885 -71889.34351365 +5 3 5 2 7 2955.26578098 -3.03149228 -0.00000000 +5 3 5 2 8 -80592.34008040 -71879.08143025 71889.85768902 +5 3 5 3 1 0.85695895 -1.04977471 -9.97285976 +5 3 5 3 2 67081.95378180 -67081.96449379 74113.44120800 +5 3 5 3 3 -0.27851166 -0.04284795 -9.23373267 +5 3 5 3 4 -67081.82523796 67081.99662975 74113.32337615 +5 3 5 3 5 -2.04598949 -1.90673366 28.47246106 +5 3 5 3 6 -66906.80208477 -66906.72710086 -74110.49541162 +5 3 5 3 7 1.39255829 1.07119869 -10.62629096 +5 3 5 3 8 66906.83422073 66909.01946604 -74114.80163033 +5 1 6 1 1 -0.96407882 1553.77369304 534.26034430 +5 1 6 1 2 -0.62129524 -1552.55252654 -531.60377156 +5 1 6 1 3 -9459.56277421 -3053.08764492 -3057.90803901 +5 1 6 1 4 9463.10844185 3055.52997792 3062.21425772 +5 1 6 1 5 -73991.82802126 -71805.44723262 -71878.37443912 +5 1 6 1 6 73991.34598185 71801.89085298 71869.24782632 +5 1 6 1 7 -0.92123087 533.96040867 1555.38049107 +5 1 6 1 8 -0.70699113 -533.93898469 -1553.50589337 +5 1 6 2 1 -890.89452260 3056.08700124 90.58056083 +5 1 6 2 2 -1559.83667760 0.82482299 -3077.51097495 +5 1 6 2 3 0.64271921 1557.43719255 3074.04029121 +5 1 6 2 4 -3059.60053293 889.52338828 -93.55849317 +5 1 6 2 5 -66822.94865168 -71804.35460996 -80591.07606595 +5 1 6 2 6 71802.79065988 66839.32727958 80599.21717596 +5 1 6 2 7 -2.67799671 -537.82743592 3077.45741501 +5 1 6 2 8 532.68568223 -1.10333465 -3079.13919695 +5 1 6 3 1 -3.89916321 3073.27974014 -538.95219454 +5 1 6 3 2 542.86206974 -3070.77313522 -0.07498391 +5 1 6 3 3 -4.30621871 3075.06864194 1558.01563984 +5 1 6 3 4 -3054.25525149 -87.21699696 890.10183557 +5 1 6 3 5 -66913.49707655 -80606.32993523 -71895.12798655 +5 1 6 3 6 71873.00773370 80595.38228466 66916.28219313 +5 1 6 3 7 -885.60280109 101.50678742 3068.98423341 +5 1 6 3 8 -1554.43783623 -3080.94952273 0.49275140 +5 2 6 1 1 1558.31557547 -0.20352775 3074.65087446 +5 2 6 1 2 889.73762802 -3059.54697299 -93.65490106 +5 2 6 1 3 3057.00823211 -891.79432949 90.02353751 +5 2 6 1 4 1.69249392 -1560.52224476 -3078.06799826 +5 2 6 1 5 -71806.19707170 -66823.21645135 -80591.16176184 +5 2 6 1 6 66838.00970519 71805.74716825 80599.73135133 +5 2 6 1 7 -537.52750029 -2.93508440 3077.40385508 +5 2 6 1 8 -0.85695895 532.57856236 -3079.06421304 +5 2 6 2 1 -3053.13049287 -9459.53063825 -3057.89732702 +5 2 6 2 2 3055.44428203 9463.12986583 3062.19283375 +5 2 6 2 3 1553.78440503 -0.87838292 534.27105629 +5 2 6 2 4 -1552.57395051 -0.66414318 -531.59305957 +5 2 6 2 5 -71806.10066382 -73992.47074047 -71878.76007064 +5 2 6 2 6 71802.52286021 73992.02083702 71869.80484963 +5 2 6 2 7 534.01396860 -0.86767094 1555.41262703 +5 2 6 2 8 -533.92827271 -0.72841511 -1553.47375741 +5 2 6 3 1 3074.68301042 -4.55259441 1558.21916759 +5 2 6 3 2 -87.23842093 -3054.21240354 890.11254756 +5 2 6 3 3 3071.41585443 -2.61372479 -537.65604413 +5 2 6 3 4 -3070.77313522 542.81922179 -0.06427192 +5 2 6 3 5 -80608.76155624 -66915.48950610 -71896.92760035 +5 2 6 3 6 80600.23481471 71873.74686080 66916.92491234 +5 2 6 3 7 101.05688397 -885.42069732 3068.80212964 +5 2 6 3 8 -3080.91738677 -1554.39498828 0.50346338 +5 3 6 1 1 -539.32711408 3069.44484885 0.35349557 +5 3 6 1 2 3.77061937 -3073.14048431 539.64847369 +5 3 6 1 3 3053.62324426 86.55285377 -891.32300207 +5 3 6 1 4 5.84874482 -3077.12534342 -1554.86631570 +5 3 6 1 5 -71877.87097573 -80588.71942884 -66910.19778460 +5 3 6 1 6 66912.12594223 80611.81447250 71886.60124502 +5 3 6 1 7 1558.22987957 3080.91738677 2.52802890 +5 3 6 1 8 883.63179551 -109.74430531 -3072.56203702 +5 3 6 2 1 86.55285377 3053.75178811 -891.32300207 +5 3 6 2 2 -3076.48262421 4.88466601 -1554.29858040 +5 3 6 2 3 3069.41271289 -539.32711408 0.34278358 +5 3 6 2 4 -3073.23689219 3.59922758 539.73416958 +5 3 6 2 5 -80588.69800487 -71875.71786638 -66910.32632844 +5 3 6 2 6 80611.33243309 66911.16186341 71885.95852581 +5 3 6 2 7 3080.85311485 1558.15489566 2.54945287 +5 3 6 2 8 -109.64789743 883.39613180 -3072.64773292 +5 3 6 3 1 536.17778994 1560.17946118 3.10647619 +5 3 6 3 2 -533.47836926 -1563.91794459 -6.05227257 +5 3 6 3 3 1560.20088515 536.24206187 3.04220427 +5 3 6 3 4 -1563.11454558 -534.27105629 -6.64143185 +5 3 6 3 5 -71893.03914912 -71890.90746373 -74117.05114757 +5 3 6 3 6 71886.49412515 71886.21561349 74133.84754296 +5 3 6 3 7 -3064.48519893 -3064.43163900 -9458.98432692 +5 3 6 3 8 3071.12663078 3070.84811912 9448.22949211 +5 1 7 1 1 -0.12854384 0.06427192 -0.77126305 +5 1 7 1 2 -0.77126305 2.42090903 890.08041160 +5 1 7 1 3 0.10711987 -0.12854384 -0.98550279 +5 1 7 1 4 0.76055107 -2.37806108 889.82332391 +5 1 7 1 5 0.62129524 0.59987126 -4.90608998 +5 1 7 1 6 -0.83553497 -2.22809327 -886.52403196 +5 1 7 1 7 -0.64271921 -0.68556716 -2.32450115 +5 1 7 1 8 0.81411100 2.39948506 -884.39234658 +5 1 7 2 1 -0.08569589 -0.05355993 -3374.52223442 +5 1 7 2 2 537.95597976 534.74238371 91.58748759 +5 1 7 2 3 0.07498391 0.06427192 -2915.86709333 +5 1 7 2 4 -537.92384380 -534.74238371 93.70846099 +5 1 7 2 5 0.65343120 -0.55702332 2950.74532253 +5 1 7 2 6 533.99254463 -537.27041260 101.93526689 +5 1 7 2 7 -0.59987126 0.64271921 2950.69176259 +5 1 7 2 8 -534.05681655 537.23827664 102.05309875 +5 1 7 3 1 0.38563153 -2914.59236690 0.18210378 +5 1 7 3 2 -1558.95829468 3078.60359761 -3060.97166725 +5 1 7 3 3 0.32135961 -574.37673506 0.17139179 +5 1 7 3 4 -1558.94758269 3078.60359761 3060.92881930 +5 1 7 3 5 11.74033759 -11775.06585237 0.77126305 +5 1 7 3 6 1555.18767531 3076.61116805 3068.55575394 +5 1 7 3 7 -4.79897011 2953.48759116 0.85695895 +5 1 7 3 8 1555.12340339 3076.76113587 -3070.80527118 +5 2 7 1 1 -0.06427192 -0.09640788 -2915.96350122 +5 2 7 1 2 -534.69953576 -537.97740374 91.35182388 +5 2 7 1 3 0.05355993 0.08569589 -3374.53294641 +5 2 7 1 4 534.78523165 537.99882771 93.40852536 +5 2 7 1 5 0.56773530 -0.62129524 2950.78817047 +5 2 7 1 6 -537.29183658 534.03539257 101.89241895 +5 2 7 1 7 -0.62129524 0.67485517 2950.67033862 +5 2 7 1 8 537.33468452 -533.96040867 102.01025080 +5 2 7 2 1 -0.08569589 0.16067980 -0.97479080 +5 2 7 2 2 -2.39948506 0.77126305 890.27322736 +5 2 7 2 3 0.11783186 -0.04284795 -0.77126305 +5 2 7 2 4 2.37806108 -0.66414318 890.16610749 +5 2 7 2 5 0.66414318 0.64271921 -4.92751395 +5 2 7 2 6 -2.39948506 -0.77126305 -886.43833607 +5 2 7 2 7 -0.53559934 -0.68556716 -2.41019704 +5 2 7 2 8 2.39948506 0.74983908 -884.39234658 +5 2 7 3 1 -574.50527891 0.34278358 0.17139179 +5 2 7 3 2 3078.51790171 -1558.95829468 3060.99309122 +5 2 7 3 3 -2914.61379087 0.42847947 0.08569589 +5 2 7 3 4 3078.57146165 -1558.87259878 -3060.97166725 +5 2 7 3 5 -11775.08727634 11.74033759 0.85695895 +5 2 7 3 6 3076.71828792 1555.14482736 3068.59860189 +5 2 7 3 7 2953.40189527 -4.77754614 0.87838292 +5 2 7 3 8 3076.80398381 1555.13411537 -3070.77313522 +5 3 7 1 1 -0.66414318 -574.54812685 0.23566371 +5 3 7 1 2 -1556.28029797 3074.74728234 3062.49276938 +5 3 7 1 3 -1.67106995 -2914.36741517 0.21423974 +5 3 7 1 4 -1556.21602604 3074.83297823 -3062.68558514 +5 3 7 1 5 -4.23123481 2952.11645684 0.83553497 +5 3 7 1 6 1557.90851997 3080.51033127 -3066.84183604 +5 3 7 1 7 3.27786798 -11773.74827799 0.84624696 +5 3 7 1 8 1557.88709599 3080.63887511 3064.72086264 +5 3 7 2 1 -2914.41026312 -1.83174975 0.23566371 +5 3 7 2 2 3074.68301042 -1556.25887399 -3062.62131322 +5 3 7 2 3 -574.67667069 -0.70699113 0.12854384 +5 3 7 2 4 3074.69372240 -1556.21602604 3062.34280156 +5 3 7 2 5 2952.10574486 -4.13482693 0.89980690 +5 3 7 2 6 3080.57460319 1557.92994394 -3066.92753194 +5 3 7 2 7 -11773.71614203 3.32071592 0.94265484 +5 3 7 2 8 3080.55317921 1557.96207990 3064.77442258 +5 3 7 3 1 -0.21423974 0.16067980 -3.01006831 +5 3 7 3 2 3.10647619 -3.14932413 9467.72530819 +5 3 7 3 3 0.16067980 -0.23566371 -2.84938850 +5 3 7 3 4 -3.13861215 3.12790016 9467.55391640 +5 3 7 3 5 1.24259047 1.28543842 -13.28286370 +5 3 7 3 6 3.08505221 3.08505221 -9459.36995844 +5 3 7 3 7 -1.19974253 -1.19974253 -1.88530969 +5 3 7 3 8 -3.10647619 -3.01006831 -9455.16014761 +5 1 8 1 1 0.29993563 -1552.85246217 534.90306351 +5 1 8 1 2 -9463.14057781 -3055.46570600 3062.19283375 +5 1 8 1 3 9459.61633414 3053.30188466 -3057.77949516 +5 1 8 1 4 0.66414318 1552.59537449 -531.55021162 +5 1 8 1 5 73992.54572438 71806.34703952 -71878.82434256 +5 1 8 1 6 0.74983908 533.94969668 -1553.49518138 +5 1 8 1 7 0.77126305 -533.75688092 1555.30550716 +5 1 8 1 8 -73991.44238973 -71804.18321817 71869.36565817 +5 1 8 2 1 891.73005757 -3056.94396019 90.00211354 +5 1 8 2 2 3059.64338088 -889.53410027 -93.55849317 +5 1 8 2 3 0.16067980 -1558.27272752 3074.66158644 +5 1 8 2 4 1559.89023753 -0.83553497 -3077.46812700 +5 1 8 2 5 66823.24858731 71804.11894625 -80591.20460979 +5 1 8 2 6 -532.71781819 1.04977471 -3079.09634900 +5 1 8 2 7 2.97793235 537.58106022 3077.42527905 +5 1 8 2 8 -71804.91163328 -66837.13132227 80599.13148006 +5 1 8 3 1 -2.54945287 3071.42656641 537.67746810 +5 1 8 3 2 -3054.22311553 -87.21699696 -890.12325954 +5 1 8 3 3 -4.50974647 3074.70443439 -1558.20845560 +5 1 8 3 4 542.84064577 -3070.80527118 0.08569589 +5 1 8 3 5 -66915.05031464 -80608.23666889 71896.43484895 +5 1 8 3 6 -1554.41641225 -3080.96023471 -0.47132742 +5 1 8 3 7 -885.38856136 101.15329185 -3068.78070566 +5 1 8 3 8 71873.33980530 80600.00986299 -66916.57141678 +5 2 8 1 1 -1557.48004049 -0.55702332 3074.13669909 +5 2 8 1 2 -1.60679803 1560.71506052 -3078.04657429 +5 2 8 1 3 -3056.10842521 890.85167465 90.53771288 +5 2 8 1 4 -890.38034723 3060.41464393 -93.06574178 +5 2 8 1 5 71806.51843131 66820.70984643 -80591.14033787 +5 2 8 1 6 0.78197504 -532.42859455 -3079.13919695 +5 2 8 1 7 537.78458797 2.71013267 3077.41456707 +5 2 8 1 8 -66839.56294329 -71802.41574034 80599.13148006 +5 2 8 2 1 3052.48777366 9460.41973315 -3057.34030370 +5 2 8 2 2 1552.57395051 0.66414318 -531.61448355 +5 2 8 2 3 -1553.69870913 1.13547061 534.35675218 +5 2 8 2 4 -3055.44428203 -9463.16200179 3062.19283375 +5 2 8 2 5 71806.12208779 73992.68498021 -71878.86719051 +5 2 8 2 6 533.92827271 0.72841511 -1553.49518138 +5 2 8 2 7 -534.01396860 1.06048670 1555.32693114 +5 2 8 2 8 -71801.91227696 -73993.55265114 71869.18355440 +5 2 8 3 1 3073.37614802 -2.74226863 -1556.89088122 +5 2 8 3 2 -3070.76242323 542.81922179 0.07498391 +5 2 8 3 3 3071.64080615 -2.22809327 537.84885989 +5 2 8 3 4 -87.23842093 -3054.24453950 -890.08041160 +5 2 8 3 5 -80607.18689418 -66913.32568476 71895.51361808 +5 2 8 3 6 -3080.93881074 -1554.39498828 -0.47132742 +5 2 8 3 7 100.94976410 -885.04577778 -3068.96280944 +5 2 8 3 8 80600.09555888 71869.11928247 -66916.71067260 +5 3 8 1 1 -539.28426613 3069.38057693 -0.37491954 +5 3 8 1 2 5.84874482 -3077.11463143 1554.90916365 +5 3 8 1 3 3053.63395625 86.57427775 891.30157810 +5 3 8 1 4 3.77061937 -3073.14048431 -539.66989766 +5 3 8 1 5 -71877.63531202 -80588.44091718 66910.15493665 +5 3 8 1 6 883.57823558 -109.71216935 3072.58346099 +5 3 8 1 7 1558.20845560 3080.87453882 -2.54945287 +5 3 8 1 8 66911.91170249 80611.54667283 -71886.24774945 +5 3 8 2 1 86.57427775 3053.65538023 891.34442605 +5 3 8 2 2 -3073.16190828 3.58851560 -539.77701753 +5 3 8 2 3 3069.42342487 -539.28426613 -0.29993563 +5 3 8 2 4 -3076.52547216 4.92751395 1554.28786841 +5 3 8 2 5 -80588.40878122 -71875.54647459 66910.24063255 +5 3 8 2 6 -109.64789743 883.37470783 3072.66915689 +5 3 8 2 7 3080.89596279 1558.16560765 -2.57087684 +5 3 8 2 8 80610.91466560 66911.06545553 -71885.70143812 +5 3 8 3 1 -536.75623723 -1559.35463819 3.94201116 +5 3 8 3 2 1563.15739352 534.28176827 -6.59858390 +5 3 8 3 3 -1560.15803721 -535.98497418 3.40641182 +5 3 8 3 4 533.47836926 1563.90723260 -6.17010443 +5 3 8 3 5 71893.06057309 71891.14312744 -74116.75121194 +5 3 8 3 6 -3071.10520681 -3070.80527118 9448.22949211 +5 3 8 3 7 3064.97795033 3065.21361404 -9458.15950393 +5 3 8 3 8 -71886.55839707 -71888.36872285 74131.80155347 +6 1 1 1 1 74113.83755151 -72001.92649548 72006.23271419 +6 1 1 1 2 0.49275140 -1558.28343951 535.74931047 +6 1 1 1 3 -0.62129524 537.95597976 -1559.68670978 +6 1 1 1 4 -9472.03152690 3065.23503801 -3066.41335657 +6 1 1 1 5 -0.95336683 1557.77997612 -539.79844150 +6 1 1 1 6 -74107.15327172 71997.17037332 -71995.04939992 +6 1 1 1 7 9466.41844579 -3061.80720222 3061.16448301 +6 1 1 1 8 -0.02142397 -536.08138206 1557.85496003 +6 1 1 2 1 -72004.34740451 67024.50539631 -80796.18919021 +6 1 1 2 2 889.35199649 3066.01701305 -95.09030729 +6 1 1 2 3 -537.75245201 0.34278358 3077.44670303 +6 1 1 2 4 1.77818982 1561.95765100 -3081.64580187 +6 1 1 2 5 1553.42019748 0.21423974 3070.14112799 +6 1 1 2 6 67035.67799859 -72006.46837791 80811.55017936 +6 1 1 2 7 3061.33587480 889.93044378 90.86978447 +6 1 1 2 8 0.57844729 -536.67054134 -3076.99679958 +6 1 1 3 1 72007.83951222 -80795.30009530 67033.78197692 +6 1 1 3 2 -1.39255829 -3078.06799826 -538.18093149 +6 1 1 3 3 -1558.04777580 3077.53239892 0.27851166 +6 1 1 3 4 -2.86010049 -3080.14612371 1557.13725691 +6 1 1 3 5 536.22063789 3076.67543997 1.88530969 +6 1 1 3 6 -67028.31886363 80799.95980959 -72006.42552996 +6 1 1 3 7 -3061.97859401 91.88742323 890.48746710 +6 1 1 3 8 -891.51581784 -92.55156641 3061.18590698 +6 2 1 1 1 -67017.46762094 72015.89492634 -80796.97116525 +6 2 1 1 2 -1561.78625921 -1.85317373 -3081.82790565 +6 2 1 1 3 -0.57844729 538.57727500 3077.33958316 +6 2 1 1 4 -3065.10649417 -888.70927728 -95.70089055 +6 2 1 1 5 -891.71934559 -3053.55897234 86.16722225 +6 2 1 1 6 71999.35561863 -67052.19588232 80811.67872320 +6 2 1 1 7 0.44990345 -1557.58716036 3076.32194441 +6 2 1 1 8 536.88478108 -0.51417537 -3076.93252766 +6 2 1 2 1 72011.80294736 -74112.61638501 72011.03168430 +6 2 1 2 2 -3064.61374278 9472.93133380 -3065.78134934 +6 2 1 2 3 -537.46322837 -0.70699113 -1558.44411931 +6 2 1 2 4 1558.21916759 -0.34278358 535.87785431 +6 2 1 2 5 3056.94396019 -9458.51299949 3054.97295461 +6 2 1 2 6 -72002.16215919 74100.51183987 -71998.43438777 +6 2 1 2 7 -1558.82975084 -1.47825419 -537.10973280 +6 2 1 2 8 536.13494200 0.16067980 1557.81211209 +6 2 1 3 1 -80798.84576295 72015.87350236 -67033.67485705 +6 2 1 3 2 -3080.18897166 -2.88152446 -1557.11583294 +6 2 1 3 3 3077.13605541 -1559.92237350 -0.25708768 +6 2 1 3 4 -3078.10013422 -1.41398226 538.17021950 +6 2 1 3 5 89.61648201 -3058.44363835 -892.09426513 +6 2 1 3 6 80806.74049726 -67036.98486099 72006.25413817 +6 2 1 3 7 3076.16126460 535.37439093 -0.02142397 +6 2 1 3 8 -92.57299038 -891.53724181 -3061.19661897 +6 3 1 1 1 67029.91494967 -80801.69515146 72004.17601272 +6 3 1 1 2 -540.07695316 -3079.37486066 -0.85695895 +6 3 1 1 3 888.90209304 90.36632109 -3062.66416117 +6 3 1 1 4 3063.45684820 -93.02289383 -888.81639715 +6 3 1 1 5 -2.19595730 3073.89032339 536.15636597 +6 3 1 1 6 -71997.19179729 80810.32901286 -67028.00821601 +6 3 1 1 7 -0.51417537 3076.69686395 -1559.55816594 +6 3 1 1 8 1557.71570420 -3077.29673521 -0.34278358 +6 3 1 2 1 -80804.71593175 67032.88217003 -72004.62591617 +6 3 1 2 2 -92.80865410 3063.38186429 888.76283721 +6 3 1 2 3 90.61269679 889.00921291 3062.72843309 +6 3 1 2 4 -3078.46434178 -539.45565792 0.19281576 +6 3 1 2 5 3072.49776510 -1.86388571 1561.55059550 +6 3 1 2 6 80813.09270547 -72002.07646330 67026.70135361 +6 3 1 2 7 3076.97537560 0.19281576 -535.59934265 +6 3 1 2 8 -3077.12534342 1557.80140010 0.42847947 +6 3 1 3 1 71999.93406592 -71999.81623407 74099.97624053 +6 3 1 3 2 536.34918173 -1559.29036627 2.34592512 +6 3 1 3 3 3062.88911289 -3062.70700912 9469.33210622 +6 3 1 3 4 1559.34392621 -536.30633379 2.33521313 +6 3 1 3 5 -537.06688485 1558.74405494 3.72777142 +6 3 1 3 6 -72001.54086395 72000.79102487 -74115.23010981 +6 3 1 3 7 -1558.61551110 537.17400472 2.88152446 +6 3 1 3 8 -3061.33587480 3061.33587480 -9465.43294300 +6 1 2 1 1 0.14996782 886.35264017 -1.09262266 +6 1 2 1 2 0.17139179 2.39948506 8.77311723 +6 1 2 1 3 -0.25708768 -886.41691209 -1.02835074 +6 1 2 1 4 0.13925583 -0.00000000 -0.36420755 +6 1 2 1 5 -0.40705550 891.28015412 3.25644400 +6 1 2 1 6 0.13925583 -2.29236519 -8.82667717 +6 1 2 1 7 -0.12854384 -891.36585002 -1.09262266 +6 1 2 1 8 0.12854384 0.08569589 0.29993563 +6 1 2 2 1 -1558.50839123 3063.32830435 -3078.06799826 +6 1 2 2 2 1.82103777 4.73469819 -2955.21222105 +6 1 2 2 3 1558.67978302 -3063.28545641 -3078.11084621 +6 1 2 2 4 -0.66414318 -0.06427192 573.69116790 +6 1 2 2 5 -1552.65964641 -3060.80027546 -3072.41206920 +6 1 2 2 6 -6.35220820 0.70699113 11771.70228850 +6 1 2 2 7 1557.65143228 3055.29431421 -3075.62566526 +6 1 2 2 8 0.06427192 0.11783186 2914.09961550 +6 1 2 3 1 535.49222279 -92.25163078 -538.25591539 +6 1 2 3 2 6.34149622 -2959.42203188 -1.27472644 +6 1 2 3 3 535.57791868 -94.50114802 538.08452360 +6 1 2 3 4 -0.18210378 2914.83874260 -1.07119869 +6 1 2 3 5 -531.85014726 -91.52321567 539.58420176 +6 1 2 3 6 -7.61622265 -2962.63562793 -0.38563153 +6 1 2 3 7 -538.77009076 -88.52385935 -536.00639816 +6 1 2 3 8 0.92123087 3373.89022720 -0.63200722 +6 2 2 1 1 -1561.14354000 -3065.92060517 -3079.61052437 +6 2 2 1 2 6.34149622 0.83553497 11784.49240080 +6 2 2 1 3 1561.16496397 3065.96345312 -3079.56767642 +6 2 2 1 4 -0.13925583 0.08569589 2915.24579810 +6 2 2 1 5 -1560.30800502 3053.53754837 -3077.08249547 +6 2 2 1 6 -1.69249392 4.64900229 -2964.13530609 +6 2 2 1 7 1555.20909928 -3059.30059730 -3074.14741108 +6 2 2 1 8 0.70699113 -0.11783186 574.59097480 +6 2 2 2 1 -0.36420755 9473.85256467 -1.99242955 +6 2 2 2 2 -0.68556716 -4.01699507 6.33078423 +6 2 2 2 3 0.44990345 -9471.66731935 -1.88530969 +6 2 2 2 4 -0.66414318 -0.02142397 -0.23566371 +6 2 2 2 5 1.15689458 9463.50478537 5.74162495 +6 2 2 2 6 0.51417537 2.16382134 -6.27722430 +6 2 2 2 7 0.51417537 -9463.48336139 -1.99242955 +6 2 2 2 8 -0.81411100 -0.31064762 0.29993563 +6 2 2 3 1 -3080.68172306 -3067.16319565 -1556.43026578 +6 2 2 3 2 11785.79926320 7.56266272 -2.91366042 +6 2 2 3 3 -3080.70314703 -3069.36986494 1556.28029797 +6 2 2 3 4 573.11272061 -0.32135961 -1.13547061 +6 2 2 3 5 -3078.08942224 3062.57846527 -1554.60922802 +6 2 2 3 6 -2962.35711628 7.47696682 -0.19281576 +6 2 2 3 7 -3072.96909252 3057.82234311 1559.83667760 +6 2 2 3 8 2915.93136525 1.29615041 -0.76055107 +6 3 2 1 1 -539.07002640 -90.75195262 536.56342147 +6 3 2 1 2 6.47004006 -2961.05025388 -0.42847947 +6 3 2 1 3 -538.98433050 -90.88049646 -536.54199750 +6 3 2 1 4 -0.78197504 3371.83352572 -0.62129524 +6 3 2 1 5 542.24077450 -87.02418119 -534.18536039 +6 3 2 1 6 -5.08819376 -2964.28527391 -1.26401445 +6 3 2 1 7 535.19228715 -92.16593488 537.72031605 +6 3 2 1 8 0.04284795 2914.21744736 -1.08191067 +6 3 2 2 1 -3078.13227018 3061.57153851 -1558.97971865 +6 3 2 2 2 -2959.55057572 -3.88845123 1.52110213 +6 3 2 2 3 -3078.11084621 3061.48584261 1558.93687070 +6 3 2 2 4 2913.72469596 -0.53559934 0.96407882 +6 3 2 2 5 -3070.33394376 -3054.39450732 -1562.53609829 +6 3 2 2 6 11772.94487897 -3.98485911 1.60679803 +6 3 2 2 7 -3075.47569744 -3061.44299467 1557.33007268 +6 3 2 2 8 574.69809467 1.08191067 1.01763875 +6 3 2 3 1 0.10711987 885.32428943 2.57087684 +6 3 2 3 2 -1.22116650 1.61751001 -3.87773924 +6 3 2 3 3 -0.12854384 -885.40998533 2.48518095 +6 3 2 3 4 0.97479080 -0.47132742 -1.90673366 +6 3 2 3 5 -0.47132742 890.10183557 -7.32699901 +6 3 2 3 6 0.07498391 0.19281576 3.94201116 +6 3 2 3 7 -0.21423974 -892.26565692 2.42090903 +6 3 2 3 8 0.74983908 0.86767094 1.98171757 +6 1 3 1 1 -0.87838292 -537.30254856 -1558.04777580 +6 1 3 1 2 -0.14996782 1558.30486348 536.01711014 +6 1 3 1 3 -74115.85140504 72014.97369547 72011.54585967 +6 1 3 1 4 9472.87777386 -3064.69943867 -3065.55639762 +6 1 3 1 5 -9460.51614104 3056.00130535 3053.43042850 +6 1 3 1 6 74104.26103527 -72005.99705048 -71997.49173292 +6 1 3 1 7 -0.49275140 -1556.81589731 -538.58798699 +6 1 3 1 8 0.85695895 535.47079881 1558.76547892 +6 1 3 2 1 538.57727500 -0.53559934 3077.28602322 +6 1 3 2 2 -889.24487662 -3065.89918120 -94.94033948 +6 1 3 2 3 72016.10916607 -67015.60373523 -80799.33851435 +6 1 3 2 4 -1.82103777 -1562.04334689 -3081.53868200 +6 1 3 2 5 -3053.55897234 -891.70863360 86.21007019 +6 1 3 2 6 -67052.36727411 71999.33419466 80812.21432255 +6 1 3 2 7 -1557.60858433 0.46061543 3076.39692831 +6 1 3 2 8 0.02142397 536.01711014 -3076.11841666 +6 1 3 3 1 -1559.77240568 3077.32887117 -0.17139179 +6 1 3 3 2 -1.39255829 -3078.07871025 538.40588321 +6 1 3 3 3 72015.19864719 -80797.75314029 -67035.14239925 +6 1 3 3 4 -2.93508440 -3080.21039563 -1556.92301718 +6 1 3 3 5 -3058.52933424 89.85214572 -892.13711307 +6 1 3 3 6 -67037.62758020 80805.05871533 72006.91828135 +6 1 3 3 7 536.04924610 3077.13605541 -0.62129524 +6 1 3 3 8 -890.83025068 -93.24784556 -3060.23254015 +6 2 3 1 1 0.19281576 -537.87028387 3077.59667084 +6 2 3 1 2 1561.91480305 1.73534187 -3081.77434571 +6 2 3 1 3 67023.36992570 -72003.36190172 -80795.28938332 +6 2 3 1 4 3066.00630107 889.37342047 -95.07959531 +6 2 3 1 5 -0.65343120 1552.78819025 3069.58410468 +6 2 3 1 6 -72004.07960484 67035.39948694 80811.31451565 +6 2 3 1 7 889.78047597 3061.44299467 90.73052865 +6 2 3 1 8 -536.64911737 0.59987126 -3077.00751156 +6 2 3 2 1 538.02025168 -0.68556716 -1559.64386184 +6 2 3 2 2 3064.65659072 -9472.86706188 -3065.59924557 +6 2 3 2 3 -72001.80866362 74115.74428517 72003.72610927 +6 2 3 2 4 -1558.27272752 0.19281576 536.02782213 +6 2 3 2 5 1557.71570420 -0.98550279 -539.84128945 +6 2 3 2 6 71996.88114967 -74107.15327172 -71994.57807250 +6 2 3 2 7 -3061.87147414 9466.45058175 3061.14305904 +6 2 3 2 8 -535.47079881 -0.83553497 1558.78690289 +6 2 3 3 1 3076.99679958 -1558.28343951 0.49275140 +6 2 3 3 2 -3080.36036345 -2.81725254 1556.80518532 +6 2 3 3 3 -80795.66430286 72009.53200615 67037.97036378 +6 2 3 3 4 -3078.92495721 -1.99242955 -539.02717845 +6 2 3 3 5 3073.98673127 534.33532821 -0.00000000 +6 2 3 3 6 80806.00137017 -67027.96536806 -72006.76831354 +6 2 3 3 7 91.39467183 -3061.70008235 890.16610749 +6 2 3 3 8 -93.42994933 -890.94808253 3060.32894803 +6 3 3 1 1 888.40934165 91.44823176 3061.93574606 +6 3 3 1 2 -539.88413740 -3079.44984457 0.89980690 +6 3 3 1 3 67030.78262060 -80802.25217477 -72004.92585180 +6 3 3 1 4 3064.35665509 -92.35875065 889.48054033 +6 3 3 1 5 -1.83174975 3072.77627676 1561.29350781 +6 3 3 1 6 -72000.46966527 80809.45062994 67027.53688859 +6 3 3 1 7 0.74983908 3077.80019859 -536.42416564 +6 3 3 1 8 1557.86567202 -3077.22175130 0.24637570 +6 3 3 2 1 91.00904030 888.22723787 -3061.72150633 +6 3 3 2 2 -92.80865410 3063.37115230 -888.78426119 +6 3 3 2 3 -80804.21246837 67030.08634146 72004.66876411 +6 3 3 2 4 -3078.46434178 -539.41280997 -0.17139179 +6 3 3 2 5 3073.79391551 -2.31378916 536.32775776 +6 3 3 2 6 80810.86461220 -71997.42746100 -67030.32200517 +6 3 3 2 7 3076.78255984 -0.37491954 -1559.40819813 +6 3 3 2 8 -3077.08249547 1557.77997612 -0.41776749 +6 3 3 3 1 -3062.42849746 3063.36044031 9469.44993807 +6 3 3 3 2 -536.30633379 1559.32250223 2.37806108 +6 3 3 3 3 -72000.33040944 72001.32662422 74100.83319948 +6 3 3 3 4 -1559.31179024 536.30633379 2.31378916 +6 3 3 3 5 1559.47247005 -536.04924610 4.15625090 +6 3 3 3 6 71998.75574737 -72005.97562651 -74115.16583788 +6 3 3 3 7 538.66297089 -1556.82660929 1.63893399 +6 3 3 3 8 3061.33587480 -3061.34658679 -9465.37938307 +6 1 4 1 1 -9471.60304743 0.40705550 -2.03527750 +6 1 4 1 2 0.14996782 -0.62129524 -0.07498391 +6 1 4 1 3 9473.91683659 -0.40705550 -1.88530969 +6 1 4 1 4 -3.07434023 -1.43540624 6.87709556 +6 1 4 1 5 9463.41908947 1.26401445 5.82732085 +6 1 4 1 6 3.12790016 1.30686240 -6.85567159 +6 1 4 1 7 -9465.73287863 0.42847947 -2.03527750 +6 1 4 1 8 -0.10711987 -0.95336683 0.19281576 +6 1 4 2 1 3066.00630107 1561.10069205 -3079.50340450 +6 1 4 2 2 -0.08569589 -0.05355993 2915.09583028 +6 1 4 2 3 -3063.82105575 -1561.12211602 -3079.52482848 +6 1 4 2 4 -0.03213596 5.76304893 11783.78540967 +6 1 4 2 5 3053.64466824 -1560.37227694 -3077.03964753 +6 1 4 2 6 3.79204335 -1.11404663 -2963.51401086 +6 1 4 2 7 -3059.21490140 1555.18767531 -3074.08313915 +6 1 4 2 8 -0.21423974 0.61058325 574.69809467 +6 1 4 3 1 -3065.02079828 -3080.63887511 1556.40884181 +6 1 4 3 2 -0.49275140 573.36980830 -0.94265484 +6 1 4 3 3 -3067.18461962 -3080.70314703 -1556.36599386 +6 1 4 3 4 6.69499178 11783.80683364 -0.98550279 +6 1 4 3 5 3062.64273719 -3078.04657429 -1554.69492391 +6 1 4 3 6 6.63071986 -2960.45038262 -2.07812545 +6 1 4 3 7 3055.57282587 -3072.92624457 1559.90094952 +6 1 4 3 8 1.15689458 2915.63142962 -1.06048670 +6 2 4 1 1 -3065.47070172 1558.52981520 -3078.11084621 +6 2 4 1 2 -0.36420755 -0.83553497 573.34838433 +6 2 4 1 3 3065.38500583 -1558.46554328 -3078.02515032 +6 2 4 1 4 2.83867652 3.06362824 -2957.81523385 +6 2 4 1 5 -3060.86454738 -1552.59537449 -3072.75485278 +6 2 4 1 6 -0.93194286 -7.69120656 11774.29458932 +6 2 4 1 7 3059.60053293 1557.73712818 -3075.58281731 +6 2 4 1 8 -0.21423974 0.27851166 2914.35670319 +6 2 4 2 1 -886.37406415 -0.14996782 -1.22116650 +6 2 4 2 2 -0.08569589 0.09640788 -0.26779967 +6 2 4 2 3 886.35264017 0.10711987 -1.11404663 +6 2 4 2 4 2.36734909 0.21423974 8.76240525 +6 2 4 2 5 891.21588220 -0.47132742 3.29929195 +6 2 4 2 6 -2.32450115 0.23566371 -8.80525319 +6 2 4 2 7 -891.25873015 -0.17139179 -1.00692676 +6 2 4 2 8 0.08569589 0.07498391 0.27851166 +6 2 4 3 1 -96.62212141 535.49222279 538.29876334 +6 2 4 3 2 2915.35291796 -0.07498391 -1.41398226 +6 2 4 3 3 -92.25163078 535.49222279 -538.34161129 +6 2 4 3 4 -2956.61549132 5.80589687 -3.23502003 +6 2 4 3 5 -95.85085836 -531.78587534 539.45565792 +6 2 4 3 6 -2959.88264731 -7.04848735 1.47825419 +6 2 4 3 7 -88.45958743 -538.77009076 -536.02782213 +6 2 4 3 8 3374.40440257 0.86767094 -0.29993563 +6 3 4 1 1 3061.50726659 -3078.17511813 1558.95829468 +6 3 4 1 2 -0.96407882 2913.74611994 0.69627915 +6 3 4 1 3 3063.73535985 -3078.06799826 -1558.89402276 +6 3 4 1 4 -5.72020098 -2959.44345585 -1.00692676 +6 3 4 1 5 -3056.57975264 -3070.26967183 -1562.62179418 +6 3 4 1 6 -5.83803283 11772.90203103 4.11340295 +6 3 4 1 7 -3056.92253622 -3075.51854539 1557.35149665 +6 3 4 1 8 0.70699113 574.76236659 1.43540624 +6 3 4 2 1 -90.75195262 -539.04860242 -536.49914955 +6 3 4 2 2 3371.42647022 -0.93194286 -0.61058325 +6 3 4 2 3 -90.75195262 -539.02717845 536.71338929 +6 3 4 2 4 -2962.88200363 7.66978259 -0.53559934 +6 3 4 2 5 -84.83893588 542.26219848 -534.18536039 +6 3 4 2 6 -2966.17058360 -6.32007224 -1.28543842 +6 3 4 2 7 -90.00211354 535.23513510 537.82743592 +6 3 4 2 8 2913.85323981 0.23566371 -1.19974253 +6 3 4 3 1 -885.30286546 -0.10711987 2.42090903 +6 3 4 3 2 -0.77126305 0.97479080 -2.08883744 +6 3 4 3 3 887.53095873 0.17139179 2.48518095 +6 3 4 3 4 -0.21423974 -1.13547061 -3.81346732 +6 3 4 3 5 892.30850486 -0.47132742 -7.45554285 +6 3 4 3 6 -1.61751001 0.12854384 3.92058719 +6 3 4 3 7 -892.28708089 -0.17139179 2.44233300 +6 3 4 3 8 0.42847947 0.79268703 1.96029359 +6 1 5 1 1 -0.87838292 1553.68799715 534.31390423 +6 1 5 1 2 -0.64271921 -1552.60608647 -531.60377156 +6 1 5 1 3 -9459.57348619 -3053.10906890 -3057.90803901 +6 1 5 1 4 9463.14057781 3055.44428203 3062.17140977 +6 1 5 1 5 -73991.75303735 -71805.36153673 -71877.94595964 +6 1 5 1 6 73991.22814999 71801.93370093 71869.20497837 +6 1 5 1 7 -0.89980690 533.93898469 1555.42333902 +6 1 5 1 8 -0.70699113 -533.93898469 -1553.49518138 +6 1 5 2 1 1558.37984739 -0.21423974 3074.67229843 +6 1 5 2 2 889.58766020 -3059.58982094 -93.55849317 +6 1 5 2 3 3056.93324820 -891.81575347 90.04496149 +6 1 5 2 4 0.81411100 -1559.85810157 -3077.48955097 +6 1 5 2 5 -71803.86185857 -66823.04505956 -80590.94752211 +6 1 5 2 6 66836.87423459 71804.78308944 80598.87439238 +6 1 5 2 7 -537.57034824 -2.94579638 3077.39314309 +6 1 5 2 8 -1.04977471 532.70710620 -3079.16062092 +6 1 5 3 1 -539.11287434 3069.48769679 0.32135961 +6 1 5 3 2 3.79204335 -3073.15119630 539.62704971 +6 1 5 3 3 3054.56589911 85.93155854 -892.00856923 +6 1 5 3 4 5.83803283 -3077.14676739 -1554.97343557 +6 1 5 3 5 -71877.08900069 -80588.14098155 -66909.68360923 +6 1 5 3 6 66910.07995274 80611.85732045 71886.68694091 +6 1 5 3 7 1558.37984739 3080.79955491 2.63514877 +6 1 5 3 8 883.56752359 -109.74430531 -3072.59417298 +6 2 5 1 1 -890.91594657 3056.14056118 90.54842487 +6 2 5 1 2 -1560.11518926 0.74983908 -3077.40385508 +6 2 5 1 3 0.61058325 1557.50146447 3074.06171518 +6 2 5 1 4 -3060.48962784 890.18753147 -92.89434999 +6 2 5 1 5 -66820.81696630 -71804.46172983 -80591.11891390 +6 2 5 1 6 71801.78373312 66838.74883229 80598.74584854 +6 2 5 1 7 -2.72084466 -537.81672393 3077.43599104 +6 2 5 1 8 532.53571441 -0.95336683 -3079.24631682 +6 2 5 2 1 -3053.30188466 -9459.64847010 -3057.79020715 +6 2 5 2 2 3055.46570600 9463.12986583 3062.20354573 +6 2 5 2 3 1552.85246217 -0.25708768 534.91377550 +6 2 5 2 4 -1552.61679846 -0.64271921 -531.63590752 +6 2 5 2 5 -71806.62555117 -73992.68498021 -71879.01715833 +6 2 5 2 6 71804.30105003 73991.54950960 71869.63345784 +6 2 5 2 7 533.75688092 -0.81411100 1555.32693114 +6 2 5 2 8 -533.94969668 -0.70699113 -1553.49518138 +6 2 5 3 1 86.42430993 3053.54826036 -891.22659419 +6 2 5 3 2 -3076.28980845 4.97036190 -1554.36285232 +6 2 5 3 3 3068.44863407 -538.68439487 0.94265484 +6 2 5 3 4 -3072.30494934 2.95650837 539.17714626 +6 2 5 3 5 -80591.60095331 -71876.12492188 -66910.66911202 +6 2 5 3 6 80614.12826166 66911.76173468 71886.42985323 +6 2 5 3 7 3080.70314703 1558.29415149 2.47446896 +6 2 5 3 8 -109.49792961 883.28901193 -3072.56203702 +6 3 5 1 1 -3.87773924 3073.26902815 -538.97361851 +6 3 5 1 2 542.84064577 -3070.80527118 -0.04284795 +6 3 5 1 3 -4.34906666 3075.02579400 1558.05848778 +6 3 5 1 4 -3054.26596348 -87.23842093 890.16610749 +6 3 5 1 5 -66913.88270808 -80606.67271881 -71895.51361808 +6 3 5 1 6 71873.55404503 80595.83218811 66916.83921645 +6 3 5 1 7 -885.58137712 101.47465146 3069.01636937 +6 3 5 1 8 -1554.41641225 -3080.92809875 0.49275140 +6 3 5 2 1 3073.91174736 -3.68492348 1557.70499222 +6 3 5 2 2 -87.21699696 -3054.24453950 890.14468352 +6 3 5 2 3 3070.64459137 -1.75676584 -537.09902081 +6 3 5 2 4 -3070.79455919 542.81922179 -0.04284795 +6 3 5 2 5 -80608.42948465 -66914.67539510 -71896.45627292 +6 3 5 2 6 80602.07727645 71871.11171203 66916.53928081 +6 3 5 2 7 100.88549218 -885.18503361 3068.82355361 +6 3 5 2 8 -3080.93881074 -1554.38427629 0.47132742 +6 3 5 3 1 535.34225497 1561.00428417 2.81725254 +6 3 5 3 2 -533.45694528 -1563.89652062 -6.07369655 +6 3 5 3 3 1559.45104607 536.92762902 3.81346732 +6 3 5 3 4 -1563.13596955 -534.27105629 -6.53431198 +6 3 5 3 5 -71892.86775733 -71890.20047260 -74116.23703657 +6 3 5 3 6 71888.96859411 71884.39457573 74132.30501685 +6 3 5 3 7 -3065.29930993 -3064.78513457 -9458.09523201 +6 3 5 3 8 3071.21232668 3070.83740714 9448.26162808 +6 1 6 1 1 -74108.86718962 67033.99621666 -67027.94394409 +6 1 6 1 2 0.94265484 -7.85188636 -8.58030147 +6 1 6 1 3 74100.05122443 -67048.70377461 -67036.38498973 +6 1 6 1 4 3.67421149 3.17074811 5.16317766 +6 1 6 1 5 73986.62199565 66835.49238828 66912.55442171 +6 1 6 1 6 120.60625998 218.71734757 126.29432500 +6 1 6 1 7 -74102.76135711 -67030.26844523 67035.78511846 +6 1 6 1 8 -0.29993563 -4.61686633 -6.82353563 +6 1 6 2 1 71997.72739663 -72005.91135459 80806.21560991 +6 1 6 2 2 -3.70634745 1.02835074 -2960.10759904 +6 1 6 2 3 -72005.90064260 71997.66312471 80804.07321254 +6 1 6 2 4 -2.50660492 -0.59987126 -2960.06475109 +6 1 6 2 5 71805.62933640 71801.24813377 80611.08605739 +6 1 6 2 6 219.38149075 221.69527991 -328882.41972007 +6 1 6 2 7 -72008.63219925 -72012.83129810 80808.80791073 +6 1 6 2 8 -2.24951724 -2.37806108 11772.36643168 +6 1 6 3 1 -71994.25671289 80814.11034422 -72003.69397331 +6 1 6 3 2 -9.12661280 11771.12384121 -0.88909491 +6 1 6 3 3 -71997.77024458 80814.46383978 72003.19050993 +6 1 6 3 4 -7.32699901 -2964.62805749 -1.41398226 +6 1 6 3 5 71865.99138231 80595.68222030 71885.44435044 +6 1 6 3 6 126.64782056 -328878.02780546 115.13243470 +6 1 6 3 7 72010.58178086 80799.48848216 -72005.41860319 +6 1 6 3 8 5.09890574 -2952.14859281 7.96971822 +6 2 6 1 1 71997.98448432 -72006.48980188 80806.76192124 +6 2 6 1 2 -3.64207553 0.99621478 -2960.13973500 +6 2 6 1 3 -72005.86850664 71997.29891716 80803.90182075 +6 2 6 1 4 -2.47446896 -0.57844729 -2960.08617506 +6 2 6 1 5 71805.05088911 71800.43402277 80610.40049023 +6 2 6 1 6 219.60644248 223.98764510 -328882.22690430 +6 2 6 1 7 -72008.73931912 -72013.22764161 80809.01143848 +6 2 6 1 8 -2.29236519 -2.41019704 11772.27002380 +6 2 6 2 1 -67051.63885901 74101.29381491 -67037.45618841 +6 2 6 2 2 3.59922758 3.70634745 5.31314548 +6 2 6 2 3 67035.00314342 -74109.18854922 -67028.58666330 +6 2 6 2 4 -6.14868045 1.09262266 -7.28415106 +6 2 6 2 5 66839.43439945 73988.12167381 66914.09694781 +6 2 6 2 6 218.62093968 117.68188757 125.30882221 +6 2 6 2 7 -67034.73534375 -74102.69708519 67035.95651025 +6 2 6 2 8 -4.11340295 -0.34278358 -7.03777536 +6 2 6 3 1 80810.80034028 -71998.15587611 72003.28691781 +6 2 6 3 2 -2964.13530609 -7.68049457 -1.53181412 +6 2 6 3 3 80812.82490580 -71994.81373621 -72004.45452438 +6 2 6 3 4 11774.00536567 -7.19845517 -1.58537405 +6 2 6 3 5 80596.59273918 71866.76264537 71886.21561349 +6 2 6 3 6 -328878.56340480 124.62325505 115.75372993 +6 2 6 3 7 80800.32401714 72011.14951616 -72006.03989843 +6 2 6 3 8 -2951.62370545 5.37741740 8.05541411 +6 3 6 1 1 -71993.80680944 80814.76377542 -72003.28691781 +6 3 6 1 2 -8.95522101 11771.27380902 -0.73912709 +6 3 6 1 3 -71996.84901371 80814.72092747 72001.17665640 +6 3 6 1 4 -7.53052676 -2964.67090544 -1.24259047 +6 3 6 1 5 71869.04429857 80598.61730469 71888.22946702 +6 3 6 1 6 121.34538707 -328881.92696867 111.68317493 +6 3 6 1 7 72011.16022815 80800.04550548 -72004.90442782 +6 3 6 1 8 5.76304893 -2952.74846407 8.92308505 +6 3 6 2 1 80810.54325260 -71997.84522849 72003.58685344 +6 3 6 2 2 -2964.26384994 -7.83046239 -1.66035796 +6 3 6 2 3 80812.81419381 -71994.98512800 -72001.81937561 +6 3 6 2 4 11774.05892561 -7.06991132 -1.73534187 +6 3 6 2 5 80597.86746561 71868.09093174 71888.01522728 +6 3 6 2 6 -328877.37437426 124.04480776 110.18349677 +6 3 6 2 7 80798.52440335 72009.45702224 -72003.74753324 +6 3 6 2 8 -2952.30927261 6.09512052 7.20916715 +6 3 6 3 1 -67028.88659893 67027.62258448 -74118.59367368 +6 3 6 3 2 -1.15689458 3.41712381 3.37427586 +6 3 6 3 3 67026.88345739 -67030.23630927 -74119.04357713 +6 3 6 3 4 5.25958554 -1.58537405 4.49903448 +6 3 6 3 5 66910.30490447 66909.74788115 74140.36043096 +6 3 6 3 6 108.66239464 110.80479201 -4.97036190 +6 3 6 3 7 -67020.57409713 -67018.93516314 74089.93910885 +6 3 6 3 8 -0.53559934 -0.84624696 4.67042627 +6 1 7 1 1 9466.54698963 3061.53940255 -3062.02144196 +6 1 7 1 2 -0.32135961 1557.50146447 -538.84507467 +6 1 7 1 3 -1.54252611 -1556.58023360 536.17778994 +6 1 7 1 4 -9464.88663167 -3057.84376708 3056.60117661 +6 1 7 1 5 -1.51039015 -537.67746810 1557.05156102 +6 1 7 1 6 -74103.55404414 -72014.41667215 72011.99576312 +6 1 7 1 7 74104.92517845 72008.84643899 -72003.20122192 +6 1 7 1 8 0.19281576 538.52371507 -1557.84424805 +6 1 7 2 1 -3060.65030764 889.20202868 91.95169515 +6 1 7 2 2 -890.29465133 3057.07250403 -88.71667512 +6 1 7 2 3 -1557.69428023 1.24259047 3076.82540779 +6 1 7 2 4 0.97479080 1554.78061981 -3072.62630894 +6 1 7 2 5 533.77830489 -2.69942069 3080.03900384 +6 1 7 2 6 -67034.12476050 -72011.84579531 80799.93838561 +6 1 7 2 7 72008.20371978 67050.69620416 -80809.91124537 +6 1 7 2 8 -0.21423974 -538.32018732 -3077.42527905 +6 1 7 3 1 3060.37179598 91.28755196 889.26630060 +6 1 7 3 2 -1.13547061 -3075.53996937 -535.94212623 +6 1 7 3 3 -538.63083493 3076.54689613 -0.17139179 +6 1 7 3 4 -2.08883744 -3073.89032339 1559.83667760 +6 1 7 3 5 1553.95579682 3075.92560089 1.67106995 +6 1 7 3 6 67039.09512240 80805.25153109 -71999.59128235 +6 1 7 3 7 -72000.44824129 -80809.11855834 67022.12733523 +6 1 7 3 8 888.70927728 -90.38774507 3062.77128104 +6 2 7 1 1 1.24259047 -1557.94065593 3076.79327183 +6 2 7 1 2 1554.67349994 0.87838292 -3072.77627676 +6 2 7 1 3 889.84474789 -3061.44299467 91.33039991 +6 2 7 1 4 3056.18340912 -889.60908418 -89.33797035 +6 2 7 1 5 -2.62443678 533.54264118 3080.12469974 +6 2 7 1 6 -72012.83129810 -67032.50725049 80800.36686509 +6 2 7 1 7 67052.02449053 72007.28248891 -80809.11855834 +6 2 7 1 8 -538.51300308 -0.13925583 -3077.35029514 +6 2 7 2 1 -1558.42269534 -0.23566371 534.83879159 +6 2 7 2 2 -3057.97231093 -9464.96161558 3056.54761668 +6 2 7 2 3 3061.10021109 9466.39702182 -3062.10713785 +6 2 7 2 4 1556.60165757 0.32135961 -539.45565792 +6 2 7 2 5 -538.03096367 -1.37113432 1557.26580076 +6 2 7 2 6 -72011.13880417 -74104.51812295 72013.10980975 +6 2 7 2 7 72009.48915820 74104.06821950 -72002.17287118 +6 2 7 2 8 538.34161129 0.26779967 -1557.80140010 +6 2 7 3 1 3075.79705705 -537.82743592 -0.69627915 +6 2 7 3 2 -3074.14741108 -2.16382134 1559.78311767 +6 2 7 3 3 90.50557692 3061.27160288 889.86617186 +6 2 7 3 4 -3076.40764030 -0.57844729 -536.54199750 +6 2 7 3 5 3075.63637725 1554.20217252 1.67106995 +6 2 7 3 6 80806.34415375 67036.08505410 -71998.84144327 +6 2 7 3 7 -80807.22253667 -71999.84837003 67021.89167151 +6 2 7 3 8 -90.53771288 888.81639715 3062.85697693 +6 3 7 1 1 -1.24259047 3077.84304654 -1557.54431241 +6 3 7 1 2 534.95662344 -3075.06864194 0.04284795 +6 3 7 1 3 -0.22495172 3076.84683176 538.12737155 +6 3 7 1 4 -3059.61124492 -90.79480057 -890.89452260 +6 3 7 1 5 -885.96700865 100.47843668 -3064.52804688 +6 3 7 1 6 72010.33540516 80798.86718693 -67021.60244787 +6 3 7 1 7 -67039.12725836 -80811.10027591 71996.83830172 +6 3 7 1 8 -1559.02256660 -3077.14676739 -0.44990345 +6 3 7 2 1 3075.94702487 0.40705550 537.43109241 +6 3 7 2 2 -90.98761633 -3059.70765280 -890.93737055 +6 3 7 2 3 3077.62880680 -1.28543842 -1557.65143228 +6 3 7 2 4 -3075.94702487 535.59934265 -0.59987126 +6 3 7 2 5 100.25348496 -885.90273672 -3064.48519893 +6 3 7 2 6 80800.01336952 72009.38203833 -67020.80976084 +6 3 7 2 7 -80809.60059775 -67039.59858578 71997.30962915 +6 3 7 2 8 -3077.29673521 -1558.91544673 -0.33207159 +6 3 7 3 1 -1560.54366873 -534.96733543 1.55323809 +6 3 7 3 2 536.39202968 1559.38677415 3.96343514 +6 3 7 3 3 -536.60626942 -1558.85117481 2.69942069 +6 3 7 3 4 1557.76926414 538.02025168 2.91366042 +6 3 7 3 5 3070.62316740 3071.12663078 -9457.27040902 +6 3 7 3 6 -71998.86286724 -72002.82630238 74085.98638570 +6 3 7 3 7 71993.69968958 71989.92907020 -74110.13120406 +6 3 7 3 8 -3062.42849746 -3061.86076215 9470.25333708 +6 1 8 1 1 0.02142397 0.08569589 -890.03756365 +6 1 8 1 2 0.34278358 0.38563153 1.22116650 +6 1 8 1 3 -0.06427192 -0.06427192 -894.32235839 +6 1 8 1 4 -0.29993563 -0.27851166 1.17831855 +6 1 8 1 5 -0.08569589 -0.04284795 883.56752359 +6 1 8 1 6 -3.35285189 -0.42847947 5.50596124 +6 1 8 1 7 0.06427192 -0.04284795 887.53095873 +6 1 8 1 8 3.40641182 0.47132742 5.53809720 +6 1 8 2 1 -536.49914955 -536.39202968 -91.28755196 +6 1 8 2 2 -0.02142397 0.19281576 3374.16873886 +6 1 8 2 3 536.52057352 536.37060571 -93.32282946 +6 1 8 2 4 -0.77126305 0.66414318 2915.58858168 +6 1 8 2 5 -533.30697747 533.28555349 -110.29061664 +6 1 8 2 6 -5.42026535 -0.29993563 -2952.50208837 +6 1 8 2 7 537.87028387 -537.97740374 -89.42366625 +6 1 8 2 8 1.54252611 4.15625090 -2952.57707228 +6 1 8 3 1 1557.56573639 -3076.71828792 3060.67173161 +6 1 8 3 2 0.40705550 2914.32456723 -1.03906272 +6 1 8 3 3 1557.63000831 -3076.76113587 -3058.65787809 +6 1 8 3 4 0.47132742 574.74094262 -1.26401445 +6 1 8 3 5 -1554.39498828 -3080.38178742 -3071.16947873 +6 1 8 3 6 -6.22366436 11773.20196666 6.08440853 +6 1 8 3 7 -1558.63693507 -3077.03964753 3064.37807907 +6 1 8 3 8 3.08505221 -2951.43088969 0.69627915 +6 2 8 1 1 536.37060571 536.39202968 -91.37324786 +6 2 8 1 2 0.85695895 -0.58915928 2915.58858168 +6 2 8 1 3 -536.43487763 -536.30633379 -93.53706920 +6 2 8 1 4 -0.06427192 -0.06427192 3374.14731488 +6 2 8 1 5 533.24270555 -533.30697747 -110.29061664 +6 2 8 1 6 -1.49967816 -4.24194679 -2952.58778427 +6 2 8 1 7 -537.91313182 537.91313182 -89.40224228 +6 2 8 1 8 5.42026535 0.28922365 -2952.45924042 +6 2 8 2 1 0.02142397 0.02142397 -889.97329173 +6 2 8 2 2 -0.17139179 0.05355993 1.19974253 +6 2 8 2 3 0.08569589 0.02142397 -894.49375018 +6 2 8 2 4 0.01071199 0.10711987 1.30686240 +6 2 8 2 5 0.02142397 -0.02142397 883.48182770 +6 2 8 2 6 -3.05291625 -0.68556716 5.42026535 +6 2 8 2 7 -0.02142397 -0.06427192 887.48811078 +6 2 8 2 8 3.06362824 0.74983908 5.54880919 +6 2 8 3 1 -3076.76113587 1557.60858433 -3060.80027546 +6 2 8 3 2 574.71951864 0.39634351 -0.87838292 +6 2 8 3 3 -3076.67543997 1557.65143228 3058.61503014 +6 2 8 3 4 2914.34599120 0.42847947 -0.70699113 +6 2 8 3 5 -3080.42463537 -1554.35214033 -3070.91239105 +6 2 8 3 6 11773.14840672 -6.34149622 8.05541411 +6 2 8 3 7 -3076.88967971 -1558.72263097 3064.44235099 +6 2 8 3 8 -2951.45231366 3.14932413 2.53874088 +6 3 8 1 1 1557.63000831 -3076.67543997 -3060.69315559 +6 3 8 1 2 0.32135961 574.65524672 1.09262266 +6 3 8 1 3 1557.71570420 -3076.69686395 3060.62888367 +6 3 8 1 4 0.55702332 2914.36741517 0.89980690 +6 3 8 1 5 -1554.43783623 -3080.42463537 3071.08378284 +6 3 8 1 6 3.80275533 -2952.05218492 -1.49967816 +6 3 8 1 7 -1558.72263097 -3076.99679958 -3064.42092701 +6 3 8 1 8 -6.89851953 11773.72685401 -7.03777536 +6 3 8 2 1 -3076.71828792 1557.60858433 3060.75742751 +6 3 8 2 2 2914.45311107 0.51417537 0.73912709 +6 3 8 2 3 -3076.80398381 1557.56573639 -3060.58603572 +6 3 8 2 4 574.58026281 0.34278358 1.09262266 +6 3 8 2 5 -3080.36036345 -1554.39498828 3071.21232668 +6 3 8 2 6 -2952.08432088 3.83489129 -1.56395008 +6 3 8 2 7 -3076.91110368 -1558.55123918 -3064.39950304 +6 3 8 2 8 11773.75898997 -6.91994351 -6.98421543 +6 3 8 3 1 -0.02142397 -0.06427192 -9469.88912953 +6 3 8 3 2 -1.69249392 0.93194286 2.36734909 +6 3 8 3 3 -0.02142397 -0.04284795 -9461.16957223 +6 3 8 3 4 1.69249392 -0.96407882 2.39948506 +6 3 8 3 5 0.04284795 0.08569589 9444.71596043 +6 3 8 3 6 11.97600130 6.87709556 4.90608998 +6 3 8 3 7 -0.00000000 -0.14996782 9471.79586319 +6 3 8 3 8 -11.99742528 -6.80211165 4.92751395 +7 1 1 1 1 -0.02142397 -0.03213596 -5.18460164 +7 1 1 1 2 -9468.73223495 0.06427192 3.06362824 +7 1 1 1 3 0.02142397 0.02142397 0.51417537 +7 1 1 1 4 9468.76437091 -0.02142397 2.93508440 +7 1 1 1 5 -0.02142397 0.02142397 -0.14996782 +7 1 1 1 6 9470.91748027 0.66414318 -0.85695895 +7 1 1 1 7 0.08569589 -0.03213596 0.38563153 +7 1 1 1 8 -9470.85320835 -0.77126305 -0.83553497 +7 1 1 2 1 0.04284795 0.07498391 -11783.73184973 +7 1 1 2 2 3060.43606790 1561.33635576 3077.53239892 +7 1 1 2 3 -0.02142397 0.08569589 -2915.16010220 +7 1 1 2 4 -3060.43606790 -1561.29350781 3077.61809482 +7 1 1 2 5 -0.02142397 -0.04284795 -574.71951864 +7 1 1 2 6 3060.80027546 -1557.43719255 3077.51097495 +7 1 1 2 7 -0.00000000 0.05355993 2963.54614682 +7 1 1 2 8 -3060.82169943 1557.50146447 3077.36100713 +7 1 1 3 1 -1.77818982 -11783.18553841 0.04284795 +7 1 1 3 2 3062.94267283 3079.61052437 1556.34456989 +7 1 1 3 3 0.73912709 -573.58404804 0.02142397 +7 1 1 3 4 3062.94267283 3079.63194834 -1556.21602604 +7 1 1 3 5 -0.80339901 -2915.61000565 -0.00000000 +7 1 1 3 6 -3061.18590698 3076.58974408 -1557.39434460 +7 1 1 3 7 -1.67106995 2959.93620725 0.02142397 +7 1 1 3 8 -3061.20733096 3076.62188004 1557.31936069 +7 2 1 1 1 -0.06427192 -0.05355993 2957.22607457 +7 2 1 1 2 -3063.52112012 1556.38741783 3075.68993718 +7 2 1 1 3 -0.00000000 0.02142397 -573.36980830 +7 2 1 1 4 3063.47827217 -1556.38741783 3075.45427347 +7 2 1 1 5 0.10711987 -0.00000000 -2914.26029531 +7 2 1 1 6 -3061.07878711 -1557.15868089 3076.43977626 +7 2 1 1 7 -0.04284795 -0.01071199 -11773.64115812 +7 2 1 1 8 3061.05736314 1557.21224082 3076.40764030 +7 2 1 2 1 -0.04284795 0.02142397 -2.08883744 +7 2 1 2 2 -888.96636496 0.53559934 2.46375698 +7 2 1 2 3 0.04284795 0.02142397 0.72841511 +7 2 1 2 4 889.03063689 -0.55702332 2.31378916 +7 2 1 2 5 -0.04284795 -0.00000000 -1.97100558 +7 2 1 2 6 888.62358139 -0.92123087 -0.00000000 +7 2 1 2 7 -0.02142397 0.03213596 -1.86388571 +7 2 1 2 8 -888.60215741 0.92123087 0.29993563 +7 2 1 3 1 2960.34326275 -1.68178194 -0.06427192 +7 2 1 3 2 92.01596707 -534.87092755 538.25591539 +7 2 1 3 3 -2914.67806279 0.70699113 -0.02142397 +7 2 1 3 4 92.02667905 -534.93519947 -538.12737155 +7 2 1 3 5 -3373.81524329 -1.07119869 0.19281576 +7 2 1 3 6 90.40916904 535.83500637 537.78458797 +7 2 1 3 7 2963.47116291 -0.05355993 0.03213596 +7 2 1 3 8 90.30204917 535.93141425 -537.81672393 +7 3 1 1 1 -1.02835074 2959.38989592 -0.02142397 +7 3 1 1 2 -3058.87211782 3075.02579400 1559.60101389 +7 3 1 1 3 0.26779967 -2913.70327199 -0.10711987 +7 3 1 1 4 -3058.88282981 3074.94009810 -1559.53674197 +7 3 1 1 5 0.40705550 -574.91233441 0.02142397 +7 3 1 1 6 3060.65030764 3076.03272076 -1559.23680634 +7 3 1 1 7 -3.19217208 -11772.98772692 -0.04284795 +7 3 1 1 8 3060.67173161 3076.07556871 1559.22609435 +7 3 1 2 1 2962.05718064 -2.52802890 0.03213596 +7 3 1 2 2 89.53078612 539.75559355 -536.47772558 +7 3 1 2 3 -3371.54430208 0.55702332 -0.02142397 +7 3 1 2 4 89.61648201 539.75559355 536.62769339 +7 3 1 2 5 -2914.04605557 0.10711987 0.04284795 +7 3 1 2 6 89.59505804 -538.04167566 -536.13494200 +7 3 1 2 7 2965.18508081 -1.56395008 -0.03213596 +7 3 1 2 8 89.61648201 -537.96669175 536.02782213 +7 3 1 3 1 -0.17139179 -0.06427192 4.86324203 +7 3 1 3 2 -890.85167465 -0.14996782 -2.89223645 +7 3 1 3 3 0.04284795 0.02142397 2.16382134 +7 3 1 3 4 890.84096266 0.27851166 -2.74226863 +7 3 1 3 5 -0.05355993 -0.02142397 -2.46375698 +7 3 1 3 6 888.94494099 -0.12854384 1.92815763 +7 3 1 3 7 0.04284795 -0.04284795 -2.71013267 +7 3 1 3 8 -889.00921291 0.11783186 2.02456552 +7 1 2 1 1 -9469.63204185 3060.52176380 3063.70322389 +7 1 2 1 2 74061.56305567 -71906.32201282 -71941.36092181 +7 1 2 1 3 -0.23566371 -1555.85181849 -535.47079881 +7 1 2 1 4 -0.86767094 535.79215842 1555.63757875 +7 1 2 1 5 -0.97479080 -534.48529602 -1556.49453770 +7 1 2 1 6 -1.63893399 1553.28094165 536.41345366 +7 1 2 1 7 -74051.57948392 71904.77948671 71937.50460655 +7 1 2 1 8 9463.26912166 -3057.64023933 -3059.86833260 +7 1 2 2 1 0.32135961 1561.90409106 3079.65337232 +7 1 2 2 2 -71903.50476027 66918.12465487 80698.69939786 +7 1 2 2 3 890.95879452 3065.06364622 93.13001370 +7 1 2 2 4 -535.43866285 -0.36420755 -3078.30366197 +7 1 2 2 5 2.35663711 -537.50607631 3074.53304260 +7 1 2 2 6 1557.34078466 -0.10711987 -3075.02579400 +7 1 2 2 7 66929.13657735 -71897.27038392 -80701.79516206 +7 1 2 2 8 3058.78642193 890.25180339 -90.83764851 +7 1 2 3 1 3.68492348 3078.04657429 1556.69806545 +7 1 2 3 2 -71942.56066434 80699.36354105 66983.76771030 +7 1 2 3 3 2.42090903 3075.49712142 -538.23449142 +7 1 2 3 4 1556.83732128 -3078.92495721 0.47132742 +7 1 2 3 5 890.72313081 93.15143767 3062.87840091 +7 1 2 3 6 -538.50229109 -3072.51918907 -0.27851166 +7 1 2 3 7 66969.97067124 -80706.03710886 -71956.21844758 +7 1 2 3 8 3057.35101569 -88.59884326 890.78740273 +7 2 2 1 1 -3064.22811125 -890.16610749 93.64418907 +7 2 2 1 2 -66921.18828311 71901.97294615 80699.45994893 +7 2 2 1 3 -1561.08998006 0.51417537 3079.07492503 +7 2 2 1 4 0.19281576 535.29940702 -3078.23939005 +7 2 2 1 5 537.73102804 -2.05670148 3074.49019465 +7 2 2 1 6 -890.45533114 -3058.76499795 -90.85907249 +7 2 2 1 7 71899.94838064 -66928.81521775 -80701.81658604 +7 2 2 1 8 -0.79268703 -1558.05848778 -3075.65780122 +7 2 2 2 1 1555.76612260 0.38563153 -535.53507073 +7 2 2 2 2 71905.39006996 -74063.19127767 -71940.86817042 +7 2 2 2 3 -3059.85762061 9470.53184874 3063.07121667 +7 2 2 2 4 -535.97426219 0.70699113 1555.65900273 +7 2 2 2 5 534.53885596 1.19974253 -1556.40884181 +7 2 2 2 6 3057.52240748 -9463.20484974 -3059.96474048 +7 2 2 2 7 -71903.18340067 74052.50071479 71938.10447781 +7 2 2 2 8 -1554.22359649 0.98550279 535.76002246 +7 2 2 3 1 3075.47569744 2.39948506 538.19164347 +7 2 2 3 2 80699.20286125 -71942.28215268 -66983.64987845 +7 2 2 3 3 3077.99301436 3.59922758 -1556.68735347 +7 2 2 3 4 -3078.87139728 1556.77304936 -0.40705550 +7 2 2 3 5 93.18357364 890.76597876 -3062.89982488 +7 2 2 3 6 -88.57741929 3057.37243966 -890.74455478 +7 2 2 3 7 -80705.80144515 66969.91711130 71955.92922393 +7 2 2 3 8 -3072.49776510 -538.48086712 0.32135961 +7 3 2 1 1 -3059.60053293 90.86978447 -889.53410027 +7 3 2 1 2 -66971.23468569 80709.01504120 71950.68035037 +7 3 2 1 3 540.17336104 3075.26145771 -0.38563153 +7 3 2 1 4 -884.69228221 -101.54963537 -3065.25646199 +7 3 2 1 5 -1559.77240568 3079.73906821 1.69249392 +7 3 2 1 6 -0.59987126 -3073.16190828 537.57034824 +7 3 2 1 7 71938.87574086 -80703.88399950 -66977.13699044 +7 3 2 1 8 -3.10647619 -3076.24696050 -1557.69428023 +7 3 2 2 1 3075.43284950 540.00196925 0.51417537 +7 3 2 2 2 80709.48636862 -66969.98138322 -71951.36591753 +7 3 2 2 3 90.28062520 -3060.50033982 890.10183557 +7 3 2 2 4 -101.67817921 -884.85296201 3065.21361404 +7 3 2 2 5 3079.64266033 -1559.92237350 -1.77818982 +7 3 2 2 6 -3076.85754375 -4.00628308 1558.33699944 +7 3 2 2 7 -80703.46623201 71940.03263544 66976.52640719 +7 3 2 2 8 -3072.99051650 -0.78197504 -537.44180439 +7 3 2 3 1 1559.00114263 -536.80979717 -3.22430804 +7 3 2 3 2 71946.00992411 -71945.95636417 -74125.82426480 +7 3 2 3 3 536.80979717 -1559.06541455 -3.19217208 +7 3 2 3 4 3067.75235492 -3067.67737102 -9458.21306386 +7 3 2 3 5 -3058.12227874 3058.14370272 9466.35417387 +7 3 2 3 6 -536.25277385 1559.38677415 2.97793235 +7 3 2 3 7 -71955.67213625 71955.71498420 74118.09021030 +7 3 2 3 8 -1559.40819813 536.26348584 3.02078029 +7 1 3 1 1 -0.12854384 -0.02142397 0.63200722 +7 1 3 1 2 -0.55702332 889.00921291 2.37806108 +7 1 3 1 3 -0.03213596 -0.00000000 -2.22809327 +7 1 3 1 4 0.50346338 -889.00921291 2.52802890 +7 1 3 1 5 0.01071199 0.08569589 -1.97100558 +7 1 3 1 6 -0.87838292 888.70927728 0.29993563 +7 1 3 1 7 -0.00000000 0.04284795 -1.91744565 +7 1 3 1 8 0.85695895 -888.58073344 0.26779967 +7 1 3 2 1 -0.00000000 -0.06427192 -573.47692817 +7 1 3 2 2 -1556.45168975 3063.47827217 3075.73278513 +7 1 3 2 3 -0.00000000 -0.02142397 2957.12966669 +7 1 3 2 4 1556.44097777 -3063.58539204 3075.75420910 +7 1 3 2 5 -0.03213596 -0.04284795 -2914.34599120 +7 1 3 2 6 -1557.22295281 -3061.05736314 3076.31123242 +7 1 3 2 7 -0.12854384 0.02142397 -11773.73756600 +7 1 3 2 8 1557.26580076 3061.05736314 3076.41835229 +7 1 3 3 1 0.62129524 -2914.64592683 -0.01071199 +7 1 3 3 2 -534.89235152 91.97311912 -538.21306745 +7 1 3 3 3 -1.74605386 2960.32183877 -0.06427192 +7 1 3 3 4 -534.96733543 91.86599925 538.38445924 +7 1 3 3 5 -1.04977471 -3373.76168336 0.04284795 +7 1 3 3 6 535.89927829 90.36632109 537.61319618 +7 1 3 3 7 -0.10711987 2963.59970675 -0.00000000 +7 1 3 3 8 536.00639816 90.23777725 -537.87028387 +7 2 3 1 1 -0.00000000 0.03213596 -2914.98871041 +7 2 3 1 2 -1561.29350781 -3058.29367053 3077.46812700 +7 2 3 1 3 0.03213596 -0.08569589 -11782.43569933 +7 2 3 1 4 1561.28279583 3058.35794245 3077.63951879 +7 2 3 1 5 0.05355993 -0.06427192 -574.97660633 +7 2 3 1 6 -1557.45861652 3060.80027546 3077.33958316 +7 2 3 1 7 0.04284795 0.06427192 2962.26070839 +7 2 3 1 8 1557.39434460 -3060.82169943 3077.31815918 +7 2 3 2 1 -0.04284795 0.05355993 0.65343120 +7 2 3 2 2 -0.08569589 9468.66796303 3.06362824 +7 2 3 2 3 -0.00000000 0.02142397 -3.92058719 +7 2 3 2 4 0.05355993 -9468.77508290 2.87081248 +7 2 3 2 5 0.02142397 0.02142397 -0.29993563 +7 2 3 2 6 0.81411100 9468.58226714 -1.02835074 +7 2 3 2 7 0.08569589 -0.02142397 -0.85695895 +7 2 3 2 8 -0.77126305 -9468.67867502 -0.89980690 +7 2 3 3 1 -573.51977611 0.71770312 -0.04284795 +7 2 3 3 2 3079.65337232 3062.89982488 -1556.32314591 +7 2 3 3 3 -11783.20696238 -1.82103777 -0.10711987 +7 2 3 3 4 3079.66408430 3062.87840091 1556.40884181 +7 2 3 3 5 -2915.64214161 -0.77126305 -0.00000000 +7 2 3 3 6 3076.58974408 -3061.14305904 -1557.22295281 +7 2 3 3 7 2959.89335930 -1.59608604 0.05355993 +7 2 3 3 8 3076.54689613 -3061.28231486 1557.22295281 +7 3 3 1 1 0.59987126 -3372.01562950 0.05355993 +7 3 3 1 2 539.75559355 91.84457528 536.45630160 +7 3 3 1 3 -3.70634745 2960.27899083 0.08569589 +7 3 3 1 4 539.74488157 91.78030336 -536.58484545 +7 3 3 1 5 -0.18210378 -2914.51738299 0.02142397 +7 3 3 1 6 -537.95597976 89.53078612 -535.94212623 +7 3 3 1 7 -0.21423974 2963.36404304 0.05355993 +7 3 3 1 8 -538.02025168 89.56292208 536.15636597 +7 3 3 2 1 -2913.72469596 0.19281576 -0.04284795 +7 3 3 2 2 3075.02579400 -3058.89354180 -1559.70813376 +7 3 3 2 3 2959.58271168 -1.04977471 0.08569589 +7 3 3 2 4 3075.01508201 -3058.82926988 1559.62243786 +7 3 3 2 5 -574.90162242 0.53559934 0.04284795 +7 3 3 2 6 3076.07556871 3060.62888367 -1559.19395839 +7 3 3 2 7 -11772.92345500 -3.19217208 0.02142397 +7 3 3 2 8 3075.98987281 3060.59674771 1559.15111044 +7 3 3 3 1 -0.06427192 0.02142397 2.28165320 +7 3 3 3 2 0.17139179 890.78740273 -2.97793235 +7 3 3 3 3 0.01071199 -0.02142397 4.73469819 +7 3 3 3 4 -0.11783186 -890.74455478 -2.78511658 +7 3 3 3 5 -0.03213596 0.10711987 -2.46375698 +7 3 3 3 6 -0.14996782 888.90209304 2.14239737 +7 3 3 3 7 0.04284795 -0.06427192 -2.74226863 +7 3 3 3 8 0.10711987 -889.04134887 2.03527750 +7 1 4 1 1 9469.61061787 -3060.53247578 3063.70322389 +7 1 4 1 2 0.83553497 -535.79215842 1555.59473081 +7 1 4 1 3 0.23566371 1555.85181849 -535.38510292 +7 1 4 1 4 -74061.54163170 71906.24702891 -71941.29664989 +7 1 4 1 5 0.98550279 534.44244807 -1556.49453770 +7 1 4 1 6 -9463.22627371 3057.65095132 -3059.94331651 +7 1 4 1 7 74051.42951611 -71904.56524697 71937.45104661 +7 1 4 1 8 1.62822200 -1553.29165363 536.41345366 +7 1 4 2 1 -0.19281576 -1561.79697119 3079.83547609 +7 1 4 2 2 535.40652689 0.37491954 -3078.38935787 +7 1 4 2 3 -891.06591439 -3065.14934212 93.32282946 +7 1 4 2 4 71903.59045617 -66918.33889461 80696.65340837 +7 1 4 2 5 -2.97793235 538.14879553 3075.36857758 +7 1 4 2 6 -3058.87211782 -890.29465133 -90.75195262 +7 1 4 2 7 -66928.62240198 71896.98116028 -80701.09888292 +7 1 4 2 8 -1557.43719255 0.14996782 -3075.02579400 +7 1 4 3 1 3.57780361 3077.92874243 -1556.90159320 +7 1 4 3 2 1556.81589731 -3078.90353324 -0.46061543 +7 1 4 3 3 2.48518095 3075.53996937 537.99882771 +7 1 4 3 4 -71942.22859275 80699.11716535 -66981.23968141 +7 1 4 3 5 891.35513803 92.55156641 -3063.82105575 +7 1 4 3 6 3057.34030370 -88.56670730 -890.85167465 +7 1 4 3 7 66969.11371229 -80705.05160607 71954.96514512 +7 1 4 3 8 -538.49157911 -3072.49776510 0.32135961 +7 2 4 1 1 3064.33523112 890.27322736 93.85842881 +7 2 4 1 2 -0.17139179 -535.35296696 -3078.27152601 +7 2 4 1 3 1561.03642013 -0.55702332 3079.22489284 +7 2 4 1 4 66921.22041907 -71902.04793006 80697.25327964 +7 2 4 1 5 -538.40588321 2.74226863 3075.41142552 +7 2 4 1 6 0.81411100 1558.03706381 -3075.66851321 +7 2 4 1 7 -71899.32708540 66928.17249854 -80700.88464318 +7 2 4 1 8 890.44461915 3058.66859007 -90.93405640 +7 2 4 2 1 -1555.72327465 -0.40705550 -535.54578272 +7 2 4 2 2 535.94212623 -0.77126305 1555.66971471 +7 2 4 2 3 3059.91118055 -9470.51042477 3063.11406462 +7 2 4 2 4 -71905.26152612 74062.84849409 -71940.58965876 +7 2 4 2 5 -534.53885596 -1.15689458 -1556.40884181 +7 2 4 2 6 1554.25573245 -0.94265484 535.74931047 +7 2 4 2 7 71902.90488901 -74052.17935519 71937.87952608 +7 2 4 2 8 -3057.43671158 9463.18342576 -3059.95402849 +7 2 4 3 1 3075.49712142 2.47446896 -537.96669175 +7 2 4 3 2 -3078.90353324 1556.82660929 0.47132742 +7 2 4 3 3 3077.96087839 3.55637964 1556.88016923 +7 2 4 3 4 80699.42781297 -71942.41069652 66981.71100883 +7 2 4 3 5 92.54085442 891.32300207 3063.75678383 +7 2 4 3 6 -3072.45491715 -538.47015513 -0.29993563 +7 2 4 3 7 -80705.37296567 66969.40293593 -71955.20080883 +7 2 4 3 8 -88.60955525 3057.35101569 890.78740273 +7 3 4 1 1 -3059.60053293 90.88049646 889.51267629 +7 3 4 1 2 -884.66014625 -101.53892338 3065.24575000 +7 3 4 1 3 540.16264905 3075.32572963 0.29993563 +7 3 4 1 4 -66971.19183774 80708.95076928 -71950.53038256 +7 3 4 1 5 -1559.74026972 3079.69622027 -1.75676584 +7 3 4 1 6 -3.09576420 -3076.22553652 1557.65143228 +7 3 4 1 7 71938.79004497 -80704.01254334 66977.15841442 +7 3 4 1 8 -0.62129524 -3073.09763636 -537.49536433 +7 3 4 2 1 3075.34715360 540.05552919 -0.50346338 +7 3 4 2 2 -101.54963537 -884.67085824 -3065.24575000 +7 3 4 2 3 90.23777725 -3060.47891585 -890.20895544 +7 3 4 2 4 80709.01504120 -66968.96374447 71950.61607845 +7 3 4 2 5 3079.61052437 -1559.90094952 1.82103777 +7 3 4 2 6 -3073.14048431 -0.62129524 537.48465234 +7 3 4 2 7 -80703.29484022 71937.99735794 -66976.47284726 +7 3 4 2 8 -3076.24696050 -3.10647619 -1557.70499222 +7 3 4 3 1 -1559.06541455 536.82050916 -3.22430804 +7 3 4 3 2 -3067.69879499 3067.69879499 -9458.20235188 +7 3 4 3 3 -536.78837320 1559.04399057 -3.21359606 +7 3 4 3 4 -71945.75283642 71945.79568437 -74125.70643295 +7 3 4 3 5 3058.11156676 -3058.16512669 9466.39702182 +7 3 4 3 6 1559.46175806 -536.19921392 2.99935632 +7 3 4 3 7 71955.58644035 -71955.57572837 74117.97237844 +7 3 4 3 8 536.19921392 -1559.44033409 2.95650837 +7 1 5 1 1 0.04284795 -0.00000000 -0.63200722 +7 1 5 1 2 -0.77126305 2.33521313 890.12325954 +7 1 5 1 3 0.03213596 -0.08569589 -0.83553497 +7 1 5 1 4 0.81411100 -2.33521313 890.03756365 +7 1 5 1 5 -0.03213596 -0.02142397 -4.00628308 +7 1 5 1 6 -0.74983908 -2.35663711 -886.69542375 +7 1 5 1 7 -0.02142397 0.03213596 -1.41398226 +7 1 5 1 8 0.72841511 2.42090903 -886.62043984 +7 1 5 2 1 -0.02142397 -0.10711987 -2915.89922929 +7 1 5 2 2 -534.76380768 -537.93455579 91.37324786 +7 1 5 2 3 0.12854384 0.14996782 -3374.53294641 +7 1 5 2 4 534.72095973 537.99882771 93.49422125 +7 1 5 2 5 0.62129524 -0.64271921 2950.72389855 +7 1 5 2 6 -537.24898863 533.90684873 101.89241895 +7 1 5 2 7 -0.59987126 0.61058325 2950.72389855 +7 1 5 2 8 537.14186876 -534.06752853 101.95669087 +7 1 5 3 1 -0.83553497 -574.62311076 0.02142397 +7 1 5 3 2 -1556.13033015 3074.79013029 3062.57846527 +7 1 5 3 3 -1.64964598 -2914.51738299 -0.00000000 +7 1 5 3 4 -1556.22673803 3074.81155426 -3062.68558514 +7 1 5 3 5 -3.57780361 2952.82344798 -0.04284795 +7 1 5 3 6 1557.90851997 3080.63887511 -3066.84183604 +7 1 5 3 7 2.72084466 -11774.38028521 -0.01071199 +7 1 5 3 8 1557.88709599 3080.61745113 3066.88468399 +7 2 5 1 1 -0.08569589 -0.16067980 -3374.50081045 +7 2 5 1 2 537.95597976 534.78523165 91.56606362 +7 2 5 1 3 0.05355993 0.08569589 -2915.93136525 +7 2 5 1 4 -537.99882771 -534.76380768 93.57991715 +7 2 5 1 5 0.66414318 -0.70699113 2950.72389855 +7 2 5 1 6 533.94969668 -537.37753247 101.97811484 +7 2 5 1 7 -0.57844729 0.59987126 2950.61677869 +7 2 5 1 8 -533.97112065 537.25970062 102.01025080 +7 2 5 2 1 -0.00000000 0.09640788 -0.80339901 +7 2 5 2 2 -2.39948506 0.83553497 890.16610749 +7 2 5 2 3 -0.06427192 0.02142397 -0.62129524 +7 2 5 2 4 2.37806108 -0.77126305 890.03756365 +7 2 5 2 5 -0.01071199 -0.08569589 -3.98485911 +7 2 5 2 6 -2.42090903 -0.81411100 -886.65257580 +7 2 5 2 7 -0.00000000 -0.03213596 -1.43540624 +7 2 5 2 8 2.44233300 0.74983908 -886.55616792 +7 2 5 3 1 -2914.58165491 -1.71391790 0.03213596 +7 2 5 3 2 3074.68301042 -1556.19460207 -3062.55704130 +7 2 5 3 3 -574.54812685 -0.79268703 0.02142397 +7 2 5 3 4 3074.75799433 -1556.32314591 3062.51419335 +7 2 5 3 5 2952.75917606 -3.51353169 -0.04284795 +7 2 5 3 6 3080.63887511 1557.95136791 -3066.84183604 +7 2 5 3 7 -11774.33743726 2.71013267 0.01071199 +7 2 5 3 8 3080.63887511 1557.91923195 3066.88468399 +7 3 5 1 1 0.38563153 -2914.49595902 -0.10711987 +7 3 5 1 2 -1559.02256660 3078.58217363 -3060.92881930 +7 3 5 1 3 0.37491954 -574.59097480 -0.04284795 +7 3 5 1 4 -1558.92615872 3078.56074966 3061.05736314 +7 3 5 1 5 12.29736091 -11774.44455713 0.06427192 +7 3 5 1 6 1555.10197941 3076.71828792 3068.59860189 +7 3 5 1 7 -5.42026535 2952.75917606 -0.04284795 +7 3 5 1 8 1555.20909928 3076.77184785 -3068.51290599 +7 3 5 2 1 -574.54812685 0.43919146 0.05355993 +7 3 5 2 2 3078.66786953 -1559.00114263 3060.84312340 +7 3 5 2 3 -2914.45311107 0.29993563 0.04284795 +7 3 5 2 4 3078.66786953 -1558.89402276 -3061.10021109 +7 3 5 2 5 -11774.39099720 12.38305680 0.04284795 +7 3 5 2 6 3076.73971189 1555.12340339 3068.64144983 +7 3 5 2 7 2952.69490413 -5.43097733 0.03213596 +7 3 5 2 8 3076.78255984 1555.15553935 -3068.51290599 +7 3 5 3 1 -0.00000000 -0.04284795 -2.49589294 +7 3 5 3 2 3.08505221 -3.04220427 9467.74673216 +7 3 5 3 3 0.01071199 -0.04284795 -2.52802890 +7 3 5 3 4 -3.09576420 3.02078029 9467.51106845 +7 3 5 3 5 -0.03213596 -0.00000000 -11.44040196 +7 3 5 3 6 3.04220427 3.08505221 -9459.49850228 +7 3 5 3 7 -0.04284795 -0.02142397 -0.16067980 +7 3 5 3 8 -3.04220427 -3.04220427 -9459.30568652 +7 1 6 1 1 9466.46129374 3061.60367447 -3061.80720222 +7 1 6 1 2 -0.32135961 1557.51217645 -538.83436268 +7 1 6 1 3 -1.45683021 -1556.70877744 536.30633379 +7 1 6 1 4 -9464.87591968 -3057.82234311 3056.51548071 +7 1 6 1 5 -0.89980690 -536.97047697 1557.95136791 +7 1 6 1 6 -74103.85397977 -72014.58806394 72010.34611715 +7 1 6 1 7 74104.53954693 72008.48223143 -72002.55850270 +7 1 6 1 8 0.23566371 538.51300308 -1557.86567202 +7 1 6 2 1 1.17831855 -1557.84424805 3076.75042388 +7 1 6 2 2 1554.37356431 0.81411100 -3072.79770073 +7 1 6 2 3 889.83403590 -3061.52869056 91.39467183 +7 1 6 2 4 3055.25146627 -889.07348483 -90.02353751 +7 1 6 2 5 -2.58158883 533.54264118 3080.08185179 +7 1 6 2 6 -72014.05246460 -67033.49275328 80801.22382403 +7 1 6 2 7 67054.63821532 72007.59313652 -80809.37564603 +7 1 6 2 8 -538.72724282 -0.11783186 -3077.32887117 +7 1 6 3 1 -1.26401445 3077.80019859 -1557.50146447 +7 1 6 3 2 534.95662344 -3075.09006592 0.02142397 +7 1 6 3 3 -0.25708768 3076.88967971 538.12737155 +7 1 6 3 4 -3059.62195690 -90.79480057 -890.89452260 +7 1 6 3 5 -885.97772063 100.47843668 -3064.57089483 +7 1 6 3 6 72010.31398119 80799.03857872 -67021.49532800 +7 1 6 3 7 -67039.25580220 -80811.22881975 71996.92399762 +7 1 6 3 8 -1559.06541455 -3077.14676739 -0.46061543 +7 2 6 1 1 -3061.55011454 889.89830782 91.34111190 +7 2 6 1 2 -890.38034723 3057.09392801 -88.71667512 +7 2 6 1 3 -1557.85496003 1.15689458 3076.73971189 +7 2 6 1 4 0.99621478 1554.73777186 -3072.64773292 +7 2 6 1 5 533.62833707 -2.57087684 3080.16754769 +7 2 6 1 6 -67031.98236313 -72012.08145902 80799.78841780 +7 2 6 1 7 72007.32533685 67050.06419694 -80809.27923815 +7 2 6 1 8 -0.21423974 -538.32018732 -3077.45741501 +7 2 6 2 1 -1557.50146447 -0.88909491 535.51364676 +7 2 6 2 2 -3057.97231093 -9464.96161558 3056.47263277 +7 2 6 2 3 3061.38943473 9466.41844579 -3062.12856183 +7 2 6 2 4 1556.56952161 0.38563153 -539.51992984 +7 2 6 2 5 -537.79529996 -1.39255829 1557.05156102 +7 2 6 2 6 -72013.51686525 -74104.45385103 72013.23835360 +7 2 6 2 7 72010.49608496 74104.67880276 -72002.91199827 +7 2 6 2 8 538.34161129 0.31064762 -1557.75855215 +7 2 6 3 1 3076.93252766 -0.22495172 538.12737155 +7 2 6 3 2 -91.00904030 -3059.71836478 -890.94808253 +7 2 6 3 3 3077.84304654 -1.24259047 -1557.52288844 +7 2 6 3 4 -3075.94702487 535.53507073 -0.59987126 +7 2 6 3 5 100.45701271 -885.96700865 -3064.57089483 +7 2 6 3 6 80798.04236394 72009.78909383 -67021.04542455 +7 2 6 3 7 -80808.89360662 -67039.12725836 71996.89186166 +7 2 6 3 8 -3077.27531124 -1558.94758269 -0.34278358 +7 3 6 1 1 3061.33587480 90.66625672 889.93044378 +7 3 6 1 2 -1.17831855 -3075.56139334 -535.97426219 +7 3 6 1 3 -538.45944314 3076.69686395 -0.04284795 +7 3 6 1 4 -2.03527750 -3073.95459531 1559.90094952 +7 3 6 1 5 1554.11647662 3075.83990500 1.58537405 +7 3 6 1 6 67036.67421337 80805.08013930 -71999.39846658 +7 3 6 1 7 -71999.18422685 -80808.28302337 67021.28108826 +7 3 6 1 8 888.70927728 -90.40916904 3062.74985706 +7 3 6 2 1 3076.69686395 -538.44873116 0.02142397 +7 3 6 2 2 -3074.14741108 -2.17453333 1559.80454164 +7 3 6 2 3 90.59127282 3061.27160288 889.97329173 +7 3 6 2 4 -3076.40764030 -0.57844729 -536.62769339 +7 3 6 2 5 3075.76492109 1554.13790059 1.58537405 +7 3 6 2 6 80804.25531631 67036.27786986 -71998.77717134 +7 3 6 2 7 -80806.15133799 -71999.23778678 67021.30251224 +7 3 6 2 8 -90.60198480 888.82710914 3062.82484097 +7 3 6 3 1 -1559.47247005 -535.66361458 2.04598949 +7 3 6 3 2 536.34918173 1559.47247005 3.84560328 +7 3 6 3 3 -536.53128551 -1558.72263097 2.54945287 +7 3 6 3 4 1557.88709599 537.97740374 2.74226863 +7 3 6 3 5 3070.17326395 3070.41963965 -9458.21306386 +7 3 6 3 6 -72000.45895328 -72002.03361535 74086.95046451 +7 3 6 3 7 71995.11367184 71991.04311684 -74109.46706088 +7 3 6 3 8 -3063.04979270 -3062.49276938 9469.33210622 +7 1 7 1 1 -0.02142397 0.01071199 -2.65657274 +7 1 7 1 2 -74052.67210658 66926.62997243 66965.96438815 +7 1 7 1 3 0.03213596 -0.02142397 0.08569589 +7 1 7 1 4 74052.53285075 -66926.73709230 66966.00723610 +7 1 7 1 5 -0.09640788 0.02142397 3.55637964 +7 1 7 1 6 74102.02223002 67046.64707313 -67035.09955130 +7 1 7 1 7 0.12854384 -0.06427192 137.28482351 +7 1 7 1 8 -74102.14006187 -67046.68992108 -67035.15311124 +7 1 7 2 1 0.17139179 0.05355993 2964.03889821 +7 1 7 2 2 71893.37122071 -71893.38193270 -80701.97726584 +7 1 7 2 3 0.08569589 -0.00000000 2964.02818623 +7 1 7 2 4 -71893.46762859 71893.45691661 -80702.13794564 +7 1 7 2 5 0.03213596 -0.00000000 -11772.30215976 +7 1 7 2 6 72009.09281468 72009.08210270 -80812.21432255 +7 1 7 2 7 0.21423974 0.03213596 328872.88605177 +7 1 7 2 8 -72009.03925475 -72009.10352667 -80812.11791466 +7 1 7 3 1 -4.94893793 2963.50329887 0.28922365 +7 1 7 3 2 71939.49703610 -80703.33768817 -71955.35077664 +7 1 7 3 3 -3.37427586 -11772.17361592 0.21423974 +7 1 7 3 4 71939.37920424 -80703.18772035 71953.01556351 +7 1 7 3 5 -2.88152446 2953.63755898 0.94265484 +7 1 7 3 6 -71999.40917857 -80812.08577870 71993.89250534 +7 1 7 3 7 131.20041498 328885.77257195 1.11404663 +7 1 7 3 8 -71999.54843440 -80812.07506672 -71993.93535329 +7 2 7 1 1 0.02142397 -0.08569589 2964.02818623 +7 2 7 1 2 71893.41406866 -71893.46762859 -80702.11652167 +7 2 7 1 3 0.06427192 0.04284795 2963.96391430 +7 2 7 1 4 -71893.42478064 71893.37122071 -80702.15936962 +7 2 7 1 5 0.04284795 -0.04284795 -11772.34500771 +7 2 7 1 6 72008.95355886 72009.12495064 -80812.04293076 +7 2 7 1 7 -0.06427192 -0.03213596 328872.57540415 +7 2 7 1 8 -72008.88928693 -72008.85715097 -80811.95723486 +7 2 7 2 1 -0.96407882 0.58915928 0.81411100 +7 2 7 2 2 -66929.43651299 74053.48621758 66966.64995531 +7 2 7 2 3 -0.17139179 -0.06427192 -2.44233300 +7 2 7 2 4 66928.85806570 -74052.35074698 66965.79299637 +7 2 7 2 5 -0.19281576 0.12854384 3.51353169 +7 2 7 2 6 67049.45361369 74102.69708519 -67035.95651025 +7 2 7 2 7 -0.74983908 -2.74226863 136.74922417 +7 2 7 2 8 -67046.88273684 -74101.88297419 -67035.29236707 +7 2 7 3 1 -11768.59581231 -0.77126305 -0.27851166 +7 2 7 3 2 -80707.08688357 71938.37227748 71954.81517730 +7 2 7 3 3 2964.18886603 -5.46311330 -0.17139179 +7 2 7 3 4 -80707.04403562 71938.38298947 -71952.47996417 +7 2 7 3 5 2954.39811004 -2.52802890 -1.00692676 +7 2 7 3 6 -80812.59995407 -72000.57678514 71994.38525674 +7 2 7 3 7 328889.12542384 132.78578903 -0.97479080 +7 2 7 3 8 -80812.51425818 -72000.38396937 -71994.21386495 +7 3 7 1 1 -4.99178587 2963.49258688 0.16067980 +7 3 7 1 2 71939.21852444 -80703.08060049 -71954.99728108 +7 3 7 1 3 -3.27786798 -11772.19503989 0.23566371 +7 3 7 1 4 71939.62557994 -80703.61619983 71953.35834709 +7 3 7 1 5 -2.84938850 2953.70183090 1.00692676 +7 3 7 1 6 -71999.86979400 -80812.27859447 71994.10674508 +7 3 7 1 7 131.39323074 328885.95467573 -0.00000000 +7 3 7 1 8 -71999.46273850 -80812.05364274 -71993.76396150 +7 3 7 2 1 -11768.46726847 -0.86767094 -0.24637570 +7 3 7 2 2 -80706.82979588 71938.14732576 71954.52595365 +7 3 7 2 3 2964.21029000 -5.29172151 -0.14996782 +7 3 7 2 4 -80707.33325927 71938.64007715 -71952.95129159 +7 3 7 2 5 2954.45166998 -2.44233300 -0.85695895 +7 3 7 2 6 -80813.00700957 -72000.94099269 71994.68519237 +7 3 7 2 7 328889.61817523 133.25711645 -0.78197504 +7 3 7 2 8 -80812.62137805 -72000.46966527 -71994.25671289 +7 3 7 3 1 -0.92123087 0.59987126 -1.52110213 +7 3 7 3 2 -66970.35630276 66970.27060687 74116.12991670 +7 3 7 3 3 -0.09640788 -0.08569589 -0.98550279 +7 3 7 3 4 66969.92782329 -66969.67073561 74117.73671473 +7 3 7 3 5 0.42847947 -0.57844729 -2.99935632 +7 3 7 3 6 67024.37685246 67022.41655887 -74107.68887106 +7 3 7 3 7 -1.09262266 -0.42847947 -12.96150409 +7 3 7 3 8 -67022.30943900 -67022.36299894 -74107.73171901 +7 1 8 1 1 -9466.52556566 -3061.57153851 -3062.05357792 +7 1 8 1 2 9464.87591968 3057.76878318 3056.61188860 +7 1 8 1 3 1.46754220 1556.64450552 536.19921392 +7 1 8 1 4 0.29993563 -1557.48004049 -538.89863461 +7 1 8 1 5 1.55323809 537.67746810 1557.09440897 +7 1 8 1 6 -0.23566371 -538.53442705 -1557.82282407 +7 1 8 1 7 -74105.52504972 -72009.39275032 -72003.72610927 +7 1 8 1 8 74103.98252361 72014.89871156 72012.72417823 +7 1 8 2 1 -1.19974253 1557.89780798 3076.75042388 +7 1 8 2 2 -3055.27289024 889.05206086 -89.99140155 +7 1 8 2 3 -889.87688385 3061.52869056 91.39467183 +7 1 8 2 4 -1554.42712424 -0.72841511 -3072.88339663 +7 1 8 2 5 2.61372479 -533.64976105 3080.16754769 +7 1 8 2 6 538.73795480 0.04284795 -3077.21103932 +7 1 8 2 7 -67054.57394340 -72007.56100056 -80809.35422206 +7 1 8 2 8 72014.05246460 67033.43919334 80801.09528019 +7 1 8 3 1 -1.17831855 3077.85375853 1557.53360043 +7 1 8 3 2 -3059.64338088 -90.81622454 890.87309862 +7 1 8 3 3 -0.25708768 3076.91110368 -538.17021950 +7 1 8 3 4 534.92448748 -3075.04721797 -0.04284795 +7 1 8 3 5 -885.96700865 100.43558873 3064.57089483 +7 1 8 3 6 -1558.99043064 -3077.08249547 0.42847947 +7 1 8 3 7 -67039.02013849 -80811.04671598 -71996.72046987 +7 1 8 3 8 72010.21757330 80798.76006706 67021.50603999 +7 2 8 1 1 3061.46441864 -889.86617186 91.37324786 +7 2 8 1 2 -0.96407882 -1554.76990782 -3072.63702093 +7 2 8 1 3 1557.86567202 -1.17831855 3076.69686395 +7 2 8 1 4 890.36963524 -3057.09392801 -88.69525114 +7 2 8 1 5 -533.60691310 2.59230082 3080.12469974 +7 2 8 1 6 0.26779967 538.34161129 -3077.53239892 +7 2 8 1 7 -72007.04682520 -67049.91422912 -80809.05428642 +7 2 8 1 8 67031.82168333 72011.88864325 80799.62773799 +7 2 8 2 1 1556.58023360 1.55323809 536.14565398 +7 2 8 2 2 -1556.60165757 -0.32135961 -539.44494594 +7 2 8 2 3 -3061.47513063 -9466.54698963 -3062.00001798 +7 2 8 2 4 3057.98302291 9464.98303955 3056.51548071 +7 2 8 2 5 537.63462016 1.49967816 1557.11583294 +7 2 8 2 6 -538.33089930 -0.36420755 -1557.75855215 +7 2 8 2 7 -72011.71725146 -74105.63216959 -72003.80109318 +7 2 8 2 8 72015.85207839 74104.74307468 72013.35618545 +7 2 8 3 1 3076.88967971 -0.26779967 -538.13808354 +7 2 8 3 2 -3075.96844884 535.57791868 0.61058325 +7 2 8 3 3 3077.86447051 -1.24259047 1557.56573639 +7 2 8 3 4 -90.99832832 -3059.79334869 890.91594657 +7 2 8 3 5 100.46772470 -885.98843262 3064.54947085 +7 2 8 3 6 -3077.27531124 -1558.93687070 0.29993563 +7 2 8 3 7 -80809.00072649 -67039.17010631 -71996.87043768 +7 2 8 3 8 80797.98880400 72009.68197396 67020.93830468 +7 3 8 1 1 3061.33587480 90.63412076 -889.89830782 +7 3 8 1 2 -2.07812545 -3073.96530730 -1559.90094952 +7 3 8 1 3 -538.43801917 3076.65401600 0.08569589 +7 3 8 1 4 -1.16760657 -3075.53996937 535.94212623 +7 3 8 1 5 1554.07362867 3075.77563308 -1.56395008 +7 3 8 1 6 888.71998927 -90.28062520 -3062.77128104 +7 3 8 1 7 -71999.24849877 -80808.37943125 -67021.17396840 +7 3 8 1 8 67036.70634933 80805.06942731 71999.41989056 +7 3 8 2 1 3076.69686395 -538.44873116 0.01071199 +7 3 8 2 2 -3076.39692831 -0.52488736 536.62769339 +7 3 8 2 3 90.66625672 3061.27160288 -889.99471570 +7 3 8 2 4 -3074.17954704 -2.18524532 -1559.77240568 +7 3 8 2 5 3075.79705705 1554.11647662 -1.56395008 +7 3 8 2 6 -90.54842487 888.88066907 -3062.83555296 +7 3 8 2 7 -80805.93709825 -71999.17351486 -67021.20610436 +7 3 8 2 8 80804.11606048 67036.09576608 71998.86286724 +7 3 8 3 1 1559.49389402 535.68503855 2.06741346 +7 3 8 3 2 -1557.84424805 -537.94526778 2.73155665 +7 3 8 3 3 536.47772558 1558.70120699 2.50660492 +7 3 8 3 4 -536.31704577 -1559.49389402 3.87773924 +7 3 8 3 5 -3070.15183998 -3070.37679170 -9458.21306386 +7 3 8 3 6 3063.03908071 3062.51419335 9469.33210622 +7 3 8 3 7 -71995.11367184 -71990.98955690 -74109.30638108 +7 3 8 3 8 72000.34112143 72001.92649548 74087.11114432 +8 1 1 1 1 -74115.87282902 72001.84079958 72005.95420254 +8 1 1 1 2 9472.97418175 -3064.58160682 -3065.79206133 +8 1 1 1 3 0.61058325 -538.02025168 -1559.70813376 +8 1 1 1 4 -0.34278358 1558.20845560 535.83500637 +8 1 1 1 5 0.95336683 -1557.71570420 -539.81986547 +8 1 1 1 6 0.17139179 536.11351802 1557.82282407 +8 1 1 1 7 -9466.39702182 3061.81791421 3061.18590698 +8 1 1 1 8 74107.92453477 -71997.60956478 -71995.41360747 +8 1 1 2 1 72004.19743669 -67024.52682028 -80796.04993438 +8 1 1 2 2 -1.73534187 -1561.91480305 -3081.73149777 +8 1 1 2 3 537.77387599 -0.36420755 3077.46812700 +8 1 1 2 4 -889.37342047 -3066.02772504 -95.12244326 +8 1 1 2 5 -1553.40948549 -0.25708768 3070.09828004 +8 1 1 2 6 -0.66414318 536.75623723 -3077.03964753 +8 1 1 2 7 -3061.31445083 -889.88759583 90.81622454 +8 1 1 2 8 -67035.52803078 72006.32912208 80811.48590744 +8 1 1 3 1 72007.81808825 -80795.24653537 -67033.79268891 +8 1 1 3 2 -2.84938850 -3080.14612371 -1557.04084903 +8 1 1 3 3 -1558.03706381 3077.63951879 -0.36420755 +8 1 1 3 4 -1.43540624 -3078.11084621 538.19164347 +8 1 1 3 5 536.18850193 3076.65401600 -1.92815763 +8 1 1 3 6 -891.54795380 -92.59441436 -3061.18590698 +8 1 1 3 7 -3061.95717004 91.85528727 -890.47675511 +8 1 1 3 8 -67028.22245575 80799.92767362 72006.51122585 +8 2 1 1 1 67015.53946331 -72016.08774210 -80797.22825294 +8 2 1 1 2 3066.00630107 889.36270848 -95.10101928 +8 2 1 1 3 0.56773530 -538.53442705 3077.36100713 +8 2 1 1 4 1561.95765100 1.71391790 -3081.75292174 +8 2 1 1 5 891.74076956 3053.51612440 86.08152635 +8 2 1 1 6 -536.68125333 0.59987126 -3076.99679958 +8 2 1 1 7 -0.47132742 1557.60858433 3076.34336838 +8 2 1 1 8 -71998.56293161 67051.78882682 80811.25024373 +8 2 1 2 1 -72012.35997067 74112.81991276 72011.38517987 +8 2 1 2 2 -1558.18703163 0.32135961 535.82429438 +8 2 1 2 3 537.31326055 0.57844729 -1558.31557547 +8 2 1 2 4 3064.61374278 -9472.95275777 -3065.77063736 +8 2 1 2 5 -3057.07250403 9458.64154334 3054.80156282 +8 2 1 2 6 -536.15636597 -0.12854384 1557.80140010 +8 2 1 2 7 1557.84424805 0.82482299 -537.75245201 +8 2 1 2 8 72004.04746888 -74100.13692033 -71998.05946823 +8 2 1 3 1 -80797.45320466 72014.82372765 67032.58223439 +8 2 1 3 2 -3078.13227018 -1.45683021 -538.22377943 +8 2 1 3 3 3077.35029514 -1559.83667760 0.17139179 +8 2 1 3 4 -3080.15683570 -2.84938850 1557.11583294 +8 2 1 3 5 89.76644983 -3058.55075822 892.24423294 +8 2 1 3 6 -92.59441436 -891.51581784 3061.20733096 +8 2 1 3 7 3077.14676739 536.03853412 0.64271921 +8 2 1 3 8 80804.09463651 -67036.59922946 -72005.72925081 +8 3 1 1 1 67029.59359006 -80803.52690121 -72004.05818086 +8 3 1 1 2 3063.39257627 -92.84079006 888.77354920 +8 3 1 1 3 888.89138106 90.30204917 3062.64273719 +8 3 1 1 4 -539.39138600 -3078.51790171 0.25708768 +8 3 1 1 5 -2.19595730 3073.89032339 -536.13494200 +8 3 1 1 6 1557.82282407 -3077.12534342 0.44990345 +8 3 1 1 7 -0.53559934 3076.69686395 1559.55816594 +8 3 1 1 8 -71997.62027676 80811.11098790 67028.44740747 +8 3 1 2 1 -80800.98816032 67031.39320385 72003.26549384 +8 3 1 2 2 -3079.37486066 -540.05552919 -0.84624696 +8 3 1 2 3 90.69839269 888.90209304 -3062.92124885 +8 3 1 2 4 -92.99075787 3063.47827217 -888.88066907 +8 3 1 2 5 3071.98358973 -2.93508440 -1560.71506052 +8 3 1 2 6 -3077.31815918 1557.71570420 -0.32135961 +8 3 1 2 7 3077.96087839 0.64271921 536.33846975 +8 3 1 2 8 80810.05050120 -71999.13066691 -67026.02649844 +8 3 1 3 1 -72000.85529679 72000.30898546 74100.67251967 +8 3 1 3 2 -1559.30107826 536.35989372 2.35663711 +8 3 1 3 3 -3063.00694475 3062.57846527 9469.46065006 +8 3 1 3 4 -536.34918173 1559.30107826 2.33521313 +8 3 1 3 5 536.88478108 -1558.65835905 3.66349950 +8 3 1 3 6 3061.34658679 -3061.33587480 -9465.43294300 +8 3 1 3 7 1557.71570420 -537.85957188 2.19595730 +8 3 1 3 8 72003.68326132 -72000.76960090 -74115.27295775 +8 1 2 1 1 9471.68874332 -0.47132742 -2.07812545 +8 1 2 1 2 3.08505221 0.09640788 6.97350344 +8 1 2 1 3 -9471.73159127 0.38563153 -1.94958161 +8 1 2 1 4 -0.10711987 0.81411100 -0.23566371 +8 1 2 1 5 -9463.46193742 -1.19974253 5.78447290 +8 1 2 1 6 0.09640788 0.79268703 0.17139179 +8 1 2 1 7 9463.48336139 -0.40705550 -1.92815763 +8 1 2 1 8 -3.14932413 0.06427192 -6.81282364 +8 1 2 2 1 -3065.94202915 -1561.07926808 -3079.54625245 +8 1 2 2 2 0.08569589 -6.93065549 11785.04942412 +8 1 2 2 3 3066.04914901 1561.10069205 -3079.43913258 +8 1 2 2 4 0.05355993 0.21423974 2915.20295015 +8 1 2 2 5 -3055.74421766 1560.37227694 -3077.10391945 +8 1 2 2 6 0.19281576 -0.79268703 574.37673506 +8 1 2 2 7 3059.08635756 -1555.20909928 -3074.10456313 +8 1 2 2 8 -3.74919540 2.42090903 -2964.73517736 +8 1 2 3 1 -3069.41271289 -3080.59602716 -1556.45168975 +8 1 2 3 2 8.52674154 11786.34557453 2.33521313 +8 1 2 3 3 -3069.39128891 -3080.68172306 1556.58023360 +8 1 2 3 4 -0.18210378 573.04844869 1.09262266 +8 1 2 3 5 3062.64273719 -3077.98230237 1554.78061981 +8 1 2 3 6 1.40327028 2915.95278923 0.81411100 +8 1 2 3 7 3057.86519106 -3072.88339663 -1559.85810157 +8 1 2 3 8 8.37677372 -2963.10695536 0.85695895 +8 2 2 1 1 3063.22118448 -1558.52981520 -3077.96087839 +8 2 2 1 2 -2.91366042 -3.08505221 -2956.56193139 +8 2 2 1 3 -3063.26403243 1558.46554328 -3077.96087839 +8 2 2 1 4 0.43919146 0.85695895 573.51977611 +8 2 2 1 5 3060.88597135 1552.57395051 -3072.51918907 +8 2 2 1 6 0.21423974 -0.36420755 2914.21744736 +8 2 2 1 7 -3059.55768498 -1557.71570420 -3075.56139334 +8 2 2 1 8 0.89980690 7.61622265 11772.99843891 +8 2 2 2 1 886.30979223 0.12854384 -1.11404663 +8 2 2 2 2 -2.39948506 -0.18210378 8.79454121 +8 2 2 2 3 -886.50260799 -0.19281576 -0.98550279 +8 2 2 2 4 0.01071199 -0.14996782 -0.36420755 +8 2 2 2 5 -891.28015412 0.49275140 3.34213990 +8 2 2 2 6 0.03213596 -0.21423974 0.32135961 +8 2 2 2 7 891.25873015 0.19281576 -1.07119869 +8 2 2 2 8 2.31378916 -0.20352775 -8.88023710 +8 2 2 3 1 -94.45830007 535.51364676 -538.23449142 +8 2 2 3 2 -2956.65833927 4.53117044 3.13861215 +8 2 2 3 3 -92.20878283 535.40652689 538.17021950 +8 2 2 3 4 2915.34220598 0.08569589 1.41398226 +8 2 2 3 5 -98.03610368 -531.78587534 -539.54135382 +8 2 2 3 6 3374.43653853 0.85695895 0.34278358 +8 2 2 3 7 -88.48101141 -538.72724282 536.11351802 +8 2 2 3 8 -2959.82908738 -5.74162495 -1.52110213 +8 3 2 1 1 3061.52869056 -3078.06799826 -1558.95829468 +8 3 2 1 2 -3.85631527 -2959.50772777 -0.19281576 +8 3 2 1 3 3061.65723440 -3078.04657429 1559.06541455 +8 3 2 1 4 -0.51417537 2913.70327199 -0.83553497 +8 3 2 1 5 -3056.62260058 -3070.33394376 1562.40755445 +8 3 2 1 6 1.06048670 574.80521454 -1.28543842 +8 3 2 1 7 -3059.12920551 -3075.51854539 -1557.24437678 +8 3 2 1 8 -3.98485911 11773.03057487 -2.94579638 +8 3 2 2 1 -90.73052865 -539.07002640 536.45630160 +8 3 2 2 2 -2962.01433270 7.06991132 -0.17139179 +8 3 2 2 3 -90.75195262 -539.04860242 -536.62769339 +8 3 2 2 4 3371.58715003 -0.87838292 0.62129524 +8 3 2 2 5 -84.79608793 542.19792656 534.24963231 +8 3 2 2 6 2914.01391961 0.04284795 1.22116650 +8 3 2 2 7 -92.20878283 535.19228715 -537.82743592 +8 3 2 2 8 -2965.24935273 -5.73091297 1.93886962 +8 3 2 3 1 885.32428943 0.17139179 2.37806108 +8 3 2 3 2 -0.70699113 0.55702332 -3.27786798 +8 3 2 3 3 -885.36713738 -0.17139179 2.42090903 +8 3 2 3 4 0.70699113 -0.85695895 -1.86388571 +8 3 2 3 5 -892.32992884 0.47132742 -7.34842298 +8 3 2 3 6 -0.66414318 -0.87838292 1.90673366 +8 3 2 3 7 892.30850486 0.12854384 2.44233300 +8 3 2 3 8 0.79268703 0.46061543 3.22430804 +8 1 3 1 1 0.55702332 537.13115677 -1558.27272752 +8 1 3 1 2 -9472.95275777 3064.60303079 -3065.70636543 +8 1 3 1 3 74113.75185562 -72013.62398512 72012.23142683 +8 1 3 1 4 0.29993563 -1558.20845560 535.81358239 +8 1 3 1 5 9458.70581526 -3057.30816774 3054.71586692 +8 1 3 1 6 -0.20352775 -536.13494200 1557.86567202 +8 1 3 1 7 0.19281576 1556.93372916 -538.43801917 +8 1 3 1 8 -74100.38329603 72006.41481797 -71998.22014803 +8 1 3 2 1 -538.53442705 0.54631133 3077.36100713 +8 1 3 2 2 1.69249392 1561.93622702 -3081.71007379 +8 1 3 2 3 -72015.61641468 67015.13240781 -80796.83190942 +8 1 3 2 4 889.36270848 3066.02772504 -95.12244326 +8 1 3 2 5 3053.54826036 891.73005757 86.12437430 +8 1 3 2 6 0.58915928 -536.64911737 -3076.99679958 +8 1 3 2 7 1557.56573639 -0.43919146 3076.37550434 +8 1 3 2 8 67051.25322748 -71998.26299598 80810.76820432 +8 1 3 3 1 -1559.83667760 3077.26459925 0.17139179 +8 1 3 3 2 -2.89223645 -3080.19968365 1557.07298499 +8 1 3 3 3 72014.64162387 -80797.36750877 67032.40013062 +8 1 3 3 4 -1.43540624 -3078.11084621 -538.17021950 +8 1 3 3 5 -3058.51862226 89.87356970 892.17996102 +8 1 3 3 6 -891.52652982 -92.57299038 3061.12163506 +8 1 3 3 7 536.00639816 3077.10391945 0.62129524 +8 1 3 3 8 -67036.44926165 80803.96609267 -72005.49358710 +8 2 3 1 1 -0.34278358 537.85957188 3077.48955097 +8 2 3 1 2 -3065.96345312 -889.34128450 -95.09030729 +8 2 3 1 3 -67024.46254836 72004.09031682 -80795.88925458 +8 2 3 1 4 -1561.93622702 -1.77818982 -3081.75292174 +8 2 3 1 5 -0.21423974 -1553.40948549 3070.05543210 +8 2 3 1 6 536.67054134 -0.51417537 -3076.97537560 +8 2 3 1 7 -889.95186776 -3061.34658679 90.85907249 +8 2 3 1 8 72006.31841009 -67035.52803078 80811.49661943 +8 2 3 2 1 -538.06309963 0.41776749 -1559.62243786 +8 2 3 2 2 1558.16560765 -0.31064762 535.81358239 +8 2 3 2 3 72002.70847052 -74116.87975578 72006.74688956 +8 2 3 2 4 -3064.59231880 9472.95275777 -3065.77063736 +8 2 3 2 5 -1557.61929632 0.77126305 -539.90556137 +8 2 3 2 6 536.15636597 0.14996782 1557.77997612 +8 2 3 2 7 3061.20733096 -9467.33967666 3060.54318777 +8 2 3 2 8 -71997.89878842 74110.20618797 -71995.68140714 +8 2 3 3 1 3077.16819137 -1558.17631964 -0.47132742 +8 2 3 3 2 -3078.00372634 -1.34971034 538.38445924 +8 2 3 3 3 -80797.09970910 72009.10352667 -67037.19910073 +8 2 3 3 4 -3080.25324358 -2.95650837 -1556.88016923 +8 2 3 3 5 3074.86511419 534.99947139 -0.66414318 +8 2 3 3 6 -93.24784556 -890.85167465 -3060.28610009 +8 2 3 3 7 91.56606362 -3061.77506626 -890.29465133 +8 2 3 3 8 80804.97301943 -67028.86517496 72007.52886460 +8 3 3 1 1 888.43076562 91.44823176 -3061.82862619 +8 3 3 1 2 3063.32830435 -93.13001370 -889.01992490 +8 3 3 1 3 67032.64650632 -80802.16647888 72006.93970533 +8 3 3 1 4 -539.95912130 -3079.31058874 -1.02835074 +8 3 3 1 5 -1.86388571 3072.69058086 -1561.14354000 +8 3 3 1 6 1558.31557547 -3077.85375853 -1.19974253 +8 3 3 1 7 0.70699113 3077.73592667 536.39202968 +8 3 3 1 8 -72001.77652766 80810.60752452 -67028.96158284 +8 3 3 2 1 91.22328004 888.34506973 3061.85005017 +8 3 3 2 2 -3079.50340450 -539.91627336 0.93194286 +8 3 3 2 3 -80801.08456820 67027.49404064 -72004.24028464 +8 3 3 2 4 -92.38017462 3064.37807907 889.48054033 +8 3 3 2 5 3074.74728234 -1.67106995 -536.88478108 +8 3 3 2 6 -3077.22175130 1557.88709599 0.27851166 +8 3 3 2 7 3076.97537560 -0.48203941 1559.30107826 +8 3 3 2 8 80807.32965654 -71996.03490271 67029.37935033 +8 3 3 3 1 3062.49276938 -3063.22118448 9469.54634595 +8 3 3 3 2 1559.30107826 -536.37060571 2.34592512 +8 3 3 3 3 72001.01597660 -72001.60513587 74101.21883100 +8 3 3 3 4 536.31704577 -1559.32250223 2.35663711 +8 3 3 3 5 -1558.56195116 536.71338929 3.49210771 +8 3 3 3 6 -3061.32516281 3061.33587480 -9465.49721492 +8 3 3 3 7 -538.47015513 1556.80518532 1.57466207 +8 3 3 3 8 -72000.74817693 72005.72925081 -74115.16583788 +8 1 4 1 1 -0.21423974 -886.43833607 -1.15689458 +8 1 4 1 2 0.06427192 0.35349557 -0.42847947 +8 1 4 1 3 0.17139179 886.35264017 -1.11404663 +8 1 4 1 4 -0.78197504 -1.49967816 8.18395796 +8 1 4 1 5 0.47132742 -891.25873015 3.42783579 +8 1 4 1 6 -0.21423974 0.10711987 0.47132742 +8 1 4 1 7 0.10711987 889.07348483 -1.15689458 +8 1 4 1 8 0.42847947 3.35285189 -8.22680590 +8 1 4 2 1 1558.44411931 -3063.32830435 -3077.96087839 +8 1 4 2 2 0.68556716 0.12854384 573.69116790 +8 1 4 2 3 -1558.48696726 3063.37115230 -3077.98230237 +8 1 4 2 4 -1.78890180 -4.64900229 -2955.24435701 +8 1 4 2 5 1552.63822244 3060.92881930 -3072.79770073 +8 1 4 2 6 -0.17139179 -0.17139179 2914.15317544 +8 1 4 2 7 -1557.71570420 -3055.25146627 -3075.56139334 +8 1 4 2 8 6.38434416 -0.83553497 11771.72371247 +8 1 4 3 1 535.55649471 -94.39402815 538.29876334 +8 1 4 3 2 -0.04284795 2914.96728644 1.04977471 +8 1 4 3 3 535.49222279 -92.27305475 -538.42730718 +8 1 4 3 4 5.79518489 -2958.47937704 0.66414318 +8 1 4 3 5 -531.87157123 -93.75130894 -539.45565792 +8 1 4 3 6 0.86767094 3374.01877104 0.72841511 +8 1 4 3 7 -538.85578666 -88.45958743 536.02782213 +8 1 4 3 8 -6.98421543 -2961.69297309 0.98550279 +8 2 4 1 1 1561.10069205 3065.96345312 -3079.41770861 +8 2 4 1 2 0.10711987 0.12854384 2915.32078200 +8 2 4 1 3 -1561.18638794 -3068.14869844 -3079.35343669 +8 2 4 1 4 -5.72020098 0.10711987 11785.07084809 +8 2 4 1 5 1560.35085297 -3053.62324426 -3076.99679958 +8 2 4 1 6 -0.61058325 0.25708768 574.61239877 +8 2 4 1 7 -1555.25194723 3059.04350961 -3074.12598710 +8 2 4 1 8 1.09262266 -3.71705944 -2964.77802531 +8 2 4 2 1 0.47132742 -9471.71016730 -1.94958161 +8 2 4 2 2 0.77126305 -0.53559934 -0.18210378 +8 2 4 2 3 -0.38563153 9473.85256467 -1.97100558 +8 2 4 2 4 -0.04284795 1.26401445 6.94136748 +8 2 4 2 5 -1.24259047 -9463.44051345 5.57023316 +8 2 4 2 6 0.70699113 -0.25708768 0.19281576 +8 2 4 2 7 -0.25708768 9465.62575876 -1.92815763 +8 2 4 2 8 -0.04284795 -4.90608998 -6.87709556 +8 2 4 3 1 -3080.63887511 -3065.02079828 1556.40884181 +8 2 4 3 2 573.30553638 -0.71770312 1.17831855 +8 2 4 3 3 -3080.70314703 -3067.27031552 -1556.49453770 +8 2 4 3 4 11784.49240080 5.87016880 2.97793235 +8 2 4 3 5 -3078.08942224 3062.59988925 1554.52353212 +8 2 4 3 6 2915.73854949 0.92123087 0.72841511 +8 2 4 3 7 -3073.03336444 3057.90803901 -1559.90094952 +8 2 4 3 8 -2961.09310183 5.68806502 0.24637570 +8 3 4 1 1 -539.07002640 -90.68768070 -536.49914955 +8 3 4 1 2 -0.81411100 3371.80138976 0.61058325 +8 3 4 1 3 -538.96290653 -90.77337659 536.54199750 +8 3 4 1 4 6.39505615 -2961.07167785 0.47132742 +8 3 4 1 5 542.26219848 -86.98133325 534.27105629 +8 3 4 1 6 0.03213596 2914.26029531 1.17831855 +8 3 4 1 7 535.19228715 -92.14451091 -537.80601195 +8 3 4 1 8 -5.07748177 -2964.37096980 1.25330246 +8 3 4 2 1 -3078.02515032 3061.59296248 1559.12968647 +8 3 4 2 2 2913.78896788 -0.72841511 -1.11404663 +8 3 4 2 3 -3078.15369416 3063.73535985 -1559.06541455 +8 3 4 2 4 -2960.10759904 -4.77754614 -2.14239737 +8 3 4 2 5 -3070.33394376 -3054.41593129 1562.49325034 +8 3 4 2 6 574.69809467 0.87838292 -0.92123087 +8 3 4 2 7 -3075.53996937 -3061.37872275 -1557.39434460 +8 3 4 2 8 11773.69471805 -5.00249786 -1.03906272 +8 3 4 3 1 -0.12854384 -885.32428943 2.46375698 +8 3 4 3 2 -0.96407882 0.49275140 -2.00314154 +8 3 4 3 3 0.12854384 885.28144149 2.44233300 +8 3 4 3 4 1.17831855 -1.60679803 -3.92058719 +8 3 4 3 5 0.42847947 -890.12325954 -7.41269490 +8 3 4 3 6 -0.76055107 -0.89980690 1.99242955 +8 3 4 3 7 0.08569589 892.20138499 2.48518095 +8 3 4 3 8 -0.08569589 -0.18210378 3.88845123 +8 1 5 1 1 0.89980690 -1553.73084509 534.31390423 +8 1 5 1 2 -9463.14057781 -3055.47641799 3062.18212176 +8 1 5 1 3 9459.57348619 3053.17334082 -3057.88661503 +8 1 5 1 4 0.58915928 1552.59537449 -531.52878765 +8 1 5 1 5 73992.05297298 71805.66147236 -71878.46013501 +8 1 5 1 6 0.73912709 533.97112065 -1553.53802933 +8 1 5 1 7 0.89980690 -533.97112065 1555.41262703 +8 1 5 1 8 -73991.61378152 -71802.12651670 71869.40850612 +8 1 5 2 1 -1558.10133573 0.33207159 3074.74728234 +8 1 5 2 2 -1.60679803 1560.40441290 -3078.28223800 +8 1 5 2 3 -3056.03344131 891.13018631 90.62340878 +8 1 5 2 4 -889.84474789 3059.66480485 -93.70846099 +8 1 5 2 5 71807.34325429 66823.92344248 -80589.70493163 +8 1 5 2 6 0.24637570 -533.22128157 -3079.95330795 +8 1 5 2 7 537.69889208 2.87081248 3077.29673521 +8 1 5 2 8 -66839.71291110 -71805.01875315 80599.04578417 +8 1 5 3 1 -539.34853805 3069.46627282 -0.25708768 +8 1 5 3 2 5.72020098 -3077.06107150 1555.13411537 +8 1 5 3 3 3053.65538023 86.57427775 891.32300207 +8 1 5 3 4 3.88845123 -3073.18333226 -539.41280997 +8 1 5 3 5 -71878.03165554 -80588.86939666 66908.24820299 +8 1 5 3 6 884.22095479 -109.09087411 3073.52611584 +8 1 5 3 7 1558.22987957 3080.91738677 -2.52802890 +8 1 5 3 8 66911.63319084 80611.27887315 -71885.91567786 +8 2 5 1 1 891.73005757 -3056.87968827 90.04496149 +8 2 5 1 2 3059.68622882 -889.63050815 -93.72988496 +8 2 5 1 3 0.14996782 -1558.27272752 3074.57589055 +8 2 5 1 4 1559.78311767 -0.74983908 -3077.72521468 +8 2 5 1 5 66823.27001128 71804.16179420 -80589.04078845 +8 2 5 1 6 -533.32840144 0.40705550 -3079.99615590 +8 2 5 1 7 2.95650837 537.54892426 3077.41456707 +8 2 5 1 8 -71804.31176201 -66836.57429896 80598.45662489 +8 2 5 2 1 3053.08764492 9459.57348619 -3057.89732702 +8 2 5 2 2 1552.59537449 0.64271921 -531.58234758 +8 2 5 2 3 -1553.75226907 0.89980690 534.27105629 +8 2 5 2 4 -3055.48712998 -9463.14057781 3062.23568169 +8 2 5 2 5 71805.51150454 73991.95656510 -71878.31016719 +8 2 5 2 6 533.93898469 0.74983908 -1553.45233344 +8 2 5 2 7 -533.97112065 0.86767094 1555.40191504 +8 2 5 2 8 -71801.89085298 -73991.48523768 71869.25853830 +8 2 5 3 1 86.53142980 3053.69822817 891.32300207 +8 2 5 3 2 -3073.26902815 3.67421149 -539.56277779 +8 2 5 3 3 3069.42342487 -539.28426613 -0.32135961 +8 2 5 3 4 -3076.40764030 4.82039408 1554.50210815 +8 2 5 3 5 -80588.73014083 -71875.71786638 66908.07681120 +8 2 5 3 6 -109.02660219 884.03885101 3073.52611584 +8 2 5 3 7 3080.91738677 1558.20845560 -2.51731691 +8 2 5 3 8 80610.55045805 66910.65840003 -71885.03729494 +8 3 5 1 1 -2.52802890 3071.37300648 537.61319618 +8 3 5 1 2 -3054.18026758 -87.31340484 -890.29465133 +8 3 5 1 3 -4.50974647 3074.68301042 -1558.12275970 +8 3 5 1 4 542.73352590 -3070.69815131 -0.12854384 +8 3 5 1 5 -66915.01817868 -80608.27951684 71898.53439837 +8 3 5 1 6 -1555.05913146 -3081.62437790 -1.45683021 +8 3 5 1 7 -885.45283328 101.12115589 -3068.78070566 +8 3 5 1 8 71873.93967656 80600.67400617 -66917.49264764 +8 3 5 2 1 3073.46184392 -2.67799671 -1556.92301718 +8 3 5 2 2 -3070.71957528 542.75494987 -0.11783186 +8 3 5 2 3 3071.61938218 -2.16382134 537.89170784 +8 3 5 2 4 -87.32411683 -3054.11599566 -890.35892326 +8 3 5 2 5 -80607.59394968 -66913.73274026 71897.91310314 +8 3 5 2 6 -3081.61366591 -1555.05913146 -1.41398226 +8 3 5 2 7 100.92834013 -885.08862572 -3068.98423341 +8 3 5 2 8 80601.08106167 71870.16905719 -66918.14607884 +8 3 5 3 1 -536.79908518 -1559.33321422 3.94201116 +8 3 5 3 2 1563.07169763 534.27105629 -6.56644794 +8 3 5 3 3 -1560.16874919 -535.94212623 3.38498785 +8 3 5 3 4 533.46765727 1563.95008055 -6.06298456 +8 3 5 3 5 71892.70707753 71890.86461579 -74116.34415644 +8 3 5 3 6 -3071.10520681 -3070.84811912 9448.22949211 +8 3 5 3 7 3064.97795033 3065.24575000 -9458.18092790 +8 3 5 3 8 -71886.12991760 -71888.13305914 74131.61944969 +8 1 6 1 1 -0.04284795 -0.00000000 -890.03756365 +8 1 6 1 2 0.19281576 0.17139179 0.84624696 +8 1 6 1 3 -0.02142397 -0.00000000 -889.95186776 +8 1 6 1 4 -0.17139179 -0.08569589 0.89980690 +8 1 6 1 5 0.08569589 0.02142397 883.43897975 +8 1 6 1 6 -2.02456552 -1.79961379 3.55637964 +8 1 6 1 7 0.04284795 0.02142397 887.55238270 +8 1 6 1 8 2.01385353 1.77818982 3.70634745 +8 1 6 2 1 536.37060571 536.41345366 -91.33039991 +8 1 6 2 2 0.79268703 -0.58915928 2915.63142962 +8 1 6 2 3 -536.43487763 -536.49914955 -93.53706920 +8 1 6 2 4 0.06427192 -0.21423974 3374.36155462 +8 1 6 2 5 533.32840144 -533.30697747 -112.60440580 +8 1 6 2 6 -0.91051888 -3.53495566 -2951.64512942 +8 1 6 2 7 -537.97740374 537.95597976 -89.35939433 +8 1 6 2 8 4.84181806 -0.34278358 -2951.55943353 +8 1 6 3 1 1557.65143228 -3076.63259203 -3060.73600354 +8 1 6 3 2 0.29993563 574.86948646 1.08191067 +8 1 6 3 3 1557.65143228 -3076.65401600 3058.65787809 +8 1 6 3 4 0.48203941 2914.26029531 0.89980690 +8 1 6 3 5 -1554.35214033 -3080.42463537 3070.95523899 +8 1 6 3 6 3.80275533 -2950.76674650 -1.62822200 +8 1 6 3 7 -1558.67978302 -3077.06107150 -3062.21425772 +8 1 6 3 8 -6.81282364 11772.46283957 -7.05919934 +8 2 6 1 1 -536.37060571 -536.37060571 -91.33039991 +8 2 6 1 2 -0.08569589 0.14996782 3374.37226661 +8 2 6 1 3 536.37060571 536.39202968 -93.36567741 +8 2 6 1 4 -0.79268703 0.59987126 2915.67427757 +8 2 6 1 5 -533.24270555 533.28555349 -112.56155785 +8 2 6 1 6 -4.83110607 0.34278358 -2951.62370545 +8 2 6 1 7 537.97740374 -537.93455579 -89.35939433 +8 2 6 1 8 0.92123087 3.57780361 -2951.58085750 +8 2 6 2 1 0.04284795 0.08569589 -890.05898762 +8 2 6 2 2 0.06427192 -0.01071199 1.28543842 +8 2 6 2 3 0.06427192 0.02142397 -894.49375018 +8 2 6 2 4 -0.02142397 -0.00000000 1.24259047 +8 2 6 2 5 -0.02142397 -0.02142397 883.31043591 +8 2 6 2 6 -3.10647619 -0.79268703 5.52738522 +8 2 6 2 7 -0.14996782 0.04284795 887.57380667 +8 2 6 2 8 3.08505221 0.72841511 5.51667323 +8 2 6 3 1 -3076.71828792 1557.60858433 3060.73600354 +8 2 6 3 2 2914.19602338 0.54631133 0.54631133 +8 2 6 3 3 -3076.63259203 1557.67285626 -3058.65787809 +8 2 6 3 4 574.83735050 0.27851166 0.70699113 +8 2 6 3 5 -3080.46748332 -1554.39498828 3071.25517462 +8 2 6 3 6 -2950.77745849 3.87773924 -3.47068374 +8 2 6 3 7 -3076.95395163 -1558.63693507 -3062.14998580 +8 2 6 3 8 11772.51639950 -6.94136748 -8.90166107 +8 3 6 1 1 1557.65143228 -3076.71828792 3060.65030764 +8 3 6 1 2 0.55702332 2914.23887133 -0.85695895 +8 3 6 1 3 1557.54431241 -3076.76113587 -3058.65787809 +8 3 6 1 4 0.35349557 574.82663851 -1.11404663 +8 3 6 1 5 -1554.35214033 -3080.48890729 -3071.16947873 +8 3 6 1 6 -6.86638357 11772.53782347 7.11275927 +8 3 6 1 7 -1558.74405494 -3076.95395163 3062.21425772 +8 3 6 1 8 3.77061937 -2950.79888246 1.56395008 +8 3 6 2 1 -3076.73971189 1557.63000831 -3060.82169943 +8 3 6 2 2 574.82663851 0.50346338 -0.94265484 +8 3 6 2 3 -3076.71828792 1557.56573639 3058.65787809 +8 3 6 2 4 2914.24958332 0.47132742 -0.72841511 +8 3 6 2 5 -3080.44605934 -1554.43783623 -3071.12663078 +8 3 6 2 6 11773.15911871 -6.17010443 7.94829424 +8 3 6 2 7 -3077.08249547 -1558.65835905 3064.46377496 +8 3 6 2 8 -2951.45231366 3.20288407 2.52802890 +8 3 6 3 1 -0.00000000 0.04284795 -9469.88912953 +8 3 6 3 2 -1.32828637 1.16760657 3.02078029 +8 3 6 3 3 0.06427192 0.08569589 -9469.99624940 +8 3 6 3 4 1.24259047 -1.26401445 3.06362824 +8 3 6 3 5 -0.00000000 -0.00000000 9444.75880837 +8 3 6 3 6 9.36227651 9.38370048 8.56958948 +8 3 6 3 7 0.04284795 -0.04284795 9471.86013511 +8 3 6 3 8 -9.44797240 -9.38370048 8.52674154 +8 1 7 1 1 -9466.50414169 -3061.52869056 -3062.05357792 +8 1 7 1 2 9464.89734366 3057.79020715 3056.56904065 +8 1 7 1 3 1.48896617 1556.53738565 536.11351802 +8 1 7 1 4 0.27851166 -1557.43719255 -538.85578666 +8 1 7 1 5 1.49967816 537.65604413 1557.05156102 +8 1 7 1 6 -0.21423974 -538.55585103 -1557.82282407 +8 1 7 1 7 -74105.07514627 -72009.16779859 -72003.50115755 +8 1 7 1 8 74103.76828387 72014.65233586 72012.37068266 +8 1 7 2 1 3061.52869056 -889.86617186 91.33039991 +8 1 7 2 2 -0.96407882 -1554.76990782 -3072.66915689 +8 1 7 2 3 1557.90851997 -1.13547061 3076.78255984 +8 1 7 2 4 890.31607531 -3057.11535198 -88.71667512 +8 1 7 2 5 -533.64976105 2.63514877 3080.18897166 +8 1 7 2 6 0.26779967 538.38445924 -3077.53239892 +8 1 7 2 7 -72007.32533685 -67050.01063700 -80809.16140629 +8 1 7 2 8 67031.95022717 72012.04932306 80799.74556985 +8 1 7 3 1 3061.31445083 90.62340878 -889.91973179 +8 1 7 3 2 -2.05670148 -3073.98673127 -1559.90094952 +8 1 7 3 3 -538.45944314 3076.67543997 -0.06427192 +8 1 7 3 4 -1.16760657 -3075.49712142 535.85643034 +8 1 7 3 5 1554.15932457 3075.79705705 -1.60679803 +8 1 7 3 6 888.75212523 -90.34489712 -3062.77128104 +8 1 7 3 7 -71999.11995492 -80808.28302337 -67021.20610436 +8 1 7 3 8 67036.64207741 80805.02657937 71999.40917857 +8 2 7 1 1 -1.17831855 1557.91923195 3076.72899991 +8 2 7 1 2 -3056.21554508 889.73762802 -89.32725837 +8 2 7 1 3 -889.86617186 3061.48584261 91.35182388 +8 2 7 1 4 -1554.59851603 -0.87838292 -3072.73342881 +8 2 7 1 5 2.64586075 -533.58548913 3080.08185179 +8 2 7 1 6 538.55585103 0.17139179 -3077.38243110 +8 2 7 1 7 -67052.13161040 -72007.22892897 -80809.03286245 +8 2 7 1 8 72012.72417823 67032.37870664 80800.28116919 +8 2 7 2 1 1557.43719255 0.70699113 535.59934265 +8 2 7 2 2 -1556.55880962 -0.34278358 -539.48779388 +8 2 7 2 3 -3060.69315559 -9467.40394858 -3061.40014672 +8 2 7 2 4 3057.98302291 9464.96161558 3056.45120879 +8 2 7 2 5 537.92384380 1.28543842 1557.15868089 +8 2 7 2 6 -538.36303526 -0.34278358 -1557.77997612 +8 2 7 2 7 -72011.18165212 -74105.65359356 -72003.56542947 +8 2 7 2 8 72013.43116936 74106.77835218 72013.15265770 +8 2 7 3 1 3076.69686395 -538.40588321 -0.02142397 +8 2 7 3 2 -3076.46120024 -0.52488736 536.60626942 +8 2 7 3 3 90.66625672 3061.31445083 -889.90901981 +8 2 7 3 4 -3074.16883505 -2.18524532 -1559.68670978 +8 2 7 3 5 3075.79705705 1554.15932457 -1.54252611 +8 2 7 3 6 -90.54842487 888.79497318 -3062.87840091 +8 2 7 3 7 -80806.51554554 -71999.59128235 -67021.60244787 +8 2 7 3 8 80804.48026804 67036.44926165 71999.11995492 +8 3 7 1 1 -1.26401445 3077.82162257 1557.54431241 +8 3 7 1 2 -3059.64338088 -90.82693653 890.85167465 +8 3 7 1 3 -0.21423974 3076.86825574 -538.14879553 +8 3 7 1 4 534.91377550 -3075.11148989 -0.02142397 +8 3 7 1 5 -885.99914461 100.47843668 3064.57089483 +8 3 7 1 6 -1558.97971865 -3077.06107150 0.40705550 +8 3 7 1 7 -67039.08441041 -80810.96102008 -71996.66690993 +8 3 7 1 8 72010.17472536 80798.69579514 67021.52746396 +8 3 7 2 1 3076.82540779 -0.20352775 -538.14879553 +8 3 7 2 2 -3076.88967971 536.22063789 1.25330246 +8 3 7 2 3 3077.88589449 -1.22116650 1557.52288844 +8 3 7 2 4 -91.19114408 -3059.79334869 891.04449041 +8 3 7 2 5 100.47843668 -885.94558467 3064.48519893 +8 3 7 2 6 -3077.50026296 -1558.80832686 0.29993563 +8 3 7 2 7 -80806.79405720 -67039.27722618 -71996.83830172 +8 3 7 2 8 80797.19611698 72009.09281468 67020.41341733 +8 3 7 3 1 1559.60101389 535.57791868 2.20666929 +8 3 7 3 2 -1557.86567202 -537.98811572 2.71013267 +8 3 7 3 3 536.44558962 1558.76547892 2.76369261 +8 3 7 3 4 -536.30633379 -1559.49389402 3.83489129 +8 3 7 3 5 -3070.79455919 -3071.12663078 -9457.31325697 +8 3 7 3 6 3063.01765673 3062.55704130 9469.35353019 +8 3 7 3 7 -71994.68519237 -71990.52894147 -74108.67437385 +8 3 7 3 8 72000.57678514 72002.17287118 74085.15085072 +8 1 8 1 1 74108.80291769 -67033.86767282 -67025.90866658 +8 1 8 1 2 -3.74919540 -3.32071592 4.95964991 +8 1 8 1 3 -74100.09407238 67048.96086229 -67036.34214178 +8 1 8 1 4 -0.42847947 6.79139966 -9.49082035 +8 1 8 1 5 -73987.00762717 -66833.67135052 66912.89720528 +8 1 8 1 6 -0.13925583 4.88466601 -7.49839080 +8 1 8 1 7 74102.84705300 67030.41841305 67035.75298250 +8 1 8 1 8 -120.25276441 -220.12061784 125.99438937 +8 1 8 2 1 -71998.26299598 72006.72546559 80806.82619316 +8 1 8 2 2 2.37806108 0.43919146 -2960.32183877 +8 1 8 2 3 72005.60070697 -71997.25606921 80805.87282633 +8 1 8 2 4 3.72777142 -0.89980690 -2960.27899083 +8 1 8 2 5 -71805.23299288 -71800.56256662 80610.40049023 +8 1 8 2 6 2.89223645 1.84246174 11771.35950492 +8 1 8 2 7 72008.63219925 72013.14194571 80808.95787854 +8 1 8 2 8 -219.87424215 -223.70913344 -328883.09457524 +8 1 8 3 1 -71993.87108137 80814.38885588 72003.47973357 +8 1 8 3 2 -7.36984695 -2964.74588934 1.69249392 +8 1 8 3 3 -71999.11995492 80816.26345358 -72004.30455656 +8 1 8 3 4 -9.12661280 11771.27380902 1.07119869 +8 1 8 3 5 71865.80927854 80595.91788401 -71885.10156686 +8 1 8 3 6 4.52045845 -2952.73775208 -7.06991132 +8 1 8 3 7 72012.25285081 80801.49162371 72004.78659597 +8 1 8 3 8 127.02274010 -328881.83056079 -114.39330760 +8 2 8 1 1 -71998.07018021 72006.52193784 80806.55839349 +8 2 8 1 2 2.42090903 0.42847947 -2960.30041480 +8 2 8 1 3 72005.90064260 -71997.38461305 80806.12991401 +8 2 8 1 4 3.69563546 -0.92123087 -2960.30041480 +8 2 8 1 5 -71805.11516103 -71800.51971867 80610.42191421 +8 2 8 1 6 2.82796453 1.64964598 11771.55232068 +8 2 8 1 7 72008.50365541 72013.13123373 80808.89360662 +8 2 8 1 8 -220.30272162 -223.11997416 -328883.21240709 +8 2 8 2 1 67049.81782124 -74100.98316729 -67035.01385541 +8 2 8 2 2 5.20602561 0.99621478 -8.11968603 +8 2 8 2 3 -67033.01071387 74108.03165464 -67027.08698514 +8 2 8 2 4 -3.77061937 -4.13482693 5.03463382 +8 2 8 2 5 -66833.22144707 -73986.87908333 66912.57584568 +8 2 8 2 6 3.31000394 1.19974253 -7.77690246 +8 2 8 2 7 67035.07812733 74102.60067731 67035.88152634 +8 2 8 2 8 -223.36634986 -120.74551581 124.91247869 +8 2 8 3 1 80814.65665555 -71997.99519630 -72003.32976576 +8 2 8 3 2 11772.19503989 -9.80146797 1.74605386 +8 2 8 3 3 80814.47455177 -71994.53522455 72004.13316477 +8 2 8 3 4 -2964.61734550 -7.30557503 1.75676584 +8 2 8 3 5 80593.21846332 71865.81999052 -71885.20868673 +8 2 8 3 6 -2952.57707228 4.43476256 -7.13418324 +8 2 8 3 7 80799.57417806 72010.67818874 72003.22264589 +8 2 8 3 8 -328876.91375882 128.64025012 -115.12172271 +8 3 8 1 1 -71993.91392931 80810.03978921 72003.31905377 +8 3 8 1 2 -7.45554285 -2964.12459411 1.36042233 +8 3 8 1 3 -71999.54843440 80816.67050908 -72004.69018809 +8 3 8 1 4 -8.52674154 11773.97322971 -0.85695895 +8 3 8 1 5 71865.78785456 80595.98215593 -71885.25153468 +8 3 8 1 6 4.70256223 -2952.24500069 -6.83424761 +8 3 8 1 7 72012.25285081 80799.44563422 72004.86157988 +8 3 8 1 8 126.80850037 -328879.72029938 -112.21877427 +8 3 8 2 1 80814.24960005 -71997.29891716 -72002.78345443 +8 3 8 2 2 11773.09484679 -10.47632314 1.11404663 +8 3 8 2 3 80814.34600793 -71994.23528892 72004.04746888 +8 3 8 2 4 -2964.47808967 -7.15560722 1.56395008 +8 3 8 2 5 80594.00043836 71866.80549331 -71885.93710183 +8 3 8 2 6 -2952.52351235 4.39191461 -7.06991132 +8 3 8 2 7 80797.49605261 72010.98883636 72003.52258152 +8 3 8 2 8 -328876.37815948 126.85134831 -114.42544356 +8 3 8 3 1 67028.69378317 -67026.93701732 -74118.22946612 +8 3 8 3 2 -4.45618653 2.31378916 3.62065156 +8 3 8 3 3 -67026.84060944 67028.80090304 -74118.52940176 +8 3 8 3 4 1.44611823 -3.64207553 3.06362824 +8 3 8 3 5 -66906.88778066 -66906.98418854 74137.23253080 +8 3 8 3 6 1.30686240 1.67106995 3.85631527 +8 3 8 3 7 67020.44555329 67018.21746002 74090.72108389 +8 3 8 3 8 -113.37566885 -113.37566885 -1.74605386 diff --git a/examples/USER/phonon/third_order_command/silicon_input_file.lmp b/examples/USER/phonon/third_order_command/silicon_input_file.lmp new file mode 100755 index 0000000000..5066049895 --- /dev/null +++ b/examples/USER/phonon/third_order_command/silicon_input_file.lmp @@ -0,0 +1,29 @@ +LAMMPS description + + 8 atoms + 0 bonds + 0 angles + 0 dihedrals + 0 impropers + + 1 atom types + 0 bond types + 0 angle types + 0 dihedral types + 0 improper types + + + 0.0000000 5.4310000 xlo xhi + 0.0000000 5.4310000 ylo yhi + 0.0000000 5.4310000 zlo zhi + + Atoms + + 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 + 2 2 1 0.0000000 1.3577500 1.3577500 1.3572000 + 3 3 1 0.0000000 2.7155000 2.7155000 0.0000000 + 4 4 1 0.0000000 4.0732500 4.0732500 1.3572000 + 5 5 1 0.0000000 2.7155000 0.0000000 2.7144000 + 6 6 1 0.0000000 4.0732500 1.3577500 4.0732500 + 7 7 1 0.0000000 0.0000000 2.7155000 2.7155000 + 8 8 1 0.0000000 1.3577500 4.0732500 4.0732500 diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index d1b53eee01..3271a6ee37 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -244,7 +244,8 @@ void DynamicalMatrix::calculateMatrix() { int local_idx; // local index int local_jdx; // second local index - int natoms = atom->natoms; + int nlocal = atom->nlocal; + bigint natoms = atom->natoms; int *mask = atom->mask; int *type = atom->type; double imass; // dynamical matrix element @@ -262,13 +263,14 @@ void DynamicalMatrix::calculateMatrix() for (int i=1; i<=natoms; i++){ local_idx = atom->map(i); + //if (screen) fprintf(screen, "local idx = %i on proc %i with %i local\n",local_idx, comm->me, nlocal); if (local_idx >= 0){ for (int alpha=0; alpha<3; alpha++){ displace_atom(local_idx, alpha, 1); energy_force(0); for (int j=1; j<=natoms; j++){ local_jdx = atom->map(j); - if (local_jdx >= 0){ + if (local_jdx >= 0 && local_idx < nlocal){ for (int beta=0; beta<3; beta++){ dynmat[(i-1)*3+alpha][(j-1)*3+beta] += -f[j-1][beta]; } @@ -278,7 +280,7 @@ void DynamicalMatrix::calculateMatrix() energy_force(0); for (int j=1; j<=natoms; j++){ local_jdx = atom->map(j); - if (local_jdx >= 0){ + if (local_jdx >= 0 && local_idx < nlocal){ for (int beta=0; beta<3; beta++){ if (atom->rmass_flag == 1) imass = sqrt(m[i] * m[j]); @@ -365,31 +367,31 @@ void DynamicalMatrix::displace_atom(int local_idx, int direction, int magnitude) void DynamicalMatrix::energy_force(int resetflag) { - // check for reneighboring - // always communicate since atoms move - int nflag = neighbor->check_distance(); - - if (nflag == 0) { - //if (comm->me == 0 && screen) fprintf(screen,"b\n"); - timer->stamp(); - comm->forward_comm(); - timer->stamp(Timer::COMM); - //if (comm->me == 0 && screen) fprintf(screen,"c\n"); - } else { - if (triclinic) domain->x2lamda(atom->nlocal); - domain->pbc(); - if (domain->box_change) { - domain->reset_box(); - comm->setup(); - if (neighbor->style) neighbor->setup_bins(); - } - timer->stamp(); - comm->borders(); - if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - timer->stamp(Timer::COMM); - neighbor->build(1); - timer->stamp(Timer::NEIGH); - } + //// check for reneighboring + //// always communicate since atoms move + //int nflag = neighbor->check_distance(); +// + //if (nflag == 0) { + ////if (comm->me == 0 && screen) fprintf(screen,"b\n"); + // timer->stamp(); + // comm->forward_comm(); + // timer->stamp(Timer::COMM); + ////if (comm->me == 0 && screen) fprintf(screen,"c\n"); + //} else { + // if (triclinic) domain->x2lamda(atom->nlocal); + // domain->pbc(); + // if (domain->box_change) { + // domain->reset_box(); + // comm->setup(); + // if (neighbor->style) neighbor->setup_bins(); + // } + // timer->stamp(); + // comm->borders(); + // if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); + // timer->stamp(Timer::COMM); + // neighbor->build(1); + // timer->stamp(Timer::NEIGH); + //} force_clear(); if (pair_compute_flag) { From 562bc4e5841be3785b8332e83e854f5bf98a2485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Sat, 2 Feb 2019 13:05:26 +0100 Subject: [PATCH 0097/1242] Update install.py --- python/install.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python/install.py b/python/install.py index 9308506fd2..4c1560101e 100644 --- a/python/install.py +++ b/python/install.py @@ -36,7 +36,10 @@ if pydir: str = "cp ../src/liblammps.so %s" % pydir print(str) try: - shutil.copyfile("../src/liblammps.so", os.path.join(pydir,"liblammps.so") ) + if sys.platform == 'darwin': + shutil.copyfile("../src/liblammps.dylib", os.path.join(pydir,"liblammps.dylib") ) + else: + shutil.copyfile("../src/liblammps.so", os.path.join(pydir,"liblammps.so") ) except shutil.Error: pass # source and destination are identical sys.exit() From 7c2a61ad4c4a65fa94f21fac1ef4693f666fb6c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Sat, 2 Feb 2019 17:55:09 +0100 Subject: [PATCH 0098/1242] Define lib_ext --- python/install.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/python/install.py b/python/install.py index 4c1560101e..2cd6562557 100644 --- a/python/install.py +++ b/python/install.py @@ -22,6 +22,11 @@ else: pydir = "" # copy lammps.py to pydir if it exists # if pydir not specified, install in site-packages via distutils setup() +if sys.platform == 'darwin': + lib_ext = ".dylib" +else: + lib_ext = ".so" + if pydir: if not os.path.isdir(pydir): print( "ERROR: pydir %s does not exist" % pydir) @@ -36,10 +41,7 @@ if pydir: str = "cp ../src/liblammps.so %s" % pydir print(str) try: - if sys.platform == 'darwin': - shutil.copyfile("../src/liblammps.dylib", os.path.join(pydir,"liblammps.dylib") ) - else: - shutil.copyfile("../src/liblammps.so", os.path.join(pydir,"liblammps.so") ) + shutil.copyfile("../src/liblammps" + lib_ext, os.path.join(pydir,"liblammps" + lib_ext) ) except shutil.Error: pass # source and destination are identical sys.exit() @@ -68,7 +70,7 @@ try: url = "http://lammps.sandia.gov", description = "LAMMPS molecular dynamics library", py_modules = ["lammps"], - data_files = [(get_python_lib(), ["../src/liblammps.so"])]) + data_files = [(get_python_lib(), ["../src/liblammps" + lib_ext])]) except: tryuser=True print ("Installation into global site-packages dir failed.\nTrying user site dir %s now." % site.USER_SITE) @@ -84,7 +86,7 @@ if tryuser: url = "http://lammps.sandia.gov", description = "LAMMPS molecular dynamics library", py_modules = ["lammps"], - data_files = [(site.USER_SITE, ["../src/liblammps.so"])]) + data_files = [(site.USER_SITE, ["../src/liblammps" + lib_ext])]) except: print("Installation into user site package dir failed.\nGo to ../python and install manually.") From 5c3e3f381bba628d781aa328b53745cc1ffff909 Mon Sep 17 00:00:00 2001 From: charlie sievers Date: Sun, 3 Feb 2019 09:13:37 -0800 Subject: [PATCH 0099/1242] added a groupmap --- src/USER-PHONON/dynamical_matrix.cpp | 124 ++++++++++++++++++--------- src/USER-PHONON/dynamical_matrix.h | 2 + 2 files changed, 85 insertions(+), 41 deletions(-) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index 3271a6ee37..a7d8620d00 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -40,6 +40,7 @@ DynamicalMatrix::DynamicalMatrix(LAMMPS *lmp) : Pointers(lmp), fp(NULL) DynamicalMatrix::~DynamicalMatrix() { if (fp && me == 0) fclose(fp); + memory->destroy(groupmap); memory->destroy(dynmat); memory->destroy(final_dynmat); fp = NULL; @@ -97,6 +98,13 @@ void DynamicalMatrix::setup() //modify->setup_pre_reverse(eflag,vflag); if (force->newton) comm->reverse_comm(); + + //if all then skip communication groupmap population + if (group->count(igroup) == atom->natoms) + for (int i=0; inatoms; i++) + groupmap[i] = i; + else + create_groupmap(); } /* ---------------------------------------------------------------------- */ @@ -126,6 +134,7 @@ void DynamicalMatrix::command(int narg, char **arg) if (igroup == -1) error->all(FLERR,"Could not find dynamical matrix group ID"); groupbit = group->bitmask[igroup]; dynlen = (group->count(igroup))*3; + memory->create(groupmap,atom->natoms,"total_group_map:totalgm"); memory->create(dynmat,int(dynlen),int(dynlen),"dynamic_matrix:dynmat"); update->setupflag = 1; @@ -246,8 +255,8 @@ void DynamicalMatrix::calculateMatrix() int local_jdx; // second local index int nlocal = atom->nlocal; bigint natoms = atom->natoms; - int *mask = atom->mask; int *type = atom->type; + int *gm = groupmap; double imass; // dynamical matrix element double *m = atom->mass; double **f = atom->f; @@ -263,16 +272,15 @@ void DynamicalMatrix::calculateMatrix() for (int i=1; i<=natoms; i++){ local_idx = atom->map(i); - //if (screen) fprintf(screen, "local idx = %i on proc %i with %i local\n",local_idx, comm->me, nlocal); if (local_idx >= 0){ for (int alpha=0; alpha<3; alpha++){ displace_atom(local_idx, alpha, 1); energy_force(0); for (int j=1; j<=natoms; j++){ local_jdx = atom->map(j); - if (local_jdx >= 0 && local_idx < nlocal){ + if (local_jdx >= 0 && local_idx < nlocal && gm[i-1] >= 0 && gm[j-1] >= 0){ for (int beta=0; beta<3; beta++){ - dynmat[(i-1)*3+alpha][(j-1)*3+beta] += -f[j-1][beta]; + dynmat[(gm[i-1])*3+alpha][(gm[j-1])*3+beta] += -f[j-1][beta]; } } } @@ -280,21 +288,15 @@ void DynamicalMatrix::calculateMatrix() energy_force(0); for (int j=1; j<=natoms; j++){ local_jdx = atom->map(j); - if (local_jdx >= 0 && local_idx < nlocal){ + if (local_jdx >= 0 && local_idx < nlocal && gm[i-1] >= 0 && gm[j-1] >= 0){ for (int beta=0; beta<3; beta++){ if (atom->rmass_flag == 1) - imass = sqrt(m[i] * m[j]); + imass = sqrt(m[local_idx] * m[local_jdx]); else - imass = sqrt(m[type[i]] * m[type[j]]); - //dynmat has length dynlen - //dynlen = (group->count(igroup))*3; - //currently dynmat is being called to natoms*3 - //Also with this implementation - //I am not recovering the correct dynamical matrix - //if I have more than 1 core - dynmat[(i-1)*3+alpha][(j-1)*3+beta] -= -f[j-1][beta]; - dynmat[(i-1)*3+alpha][(j-1)*3+beta] /= (2 * del * imass); - dynmat[(i-1)*3+alpha][(j-1)*3+beta] *= conversion; + imass = sqrt(m[type[local_idx]] * m[type[local_jdx]]); + dynmat[(gm[i-1])*3+alpha][(gm[j-1])*3+beta] -= -f[j-1][beta]; + dynmat[(gm[i-1])*3+alpha][(gm[j-1])*3+beta] /= (2 * del * imass); + dynmat[(gm[i-1])*3+alpha][(gm[j-1])*3+beta] *= conversion; } } } @@ -367,31 +369,6 @@ void DynamicalMatrix::displace_atom(int local_idx, int direction, int magnitude) void DynamicalMatrix::energy_force(int resetflag) { - //// check for reneighboring - //// always communicate since atoms move - //int nflag = neighbor->check_distance(); -// - //if (nflag == 0) { - ////if (comm->me == 0 && screen) fprintf(screen,"b\n"); - // timer->stamp(); - // comm->forward_comm(); - // timer->stamp(Timer::COMM); - ////if (comm->me == 0 && screen) fprintf(screen,"c\n"); - //} else { - // if (triclinic) domain->x2lamda(atom->nlocal); - // domain->pbc(); - // if (domain->box_change) { - // domain->reset_box(); - // comm->setup(); - // if (neighbor->style) neighbor->setup_bins(); - // } - // timer->stamp(); - // comm->borders(); - // if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - // timer->stamp(Timer::COMM); - // neighbor->build(1); - // timer->stamp(Timer::NEIGH); - //} force_clear(); if (pair_compute_flag) { @@ -489,3 +466,68 @@ void DynamicalMatrix::convert_units(const char *style) } else error->all(FLERR,"Units Type Conversion Not Found"); } + +/* ---------------------------------------------------------------------- */ + +void DynamicalMatrix::create_groupmap() +{ + //Create a group map which maps atom order onto group + + int local_idx; // local index + int gid = 0; //group index + int nlocal = atom->nlocal; + int *mask = atom->mask; + bigint natoms = atom->natoms; + int *recv = new int[comm->nprocs]; + int *displs = new int[comm->nprocs]; + int *temp_groupmap = new int[natoms]; + + //find number of local atoms in the group (final_gid) + for (int i=1; i<=natoms; i++){ + local_idx = atom->map(i); + if (mask[local_idx] & groupbit && local_idx < nlocal) + gid += 1; // gid at the end of loop is final_Gid + } + //create an array of length final_gid + int *sub_groupmap = new int[gid]; + + gid = 0; + //create a map between global atom id and group atom id for each proc + for (int i=1; i<=natoms; i++){ + local_idx = atom->map(i); + if (mask[local_idx] & groupbit && local_idx < nlocal){ + sub_groupmap[gid] = i; + gid += 1; + } + } + + //populate arrays for Allgatherv + for (int i=0; inprocs; i++){ + recv[i] = 0; + } + recv[comm->me] = gid; + MPI_Allreduce(recv,displs,4,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]; + else displs[i] = 0; + } + + //combine subgroup maps into total temporary groupmap + MPI_Allgatherv(sub_groupmap,gid,MPI_INT,temp_groupmap,recv,displs,MPI_INT,world); + std::sort(temp_groupmap,temp_groupmap+group->count(igroup)); + + //populate member groupmap based on temp groupmap + for (int i=0; i Date: Sun, 3 Feb 2019 12:43:48 -0600 Subject: [PATCH 0100/1242] Some adjustments to kim Install.py --- lib/kim/Install.py | 165 +++++++++++++++++++++------------------------ 1 file changed, 77 insertions(+), 88 deletions(-) diff --git a/lib/kim/Install.py b/lib/kim/Install.py index e7e2128f48..544fe2b65d 100644 --- a/lib/kim/Install.py +++ b/lib/kim/Install.py @@ -1,46 +1,43 @@ #!/usr/bin/env python -# install.py tool to download, compile, and setup the kim-api library -# used to automate the steps described in the README file in this dir +""" +Install.py tool to download, compile, and setup the kim-api library +used to automate the steps described in the README file in this dir +""" from __future__ import print_function -import sys,os,re,subprocess,shutil +import sys, os, subprocess, shutil +from argparse import ArgumentParser + sys.path.append('..') -from install_helpers import error,fullpath,which,geturl +from install_helpers import fullpath, geturl + +parser = ArgumentParser(prog='Install.py', + description="LAMMPS library build wrapper script") + +# settings + +thisdir = fullpath('.') +version = "kim-api-v2-2.0.0-beta.3" # help message -help = """ -Syntax from src dir: make lib-kim args="-b -v version -a kim-name" +HELP = """ +Syntax from src dir: make lib-kim args="-b -v version -a kim-name" or: make lib-kim args="-b -a everything" or: make lib-kim args="-n -a kim-name" - or: make lib-kim args="-p /home/bob/kim -a kim-name" -Syntax from lib dir: python Install.py -b -v version -a kim-name + or: make lib-kim args="-p /usr/local/open-kim -a kim-name" +Syntax from lib dir: python Install.py -b -v version -a kim-name or: python Install.py -b -a everything or: python Install.py -n -a kim-name - or: python Install.py -p /home/bob/kim -a kim-name - -specify one or more options, order does not matter - - -v = version of KIM API library to use - default = kim-api-v2.0.0-beta.3 (current as of December 2018) - -b = download and build base KIM API library with example Models - this will delete any previous installation in the current folder - -n = do NOT download and build base KIM API library. - Use an existing installation - -p = specify install prefix of KIM API installation (implies -n) - -a = add single KIM model or model driver with kim-name - to existing KIM API lib (see example below). - If kim-name = everything, then rebuild KIM API library with - *all* available OpenKIM Models (make take a long time). - -vv = be more verbose about what is happening while the script runs + or: python Install.py -p /usr/local/open-kim -a kim-name Examples: make lib-kim args="-b" # install KIM API lib with only example models -make lib-kim args="-a EAM_ErcolessiAdams_1994_Al__MO_324507536345_002" # Ditto plus one model +make lib-kim args="-b -a Glue_Ercolessi_Adams_Al__MO_324507536345_001" # Ditto plus one model 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 +make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # only add one model or model driver See the list of KIM model drivers here: https://openkim.org/kim-items/model-drivers/alphabetical @@ -53,62 +50,49 @@ https://openkim.org/kim-api in the "What is in the KIM API source package?" section """ -# parse args +pgroup = parser.add_mutually_exclusive_group() +pgroup.add_argument("-b", "--build", action="store_true", + help="download and build base KIM API library with example Models.") +pgroup.add_argument("-n", "--nobuild", action="store_true", + help="use the previously downloaded and compiled base KIM API.") +pgroup.add_argument("-p", "--path", + help="specify location of existing KIM API installation.") +parser.add_argument("-v", "--version", default=version, + help="set version of KIM API library to download and build (default: %s)" % version) +parser.add_argument("-a", "--add", + help="add single KIM model or model driver. If adding 'everything', then all available OpenKIM models are added (may take a long time)") +parser.add_argument("-vv", "--verbose", action="store_true", + help="be more verbose about is happening while this script runs") -args = sys.argv[1:] -nargs = len(args) -if nargs == 0: error(help=help) +args = parser.parse_args() -thisdir = fullpath('.') -version = "kim-api-v2-2.0.0-beta.3" +# print help message and exit, if neither build nor path options are given +if not args.build and not args.path and not args.nobuild: + parser.print_help() + sys.exit(HELP) -buildflag = False +buildflag = args.build +pathflag = args.path is not None +addflag = args.add is not None +addmodelname = args.add everythingflag = False -addflag = False -verboseflag = False -pathflag = False +if addflag and addmodelname == "everything": + everythingflag = True + buildflag = True +verboseflag = args.verbose -iarg = 0 -while iarg < len(args): - if args[iarg] == "-v": - if iarg+2 > len(args): error(help=help) - version = args[iarg+1] - iarg += 2 - elif args[iarg] == "-b": - buildflag = True - iarg += 1 - elif args[iarg] == "-n": - buildflag = False - iarg += 1 - elif args[iarg] == "-p": - if iarg+2 > len(args): error(help=help) - kimdir = fullpath(args[iarg+1]) - pathflag = True - buildflag = False - iarg += 2 - elif args[iarg] == "-a": - addflag = True - if iarg+2 > len(args): error(help=help) - addmodelname = args[iarg+1] - if addmodelname == "everything": - buildflag = True - everythingflag = True - addflag = False - iarg += 2 - elif args[iarg] == "-vv": - verboseflag = True - iarg += 1 - else: error(help=help) +if pathflag: + buildflag = False + kimdir = args.path + if not os.path.isdir(kimdir): + sys.exit("KIM API path %s does not exist" % kimdir) + kimdir = fullpath(kimdir) url = "https://s3.openkim.org/kim-api/%s.txz" % version # set KIM API directory if pathflag: - if not os.path.isdir(kimdir): - print("\nkim-api is not installed at %s" % kimdir) - error(help=help) - # configure LAMMPS to use existing kim-api installation with open("%s/kim-prefix.txt" % thisdir, 'w') as pffile: pffile.write("%s" % kimdir) @@ -116,6 +100,8 @@ if pathflag: print("Created %s/kim-prefix.txt\n using %s" % (thisdir,kimdir)) else: kimdir = os.path.join(os.path.abspath(thisdir), "installed-" + version) + if args.nobuild and not os.path.isdir(kimdir): + sys.exit("Cannot use -n/--nobuild without first building the KIM API with -b") # download KIM tarball, unpack, build KIM if buildflag: @@ -136,10 +122,10 @@ if buildflag: # download entire kim-api tarball print("Downloading kim-api tarball ...") - geturl(url,"%s/%s.txz" % (thisdir,version)) + geturl(url, "%s/%s.txz" % (thisdir, version)) print("Unpacking kim-api tarball ...") - cmd = 'cd "%s"; rm -rf "%s"; tar -xJvf %s.txz' % (thisdir,version,version) - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'cd "%s"; rm -rf "%s"; tar -xJvf %s.txz' % (thisdir, version, version) + subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) # configure kim-api @@ -150,29 +136,32 @@ if buildflag: # build kim-api print("Building kim-api ...") - cmd = 'cd "%s/%s/build" && make' % (thisdir,version) - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - if verboseflag: print(txt.decode("UTF-8")) + cmd = 'cd "%s/%s/build" && make' % (thisdir, version) + txt = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) + if verboseflag: + print(txt.decode("UTF-8")) # install kim-api print("Installing kim-api ...") - cmd = 'cd "%s/%s/build" && make install' % (thisdir,version) - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - if verboseflag: print(txt.decode("UTF-8")) + cmd = 'cd "%s/%s/build" && make install' % (thisdir, version) + txt = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) + if verboseflag: + print(txt.decode("UTF-8")) # remove source files print("Removing kim-api source and build files ...") - cmd = 'cd "%s"; rm -rf %s; rm -rf %s.txz' % (thisdir,version,version) - subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) + cmd = 'cd "%s"; rm -rf %s; rm -rf %s.txz' % (thisdir, version, version) + subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) # 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) - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - if verboseflag: print(txt.decode("UTF-8")) + txt = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) + if verboseflag: + print(txt.decode("UTF-8")) # add single OpenKIM model if addflag: @@ -183,10 +172,10 @@ if addflag: kimdir = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) if not os.path.isdir(kimdir): - print("\nkim-api is not installed") - error(help=help) + 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) - txt = subprocess.check_output(cmd,stderr=subprocess.STDOUT,shell=True) - if verboseflag: print (txt.decode("UTF-8")) + txt = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True) + if verboseflag: + print(txt.decode("UTF-8")) From b9d8b5f501d94034632333d988c1adb686ba3f49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Mon, 4 Feb 2019 09:23:29 +0100 Subject: [PATCH 0101/1242] lib extension for Mac Os X --- python/lammps.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/python/lammps.py b/python/lammps.py index c393ee7ec7..3d5fc7a6b2 100644 --- a/python/lammps.py +++ b/python/lammps.py @@ -85,14 +85,19 @@ class lammps(object): # fall back to loading with a relative path, # typically requires LD_LIBRARY_PATH to be set appropriately + if sys.platform == 'darwin': + lib_ext = ".dylib" + else: + lib_ext = ".so" + if not self.lib: try: - if not name: self.lib = CDLL(join(modpath,"liblammps.so"),RTLD_GLOBAL) - else: self.lib = CDLL(join(modpath,"liblammps_%s.so" % name), + if not name: self.lib = CDLL(join(modpath,"liblammps" + lib_ext),RTLD_GLOBAL) + else: self.lib = CDLL(join(modpath,"liblammps_%s" % name + lib_ext), RTLD_GLOBAL) except: - if not name: self.lib = CDLL("liblammps.so",RTLD_GLOBAL) - else: self.lib = CDLL("liblammps_%s.so" % name,RTLD_GLOBAL) + if not name: self.lib = CDLL("liblammps" + lib_ext,RTLD_GLOBAL) + else: self.lib = CDLL("liblammps_%s" % name + lib_ext,RTLD_GLOBAL) # define ctypes API for each library method # NOTE: should add one of these for each lib function From 9915a6725f3c8ec3e66a86d8d49c1eb502d599db Mon Sep 17 00:00:00 2001 From: Theophile Chirac Date: Mon, 4 Feb 2019 17:21:59 +0100 Subject: [PATCH 0102/1242] 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 9fcd69921fd268bcec2d23d6ec519581f2a76794 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 4 Feb 2019 11:27:00 -0700 Subject: [PATCH 0103/1242] Commit JT 020419 - neb/spin implemneted - rotational initial states to be implemented - climbing image to be implemented --- examples/SPIN/gneb_bfo/final.iron_spin | 64 ++-- examples/SPIN/gneb_bfo/in.neb.hop1 | 1 + examples/SPIN/gneb_bfo/in.neb.spin_iron | 82 +--- examples/SPIN/gneb_bfo/in.spin.iron | 4 +- src/REPLICA/fix_neb_spin.cpp | 481 +++++++++++++++--------- src/REPLICA/fix_neb_spin.h | 7 +- src/REPLICA/neb_spin.cpp | 453 +++++++++++++++++++--- src/REPLICA/neb_spin.h | 7 +- src/SPIN/pair_spin_exchange.cpp | 3 +- 9 files changed, 754 insertions(+), 348 deletions(-) diff --git a/examples/SPIN/gneb_bfo/final.iron_spin b/examples/SPIN/gneb_bfo/final.iron_spin index a921287ccb..aa1cbae770 100644 --- a/examples/SPIN/gneb_bfo/final.iron_spin +++ b/examples/SPIN/gneb_bfo/final.iron_spin @@ -1,36 +1,36 @@ 32 -2.2000000000000002e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 2.8664999999999998e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 5.7329999999999997e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 8.5994999999999990e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 0.0000000000000000e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 2.8664999999999998e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 5.7329999999999997e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 8.5994999999999990e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 1.4332499999999999e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 4.2997499999999995e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 7.1662499999999998e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 1.0032750000000000e+01 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 0.0000000000000000e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 1.4332499999999999e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 2.8664999999999998e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 4.2997499999999995e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 5.7329999999999997e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 7.1662499999999998e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 8.5994999999999990e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 1.0032750000000000e+01 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 0.0000000000000000e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 2.8664999999999998e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 5.7329999999999997e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 8.5994999999999990e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 1.4332499999999999e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 4.2997499999999995e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 7.1662499999999998e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.2000000000000002e+00 1.0032750000000000e+01 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +1 2.2000000000000002e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2 2.2000000000000002e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +3 2.2000000000000002e+00 2.8664999999999998e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +4 2.2000000000000002e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +5 2.2000000000000002e+00 5.7329999999999997e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +6 2.2000000000000002e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +7 2.2000000000000002e+00 8.5994999999999990e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +8 2.2000000000000002e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +9 2.2000000000000002e+00 0.0000000000000000e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +10 2.2000000000000002e+00 2.8664999999999998e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +11 2.2000000000000002e+00 5.7329999999999997e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +12 2.2000000000000002e+00 8.5994999999999990e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +13 2.2000000000000002e+00 1.4332499999999999e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +14 2.2000000000000002e+00 4.2997499999999995e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +15 2.2000000000000002e+00 7.1662499999999998e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +16 2.2000000000000002e+00 1.0032750000000000e+01 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +17 2.2000000000000002e+00 0.0000000000000000e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +18 2.2000000000000002e+00 1.4332499999999999e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +19 2.2000000000000002e+00 2.8664999999999998e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +20 2.2000000000000002e+00 4.2997499999999995e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +21 2.2000000000000002e+00 5.7329999999999997e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +22 2.2000000000000002e+00 7.1662499999999998e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +23 2.2000000000000002e+00 8.5994999999999990e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +24 2.2000000000000002e+00 1.0032750000000000e+01 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +25 2.2000000000000002e+00 0.0000000000000000e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +26 2.2000000000000002e+00 2.8664999999999998e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +27 2.2000000000000002e+00 5.7329999999999997e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +28 2.2000000000000002e+00 8.5994999999999990e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +29 2.2000000000000002e+00 1.4332499999999999e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +30 2.2000000000000002e+00 4.2997499999999995e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +31 2.2000000000000002e+00 7.1662499999999998e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +32 2.2000000000000002e+00 1.0032750000000000e+01 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/examples/SPIN/gneb_bfo/in.neb.hop1 b/examples/SPIN/gneb_bfo/in.neb.hop1 index 4e203afd82..6697330faa 100644 --- a/examples/SPIN/gneb_bfo/in.neb.hop1 +++ b/examples/SPIN/gneb_bfo/in.neb.hop1 @@ -1,4 +1,5 @@ # 2d NEB surface simulation, hop from surface to become adatom +print "Test 1" dimension 2 boundary p s p diff --git a/examples/SPIN/gneb_bfo/in.neb.spin_iron b/examples/SPIN/gneb_bfo/in.neb.spin_iron index 6b99cd4639..2cf3a8653e 100644 --- a/examples/SPIN/gneb_bfo/in.neb.spin_iron +++ b/examples/SPIN/gneb_bfo/in.neb.spin_iron @@ -1,12 +1,12 @@ # bcc iron in a 3d periodic box +print "Test 1" -clear units metal -atom_style spin - dimension 3 boundary p p f +atom_style spin + # necessary for the serial algorithm (sametag) atom_modify map array @@ -20,7 +20,7 @@ read_data ../examples/SPIN/gneb_bfo/initial.iron_spin # setting mass, mag. moments, and interactions for bcc iron mass 1 55.845 -set group all spin 2.2 -1.0 0.0 0.0 +#set group all spin 2.2 -1.0 0.0 0.0 pair_style spin/exchange 3.5 pair_coeff * * exchange 3.4 0.02726 0.2171 1.841 @@ -28,73 +28,13 @@ 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.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 -fix 2 nebatoms neb_spin 1.0 +fix 1 all precession/spin zeeman 0.001 0.0 0.0 1.0 anisotropy 0.01 1.0 0.0 0.0 +#fix 2 all langevin/spin 0.0 0.0 21 +fix 2 all neb/spin 1.0 #parallel ideal -min_style quickmin -neb 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin +timestep 0.0001 - -############################################################# - -# 2d NEB surface simulation, hop from surface to become adatom - - -variable u uloop 20 - -# create geometry with flat surface - -lattice hex 0.9 -region box block 0 20 0 10 -0.25 0.25 - -#create_box 3 box -#create_atoms 1 box -#mass * 1.0 -#write_data initial.hop1 - -read_data ../examples/SPIN/gneb_bfo/initial.hop1 - -# LJ potentials - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_modify shift yes - -# initial minimization to relax surface - -minimize 1.0e-6 1.0e-4 1000 10000 -reset_timestep 0 - -# define groups - -region 1 block INF INF INF 1.25 INF INF -group lower region 1 -group mobile subtract all lower -set group lower type 2 - -timestep 0.05 - -# group of NEB atoms - either block or single atom ID 412 - -region surround block 10 18 17 20 0 0 units box -group nebatoms region surround -#group nebatoms id 412 -set group nebatoms type 3 -group nonneb subtract all nebatoms - -fix 1 lower setforce 0.0 0.0 0.0 -fix 2 nebatoms neb 1.0 parallel ideal -fix 3 all enforce2d - -thermo 100 - -#dump 1 nebatoms atom 10 dump.neb.$u -#dump 2 nonneb atom 10 dump.nonneb.$u - -# run NEB for 2000 steps or to force tolerance - -min_style quickmin - -neb 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.hop1 +#min_style quickmin +neb/spin 0.0 0.1 1 1 1 final ../examples/SPIN/gneb_bfo/final.iron_spin +#neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.spin.iron b/examples/SPIN/gneb_bfo/in.spin.iron index 6d291c633b..0c84845f5f 100644 --- a/examples/SPIN/gneb_bfo/in.spin.iron +++ b/examples/SPIN/gneb_bfo/in.spin.iron @@ -19,7 +19,7 @@ create_atoms 1 box mass 1 55.845 -set group all spin 2.2 -1.0 0.0 0.0 +set group all spin 2.2 1.0 0.0 0.0 #velocity all create 100 4928459 rot yes dist gaussian pair_style spin/exchange 3.5 @@ -53,4 +53,4 @@ compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] run 0 -write_data final.iron_spin +write_data initial.iron_spin diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/REPLICA/fix_neb_spin.cpp index a96af45267..150c37a03e 100644 --- a/src/REPLICA/fix_neb_spin.cpp +++ b/src/REPLICA/fix_neb_spin.cpp @@ -11,11 +11,6 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ -/* ---------------------------------------------------------------------- - Contributing author for: Emile Maras (CEA, France) - new options for inter-replica forces, first/last replica treatment -------------------------------------------------------------------------- */ - #include #include #include @@ -392,6 +387,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) nlen = 0.0; double tlen = 0.0; double gradnextlen = 0.0; + double delndots, delpdots; dotgrad = gradlen = dotpath = dottangrad = 0.0; @@ -403,12 +399,20 @@ void FixNEB_spin::min_post_force(int /*vflag*/) for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { + // tangent vector delspxp = sp[i][0] - spprev[i][0]; delspyp = sp[i][1] - spprev[i][1]; delspzp = sp[i][2] - spprev[i][2]; - domain->minimum_image(delspxp,delspyp,delspzp); // check what it does - delsqp = delspxp*delspxp+delspyp*delspyp+delspzp*delspzp; + + // project delp vector on tangent space + delpdots = delspxp*sp[i][0]+delspyp*sp[i][1]+delspzp*sp[i][2]; + delspxp -= delpdots*sp[i][0]; + delspyp -= delpdots*sp[i][1]; + delspzp -= delpdots*sp[i][2]; + + // adjust distance if pbc + //domain->minimum_image(delspxp,delspyp,delspzp); // calc. geodesic length spi[0]=sp[i][0]; @@ -419,7 +423,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) spj[2]=spprev[i][2]; templen = geodesic_distance(spi, spj); plen += templen*templen; - dottangrad += delxp*fm[i][0]+ delyp*fm[i][1]+delzp*fm[i][2]; + dottangrad += delspxp*fm[i][0]+ delspyp*fm[i][1]+delspzp*fm[i][2]; gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; //plen += delxp*delxp + delyp*delyp + delzp*delzp; @@ -430,14 +434,14 @@ void FixNEB_spin::min_post_force(int /*vflag*/) // (unless FreeEnd option) if (FreeEndFinal||FreeEndFinalWithRespToEIni) { error->all(FLERR,"Free End option not yet active"); - tangent[i][0]=delspxp; - tangent[i][1]=delspyp; - tangent[i][2]=delspzp; - // if needed, tlen has to be modified - tlen += tangent[i][0]*tangent[i][0] + - tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - dot += fm[i][0]*tangent[i][0] + fm[i][1]*tangent[i][1] + - fm[i][2]*tangent[i][2]; + //tangent[i][0]=delspxp; + //tangent[i][1]=delspyp; + //tangent[i][2]=delspzp; + //// if needed, tlen has to be modified + //tlen += tangent[i][0]*tangent[i][0] + + // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + //dot += fm[i][0]*tangent[i][0] + fm[i][1]*tangent[i][1] + + // fm[i][2]*tangent[i][2]; } @@ -469,9 +473,16 @@ void FixNEB_spin::min_post_force(int /*vflag*/) delspxn = spnext[i][0]- sp[i][0]; delspyn = spnext[i][1]- sp[i][1]; delspzn = spnext[i][2]- sp[i][2]; - domain->minimum_image(delspxn,delspyn,delspzn); // check what it does - delsqn = delspxn*delspxn+delspyn*delspyn+delspzn*delspzn; + // project deln vector on tangent space + delndots = delspxn*sp[i][0]+delspyn*sp[i][1]+delspzn*sp[i][2]; + delspxn -= delndots*sp[i][0]; + delspyn -= delndots*sp[i][1]; + delspzn -= delndots*sp[i][2]; + + // adjust del. if pbc + //domain->minimum_image(delspxn,delspyn,delspzn); + // calc. geodesic length spi[0]=sp[i][0]; spi[1]=sp[i][1]; @@ -485,14 +496,14 @@ void FixNEB_spin::min_post_force(int /*vflag*/) gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; if (FreeEndIni) { error->all(FLERR,"Free End option not yet active"); - tangent[i][0]=delxn; - tangent[i][1]=delyn; - tangent[i][2]=delzn; - // if needed, tlen has to be modified - tlen += tangent[i][0]*tangent[i][0] + - tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + - f[i][2]*tangent[i][2]; + //tangent[i][0]=delxn; + //tangent[i][1]=delyn; + //tangent[i][2]=delzn; + //// if needed, tlen has to be modified + //tlen += tangent[i][0]*tangent[i][0] + + // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + //dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + + // f[i][2]*tangent[i][2]; } //delxn = xnext[i][0] - x[i][0]; @@ -528,10 +539,20 @@ void FixNEB_spin::min_post_force(int /*vflag*/) for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { - delspxp = spx[i][0] - spxprev[i][0]; - delspyp = spx[i][1] - spxprev[i][1]; - delspzp = spx[i][2] - spxprev[i][2]; - domain->minimum_image(delspxp,delspyp,delspzp); + + // calc. delp vector + delspxp = sp[i][0] - spprev[i][0]; + delspyp = sp[i][1] - spprev[i][1]; + delspzp = sp[i][2] - spprev[i][2]; + + // project delp vector on tangent space + delndots = delspxp*sp[i][0]+delspyp*sp[i][1]+delspzp*sp[i][2]; + delspxp -= delpdots*sp[i][0]; + delspyp -= delpdots*sp[i][1]; + delspzp -= delpdots*sp[i][2]; + + // adjust distance if pbc + //domain->minimum_image(delspxp,delspyp,delspzp); // calc. geodesic length spi[0]=sp[i][0]; @@ -543,10 +564,19 @@ void FixNEB_spin::min_post_force(int /*vflag*/) templen = geodesic_distance(spi, spj); plen += templen*templen; - delspxn = spxnext[i][0] - spx[i][0]; - delspyn = spxnext[i][1] - spx[i][1]; - delspzn = spxnext[i][2] - spx[i][2]; - domain->minimum_image(delspxn,delspyn,delspzn); + // calc. deln vector + delspxn = spnext[i][0] - sp[i][0]; + delspyn = spnext[i][1] - sp[i][1]; + delspzn = spnext[i][2] - sp[i][2]; + + // project deln vector on tangent space + delndots = delspxn*sp[i][0]+delspyn*sp[i][1]+delspzn*sp[i][2]; + delspxn -= delndots*sp[i][0]; + delspyn -= delndots*sp[i][1]; + delspzn -= delndots*sp[i][2]; + + // adjust distance if pbc + //domain->minimum_image(delspxn,delspyn,delspzn); if (vnext > veng && veng > vprev) { tangent[i][0] = delspxn; @@ -593,63 +623,11 @@ void FixNEB_spin::min_post_force(int /*vflag*/) dotgrad += fm[i][0]*fnext[i][0] + fm[i][1]*fnext[i][1] + fm[i][2]*fnext[i][2]; - // is this a perpandicular spring force? + // no Perpendicular nudging force option active yet + // see fix_neb for example if (kspringPerp != 0.0) - error->all(FLERR,"Perpendicular nudging force not yet active"); - //springF[i][0] = kspringPerp*(delxn-delxp); - //springF[i][1] = kspringPerp*(delyn-delyp); - //springF[i][2] = kspringPerp*(delzn-delzp); + error->all(FLERR,"NEB_spin Perpendicular nudging force not yet active"); - //delxp = x[i][0] - xprev[i][0]; - //delyp = x[i][1] - xprev[i][1]; - //delzp = x[i][2] - xprev[i][2]; - //domain->minimum_image(delxp,delyp,delzp); - //plen += delxp*delxp + delyp*delyp + delzp*delzp; - - //delxn = xnext[i][0] - x[i][0]; - //delyn = xnext[i][1] - x[i][1]; - //delzn = xnext[i][2] - x[i][2]; - //domain->minimum_image(delxn,delyn,delzn); - - //if (vnext > veng && veng > vprev) { - // tangent[i][0] = delxn; - // tangent[i][1] = delyn; - // tangent[i][2] = delzn; - //} else if (vnext < veng && veng < vprev) { - // tangent[i][0] = delxp; - // tangent[i][1] = delyp; - // tangent[i][2] = delzp; - //} else { - // if (vnext > vprev) { - // tangent[i][0] = vmax*delxn + vmin*delxp; - // tangent[i][1] = vmax*delyn + vmin*delyp; - // tangent[i][2] = vmax*delzn + vmin*delzp; - // } else if (vnext < vprev) { - // tangent[i][0] = vmin*delxn + vmax*delxp; - // tangent[i][1] = vmin*delyn + vmax*delyp; - // tangent[i][2] = vmin*delzn + vmax*delzp; - // } else { // vnext == vprev, e.g. for potentials that do not compute an energy - // tangent[i][0] = delxn + delxp; - // tangent[i][1] = delyn + delyp; - // tangent[i][2] = delzn + delzp; - // } - //} - - //nlen += delxn*delxn + delyn*delyn + delzn*delzn; - //tlen += tangent[i][0]*tangent[i][0] + - // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - //gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - //dotpath += delxp*delxn + delyp*delyn + delzp*delzn; - //dottangrad += tangent[i][0]*f[i][0] + - // tangent[i][1]*f[i][1] + tangent[i][2]*f[i][2]; - //gradnextlen += fnext[i][0]*fnext[i][0] + - // fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; - //dotgrad += f[i][0]*fnext[i][0] + f[i][1]*fnext[i][1] + - // f[i][2]*fnext[i][2]; - - //springF[i][0] = kspringPerp*(delxn-delxp); - //springF[i][1] = kspringPerp*(delyn-delyp); - //springF[i][2] = kspringPerp*(delzn-delzp); } } @@ -675,6 +653,24 @@ void FixNEB_spin::min_post_force(int /*vflag*/) dottangrad = bufout[6]; dotgrad = bufout[7]; + + // project tangent vector on tangent space + + double buftan[3]; + double tandots; + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + tandots = tangent[i][0]*sp[i][0]+tangent[i][1]*sp[i][1]+ + tangent[i][2]*sp[i][2]; + buftan[0] = tangent[i][0]-tandots*sp[i][0]; + buftan[1] = tangent[i][1]-tandots*sp[i][1]; + buftan[2] = tangent[i][2]-tandots*sp[i][2]; + tangent[i][0] = buftan[0]; + tangent[i][1] = buftan[1]; + tangent[i][2] = buftan[2]; + } + + // normalize tangent vector if (tlen > 0.0) { @@ -687,8 +683,6 @@ void FixNEB_spin::min_post_force(int /*vflag*/) } } -//////////////////////////////////////////////////////// - // first or last replica has no change to forces, just return if (ireplica > 0 && ireplica < nreplica-1) @@ -700,93 +694,31 @@ void FixNEB_spin::min_post_force(int /*vflag*/) if (ireplica < nreplica-1) dotgrad = dotgrad /(gradlen*gradnextlen); + // no Free End option active yet + // see fix_neb for example if (FreeEndIni && ireplica == 0) { - if (tlen > 0.0) { - double dotall; - MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall/tlen; - - if (dot<0) prefactor = -dot - kspringIni*(veng-EIniIni); - else prefactor = -dot + kspringIni*(veng-EIniIni); - - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - f[i][0] += prefactor *tangent[i][0]; - f[i][1] += prefactor *tangent[i][1]; - f[i][2] += prefactor *tangent[i][2]; - } - } + error->all(FLERR,"NEB_spin Free End option not yet active"); } + // no Free End option active yet + // see fix_neb for example if (FreeEndFinal && ireplica == nreplica -1) { - if (tlen > 0.0) { - double dotall; - MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall/tlen; - - if (vengall(FLERR,"NEB_spin Free End option not yet active"); } + // no Free End option active yet + // see fix_neb for example if (FreeEndFinalWithRespToEIni&&ireplica == nreplica -1) { - if (tlen > 0.0) { - double dotall; - MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); - dot=dotall/tlen; - if (vengall(FLERR,"NEB_spin Free End option not yet active"); } + // no NEB_spin long range option + // see fix_neb for example double lentot = 0; double meanDist,idealPos,lenuntilIm,lenuntilClimber; lenuntilClimber=0; if (NEBLongRange) { - if (cmode == SINGLE_PROC_DIRECT || cmode == SINGLE_PROC_MAP) { - MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,uworld); - } else { - if (me == 0) - MPI_Allgather(&nlen,1,MPI_DOUBLE,&nlenall[0],1,MPI_DOUBLE,rootworld); - MPI_Bcast(nlenall,nreplica,MPI_DOUBLE,0,world); - } - - lenuntilIm = 0; - for (int i = 0; i < ireplica; i++) - lenuntilIm += nlenall[i]; - - for (int i = 0; i < nreplica; i++) - lentot += nlenall[i]; - - meanDist = lentot/(nreplica -1); - - if (rclimber>0) { - for (int i = 0; i < rclimber; i++) - lenuntilClimber += nlenall[i]; - double meanDistBeforeClimber = lenuntilClimber/rclimber; - double meanDistAfterClimber = - (lentot-lenuntilClimber)/(nreplica-rclimber-1); - if (ireplicaall(FLERR,"NEB_spin long range option not yet active"); } if (ireplica == 0 || ireplica == nreplica-1) return ; @@ -800,12 +732,19 @@ void FixNEB_spin::min_post_force(int /*vflag*/) for (int i = 0; i < nlocal; i++) { if (mask[i] & groupbit) { - dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + - f[i][2]*tangent[i][2]; - dotSpringTangent += springF[i][0]*tangent[i][0] + + dot += fm[i][0]*tangent[i][0] + fm[i][1]*tangent[i][1] + + fm[i][2]*tangent[i][2]; + // springF defined for perp. spring option + // not defined here + //dotSpringTangent += springF[i][0]*tangent[i][0] + springF[i][1]*tangent[i][1] + springF[i][2]*tangent[i][2];} + //dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + + // f[i][2]*tangent[i][2]; + //dotSpringTangent += springF[i][0]*tangent[i][0] + + // springF[i][1]*tangent[i][1] + springF[i][2]*tangent[i][2];} } + // gather all dot and dotSpring for this replica (world) double dotSpringTangentall; MPI_Allreduce(&dotSpringTangent,&dotSpringTangentall,1, MPI_DOUBLE,MPI_SUM,world); @@ -814,20 +753,26 @@ void FixNEB_spin::min_post_force(int /*vflag*/) MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall; - if (ireplica == rclimber) prefactor = -2.0*dot; - else { + + // implement climbing image here + + if (ireplica == rclimber) { + error->all(FLERR,"NEB_spin climber option not yet active"); + //prefactor = -2.0*dot; + } else { if (NEBLongRange) { - prefactor = -dot - kspring*(lenuntilIm-idealPos)/(2*meanDist); + error->all(FLERR,"NEB_spin climber option not yet active"); + //prefactor = -dot - kspring*(lenuntilIm-idealPos)/(2*meanDist); } else if (StandardNEB) { prefactor = -dot + kspring*(nlen-plen); } if (FinalAndInterWithRespToEIni&& vengsametag; + 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 alpha; + double spi[3],fmi[3]; + double cp[3],g[3]; + + //cp[0] = cp[1] = cp[2] = 0.0; + //g[0] = g[1] = g[2] = 0.0; + dts2 = dts*dts; + + // fictitious Gilbert damping of 1 + alpha = 1.0; + + // loop on all spins on proc. + + if (ireplica != nreplica-1 && ireplica != 0) + for (int i = 0; i < nlocal; i++) + if (mask[i] & groupbit) { + + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + + fmi[0] = fm[i][0]; + fmi[1] = fm[i][1]; + fmi[2] = fm[i][2]; + + // calc. damping torque + + tdampx = -alpha*(fmi[1]*spi[2] - fmi[2]*spi[1]); + tdampy = -alpha*(fmi[2]*spi[0] - fmi[0]*spi[2]); + tdampz = -alpha*(fmi[0]*spi[1] - fmi[1]*spi[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] += (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]; + + // 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; + + // comm. sp[i] to atoms with same tag (for serial algo) + + // no need for simplecticity + //if (sector_flag == 0) { + // if (sametag[i] >= 0) { + // j = sametag[i]; + // while (j >= 0) { + // sp[j][0] = sp[i][0]; + // sp[j][1] = sp[i][1]; + // sp[j][2] = sp[i][2]; + // j = sametag[j]; + // } + // } + //} + // + + } +} + +/* ---------------------------------------------------------------------- + evaluate max timestep +---------------------------------------------------------------------- */ + +double FixNEB_spin::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++) + if (mask[i] & groupbit) { + 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 + + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + if (fmaxsqall < fmaxsqloc) + error->all(FLERR,"Incorrect fmaxall calc."); + + // define max timestep + // dividing by 10 the inverse of max frequency + + dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); + + return dtmax; +} + /* ---------------------------------------------------------------------- send/recv NEB atoms to/from adjacent replicas received atoms matching my local atoms are stored in xprev,xnext @@ -913,19 +1018,25 @@ void FixNEB_spin::inter_replica_comm() if (cmode == SINGLE_PROC_DIRECT) { if (ireplica > 0) MPI_Irecv(xprev[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld,&request); + MPI_Irecv(spprev[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld,&request); if (ireplica < nreplica-1) MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld); + MPI_Send(sp[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld); if (ireplica > 0) MPI_Wait(&request,MPI_STATUS_IGNORE); if (ireplica < nreplica-1) MPI_Irecv(xnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + MPI_Irecv(spnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); if (ireplica > 0) MPI_Send(x[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(sp[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); if (ireplica < nreplica-1) MPI_Wait(&request,MPI_STATUS_IGNORE); if (ireplica < nreplica-1) MPI_Irecv(fnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); + MPI_Irecv(fmnext[0],3*nlocal,MPI_DOUBLE,procnext,0,uworld,&request); if (ireplica > 0) MPI_Send(f[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); + MPI_Send(fm[0],3*nlocal,MPI_DOUBLE,procprev,0,uworld); if (ireplica < nreplica-1) MPI_Wait(&request,MPI_STATUS_IGNORE); return; @@ -1077,7 +1188,7 @@ void FixNEB_spin::inter_replica_comm() fmsendall[0],counts,displacements,MPI_DOUBLE,0,world); } else { MPI_Gatherv(NULL,3*m,MPI_DOUBLE, - xsendall[0],counts,displacements,MPI_DOUBLE,0,world); + spsendall[0],counts,displacements,MPI_DOUBLE,0,world); MPI_Gatherv(NULL,3*m,MPI_DOUBLE, fmsendall[0],counts,displacements,MPI_DOUBLE,0,world); } diff --git a/src/REPLICA/fix_neb_spin.h b/src/REPLICA/fix_neb_spin.h index e3bdd6889d..291341860e 100644 --- a/src/REPLICA/fix_neb_spin.h +++ b/src/REPLICA/fix_neb_spin.h @@ -13,8 +13,8 @@ #ifdef FIX_CLASS -FixStyle(neb,FixNEB) -FixStyle(neb_spin,FixNEB_spin) +//FixStyle(neb,FixNEB) +FixStyle(neb/spin,FixNEB_spin) #else @@ -36,6 +36,8 @@ class FixNEB_spin : public Fix { void init(); void min_setup(int); void min_post_force(int); + void advance_spins(double); + double evaluate_dt(); private: int me,nprocs,nprocs_universe; @@ -79,6 +81,7 @@ class FixNEB_spin : public Fix { int *counts,*displacements; // used for MPI_Gather + double geodesic_distance(double *, double *); void inter_replica_comm(); void reallocate(); }; diff --git a/src/REPLICA/neb_spin.cpp b/src/REPLICA/neb_spin.cpp index 7860553532..60d44d1875 100644 --- a/src/REPLICA/neb_spin.cpp +++ b/src/REPLICA/neb_spin.cpp @@ -13,7 +13,7 @@ // lmptype.h must be first b/c this file uses MAXBIGINT and includes mpi.h // due to OpenMPI bug which sets INT64_MAX via its mpi.h -// before lmptype.h can set flags to insure it is done correctly +// before lmptype.h can set flags to insure it is done correctly #include "lmptype.h" #include @@ -21,7 +21,10 @@ #include #include //#include "neb.h" +// test spin #include "neb_spin.h" +#include "compute.h" + #include "universe.h" #include "atom.h" #include "update.h" @@ -30,7 +33,10 @@ #include "min.h" #include "modify.h" #include "fix.h" -#include "fix_neb.h" +//#include "fix_neb.h" +// test spin +#include "fix_neb_spin.h" + #include "output.h" #include "thermo.h" #include "finish.h" @@ -46,7 +52,7 @@ using namespace MathConst; #define MAXLINE 256 #define CHUNK 1024 //#define ATTRIBUTE_PERLINE 4 -// 8 attributes: tag number, coords, spin norm, spin dir. +// 8 attributes: tag, spin norm, position (3), spin direction (3) #define ATTRIBUTE_PERLINE 8 /* ---------------------------------------------------------------------- */ @@ -61,7 +67,8 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, int n2steps_in, int nevery_in, double *buf_init, double *buf_final) : Pointers(lmp) { - double delx,dely,delz; + //double delx,dely,delz; + double delspx,delspy,delspz; etol = etol_in; ftol = ftol_in; @@ -82,19 +89,40 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, double fraction = ireplica/(nreplica-1.0); double **x = atom->x; + // spin quantitites double **sp = atom->sp; int nlocal = atom->nlocal; - // modif interp. int ii = 0; + double spinit[3],spfinal[3]; for (int i = 0; i < nlocal; i++) { - delx = buf_final[ii] - buf_init[ii]; - dely = buf_final[ii+1] - buf_init[ii+1]; - delz = buf_final[ii+2] - buf_init[ii+2]; - domain->minimum_image(delx,dely,delz); - x[i][0] = buf_init[ii] + fraction*delx; - x[i][1] = buf_init[ii+1] + fraction*dely; - x[i][2] = buf_init[ii+2] + fraction*delz; + + spinit[0] = buf_init[ii]; + spinit[1] = buf_init[ii+1]; + spinit[2] = buf_init[ii+2]; + spfinal[0] = buf_final[ii]; + spfinal[1] = buf_final[ii+1]; + spfinal[2] = buf_final[ii+2]; + + initial_rotation(spinit,spfinal,fraction); + + sp[i][0] = spfinal[0]; + sp[i][1] = spfinal[1]; + sp[i][2] = spfinal[2]; + + //delx = buf_final[ii] - buf_init[ii]; + //dely = buf_final[ii+1] - buf_init[ii+1]; + //delz = buf_final[ii+2] - buf_init[ii+2]; + + // adjust distance if pbc + // not implemented yet + //domain->minimum_image(delx,dely,delz); + + // need to define a procedure for circular initialization + + //x[i][0] = buf_init[ii] + fraction*delx; + //x[i][1] = buf_init[ii+1] + fraction*dely; + //x[i][2] = buf_init[ii+2] + fraction*delz; ii += 3; } } @@ -114,6 +142,15 @@ NEB_spin::~NEB_spin() void NEB_spin::command(int narg, char **arg) { + + printf("test 1 \n"); + + // test 1 + double **sp1 = atom->sp; + printf("test 1 atom: i=%d,%g,%g,%g \n",1,sp1[1][0],sp1[1][1],sp1[1][2]); + //error->all(FLERR,"end neb_spin test"); + + if (domain->box_exist == 0) error->all(FLERR,"NEB_spin command before simulation box is defined"); @@ -141,6 +178,13 @@ void NEB_spin::command(int narg, char **arg) uworld = universe->uworld; MPI_Comm_rank(world,&me); + // check metal units and spin atom/style + + if (!atom->sp_flag) + error->all(FLERR,"neb/spin requires atom/spin style"); + if (strcmp(update->unit_style,"metal") != 0) + error->all(FLERR,"neb/spin simulation requires metal unit style"); + // error checks if (nreplica == 1) error->all(FLERR,"Cannot use NEB_spin with a single replica"); @@ -149,6 +193,7 @@ void NEB_spin::command(int narg, char **arg) // process file-style setting to setup initial configs for all replicas + // check what options are available if (strcmp(arg[5],"final") == 0) { if (narg != 7 && narg !=8) error->universe_all(FLERR,"Illegal NEB_spin command"); infile = arg[6]; @@ -163,6 +208,13 @@ void NEB_spin::command(int narg, char **arg) verbose=false; if (strcmp(arg[narg-1],"verbose") == 0) verbose=true; + + + // test 1 + double **sp = atom->sp; + printf("test 2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); + error->all(FLERR,"end neb_spin test"); + // run the NEB_spin calculation run(); @@ -181,17 +233,13 @@ void NEB_spin::run() else color = 1; MPI_Comm_split(uworld,color,0,&roots); + // search for neb_spin fix, allocate it int ineb; for (ineb = 0; ineb < modify->nfix; ineb++) - if (strcmp(modify->fix[ineb]->style,"neb_spin") == 0) break; - if (ineb == modify->nfix) error->all(FLERR,"NEB_spin requires use of fix neb_spin"); - //int ineb; - //for (ineb = 0; ineb < modify->nfix; ineb++) - // if (strcmp(modify->fix[ineb]->style,"neb") == 0) break; - //if (ineb == modify->nfix) error->all(FLERR,"NEB_spin requires use of fix neb"); + if (strcmp(modify->fix[ineb]->style,"neb/spin") == 0) break; + if (ineb == modify->nfix) error->all(FLERR,"NEB_spin requires use of fix neb/spin"); - //fneb = (FixNEB_spin *) modify->fix[ineb]; - fneb_spin = (FixNEB_spin *) modify->fix[ineb]; + fneb = (FixNEB_spin *) modify->fix[ineb]; if (verbose) numall =7; else numall = 4; memory->create(all,nreplica,numall,"neb:all"); @@ -206,8 +254,10 @@ void NEB_spin::run() lmp->init(); - if (update->minimize->searchflag) - error->all(FLERR,"NEB_spin requires damped dynamics minimizer"); + // put flag to check gilbert damping procedure is set + + //if (update->minimize->searchflag) + // error->all(FLERR,"NEB_spin requires damped dynamics minimizer"); // setup regular NEB_spin minimization FILE *uscreen = universe->uscreen; @@ -264,8 +314,19 @@ void NEB_spin::run() timer->init(); timer->barrier_start(); + double dts; while (update->minimize->niter < n1steps) { - update->minimize->run(nevery); + //dts = evaluate_dt(); + //advance_spins(dts); + dts = fneb->evaluate_dt(); + fneb->advance_spins(dts); + + // no minimizer for spins + //update->minimize->run(nevery); + // + // evaluate dts + // loop on spins, damped advance + // print_status(); if (update->minimize->stop_condition) break; } @@ -309,8 +370,7 @@ void NEB_spin::run() error->all(FLERR,"Too many timesteps"); update->minimize->init(); - //fneb->rclimber = top; - fneb_spin->rclimber = top; + fneb->rclimber = top; update->minimize->setup(); if (me_universe == 0) { @@ -356,7 +416,11 @@ void NEB_spin::run() timer->barrier_start(); while (update->minimize->niter < n2steps) { - update->minimize->run(nevery); + //dts = evaluate_dt(); + //advance_spins(dts); + dts = fneb->evaluate_dt(); + fneb->advance_spins(dts); + //update->minimize->run(nevery); print_status(); if (update->minimize->stop_condition) break; } @@ -373,6 +437,174 @@ void NEB_spin::run() update->beginstep = update->endstep = 0; } +/* ---------------------------------------------------------------------- + geodesic distance calculation (Vincenty's formula) +------------------------------------------------------------------------- */ + +//double NEB_spin::geodesic_distance2(double spi[3], double spj[3]) +//{ +// double dist; +// double crossx,crossy,crossz; +// double dotx,doty,dotz; +// double crosslen,dots; +// +// crossx = spi[1]*spj[2]-spi[2]*spj[1]; +// crossy = spi[2]*spj[0]-spi[0]*spj[2]; +// crossz = spi[0]*spj[1]-spi[1]*spj[0]; +// crosslen = sqrt(crossx*crossx + crossy*crossy + crossz*crossz); +// dotx = spi[0]*spj[0]; +// doty = spi[1]*spj[1]; +// dotz = spi[2]*spj[2]; +// dots = dotx+doty+dotz; +// +// dist = atan2(crosslen,dots); +// +// return dist; +//} + +/* ---------------------------------------------------------------------- + evaluate max timestep +---------------------------------------------------------------------- */ + +//double NEB_spin::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++) +// if (mask[i] & groupbit) { +// 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 +// +// if (update->multireplica == 1) { +// fmaxsqall = fmaxsqloc; +// MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); +// } +// +// if (fmaxsqall < fmaxsqloc) +// error->all(FLERR,"Incorrect fmaxall calc."); +// +// // define max timestep +// // dividing by 10 the inverse of max frequency +// +// dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); +// +// return dtmax; +//} + +/* ---------------------------------------------------------------------- + geometric damped advance os spins +---------------------------------------------------------------------- */ + +//void NEB_spin::advance_spins(double dts) +//{ +// //int j=0; +// //int *sametag = atom->sametag; +// 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 alpha; +// double spi[3],fmi[3]; +// double cp[3],g[3]; +// +// //cp[0] = cp[1] = cp[2] = 0.0; +// //g[0] = g[1] = g[2] = 0.0; +// dts2 = dts*dts; +// +// // fictitious Gilbert damping of 1 +// alpha = 1.0; +// +// // loop on all spins on proc. +// +// if (ireplica != nreplica-1 && ireplica != 0) +// for (int i = 0; i < nlocal; i++) +// if (mask[i] & groupbit) { +// +// spi[0] = sp[i][0]; +// spi[1] = sp[i][1]; +// spi[2] = sp[i][2]; +// +// fmi[0] = fm[i][0]; +// fmi[1] = fm[i][1]; +// fmi[2] = fm[i][2]; +// +// // calc. damping torque +// +// tdampx = -alpha*(fmi[1]*spi[2] - fmi[2]*spi[1]); +// tdampy = -alpha*(fmi[2]*spi[0] - fmi[0]*spi[2]); +// tdampz = -alpha*(fmi[0]*spi[1] - fmi[1]*spi[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] += (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]; +// +// // 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; +// +// // comm. sp[i] to atoms with same tag (for serial algo) +// +// // no need for simplecticity +// //if (sector_flag == 0) { +// // if (sametag[i] >= 0) { +// // j = sametag[i]; +// // while (j >= 0) { +// // sp[j][0] = sp[i][0]; +// // sp[j][1] = sp[i][1]; +// // sp[j][2] = sp[i][2]; +// // j = sametag[j]; +// // } +// // } +// //} +// // +// +// } +//} + /* ---------------------------------------------------------------------- read initial config atom coords from file flag = 0 @@ -395,8 +627,9 @@ void NEB_spin::readfile(char *file, int flag) char *eof,*start,*next,*buf; char line[MAXLINE]; double xx,yy,zz,delx,dely,delz; - // creating new temp. sp - double spx,spy,spz,delspx,delspy,delspz; + // spin quantities + double musp,spx,spy,spz; + //,delx,dely,delz; if (me_universe == 0 && screen) fprintf(screen,"Reading NEB_spin coordinate file(s) ...\n"); @@ -440,10 +673,17 @@ void NEB_spin::readfile(char *file, int flag) double fraction = ireplica/(nreplica-1.0); double **x = atom->x; - // spin table + // spin quantities double **sp = atom->sp; + double spinit[3],spfinal[3]; int nlocal = atom->nlocal; + // test 1.2 + //double **sp = atom->sp; + printf("test 1.2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); + //error->all(FLERR,"end neb_spin test"); + + // loop over chunks of lines read from file // two versions of read_lines_from_file() for world vs universe bcast // count # of atom coords changed so can check for invalid atom IDs in file @@ -493,22 +733,59 @@ void NEB_spin::readfile(char *file, int flag) m = atom->map(tag); if (m >= 0 && m < nlocal) { ncount++; - xx = atof(values[1]); - yy = atof(values[2]); - zz = atof(values[3]); + musp = atof(values[1]); + xx = atof(values[2]); + yy = atof(values[3]); + zz = atof(values[4]); + spx = atof(values[5]); + spy = atof(values[6]); + spz = atof(values[7]); + //xx = atof(values[1]); + //yy = atof(values[2]); + //zz = atof(values[3]); if (flag == 0) { - delx = xx - x[m][0]; - dely = yy - x[m][1]; - delz = zz - x[m][2]; - domain->minimum_image(delx,dely,delz); - x[m][0] += fraction*delx; - x[m][1] += fraction*dely; - x[m][2] += fraction*delz; + + // here, function interp. spin states + + //spinit[0] = x[m][0]; + //spinit[1] = x[m][1]; + //spinit[2] = x[m][2]; + spinit[0] = sp[m][0]; + spinit[1] = sp[m][1]; + spinit[2] = sp[m][2]; + spfinal[0] = spx; + spfinal[1] = spy; + spfinal[2] = spz; + //domain->minimum_image(delx,dely,delz); + + // test + printf("spinit: %g %g %g \n",spinit[0],spinit[1],spinit[2]); + printf("spfinal bef: %g %g %g \n",spfinal[0],spfinal[1],spfinal[2]); + + initial_rotation(spinit,spfinal,fraction); + + // test + printf("spfinal aft: %g %g %g \n",spfinal[0],spfinal[1],spfinal[2]); + + sp[m][0] = spfinal[0]; + sp[m][1] = spfinal[1]; + sp[m][2] = spfinal[2]; + sp[m][3] = musp; + //delx = xx - x[m][0]; + //dely = yy - x[m][1]; + //delz = zz - x[m][2]; + //x[m][0] += fraction*delx; + //x[m][1] += fraction*dely; + //x[m][2] += fraction*delz; } else { - x[m][0] = xx; + sp[m][3] = musp; + x[m][0] = xx; x[m][1] = yy; x[m][2] = zz; + sp[m][0] = spx; + sp[m][1] = spy; + sp[m][2] = spz; } } @@ -518,6 +795,12 @@ void NEB_spin::readfile(char *file, int flag) nread += nchunk; } + // test 1.3 + //double **sp = atom->sp; + printf("test 1.3 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); + //error->all(FLERR,"end neb_spin test"); + + // check that all atom IDs in file were found by a proc if (flag == 0) { @@ -550,6 +833,75 @@ void NEB_spin::readfile(char *file, int flag) } } +/* ---------------------------------------------------------------------- + initial configuration of spin sploc using Rodrigues' formula + interpolates between initial (spi) and final (stored in sploc) +------------------------------------------------------------------------- */ + +void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) +{ + + + // implementing initial rotation using atan2 + + //atan2(crosslen,dots); + + + + double theta,spdot; + double inormdot,ispinorm; + double kix,kiy,kiz; + double kinorm, ikinorm; + double crossx,crossy,crossz; + + //printf("inside rot, spi %g, spf %g \n",spi[0],sploc[0]); + + spdot = spi[0]*sploc[0]+spi[1]*sploc[1]+spi[2]*sploc[2]; + theta = fraction*acos(spdot); + + printf("inside rot, theta %g \n",theta); + + kix = spi[1]*sploc[2]-spi[2]*sploc[1]; + kiy = spi[2]*sploc[0]-spi[0]*sploc[2]; + kiz = spi[0]*sploc[1]-spi[1]*sploc[0]; + + //printf("inside rot1.1, ki %g %g %g \n",kix,kiy,kiz); + + inormdot = 1.0/sqrt(spdot); + kinorm = kix*kix+kiy*kiy+kiz*kiz; + if (kinorm == 0.0) { + kix = 0.0; + kiy = 0.0; + kiz = 0.0; + } else { + ikinorm = 1.0/kinorm; + kix *= ikinorm; + kiy *= ikinorm; + kiz *= ikinorm; + } + + //printf("inside rot1.2, kin %g %g %g \n",kix,kiy,kiz); + + crossx = kiy*spi[2]-kiz*spi[1]; + crossy = kiz*spi[0]-kix*spi[2]; + crossz = kix*spi[1]-kiy*spi[0]; + + //printf("inside rot1.3, cross %g %g %g \n",crossx,crossy,crossz); + + sploc[0] = spi[0]*cos(theta)+crossx*sin(theta); + sploc[1] = spi[1]*cos(theta)+crossy*sin(theta); + sploc[2] = spi[2]*cos(theta)+crossz*sin(theta); + + //printf("inside rot2, spf %g %g %g \n",sploc[0],sploc[1],sploc[2]); + + ispinorm = 1.0/sqrt(sploc[0]*sploc[0]+sploc[1]*sploc[1]+sploc[2]*sploc[2]); + + sploc[0] *= ispinorm; + sploc[1] *= ispinorm; + sploc[2] *= ispinorm; + printf("inside rot2, spf %g %g %g \n",sploc[0],sploc[1],sploc[2]); +} + /* ---------------------------------------------------------------------- universe proc 0 opens NEB_spin data file test if gzipped @@ -606,22 +958,15 @@ void NEB_spin::print_status() } double one[7]; - //one[0] = fneb->veng; - //one[1] = fneb->plen; - //one[2] = fneb->nlen; - //one[3] = fneb->gradlen; - one[0] = fneb_neb->veng; - one[1] = fneb_neb->plen; - one[2] = fneb_neb->nlen; - one[3] = fneb_neb->gradlen; + one[0] = fneb->veng; + one[1] = fneb->plen; + one[2] = fneb->nlen; + one[3] = fneb->gradlen; if (verbose) { - //one[4] = fneb->dotpath; - //one[5] = fneb->dottangrad; - //one[6] = fneb->dotgrad; - one[4] = fneb_spin->dotpath; - one[5] = fneb_spin->dottangrad; - one[6] = fneb_spin->dotgrad; + one[4] = fneb->dotpath; + one[5] = fneb->dottangrad; + one[6] = fneb->dotgrad; } if (output->thermo->normflag) one[0] /= atom->natoms; diff --git a/src/REPLICA/neb_spin.h b/src/REPLICA/neb_spin.h index 3fa19460fc..6541658fd7 100644 --- a/src/REPLICA/neb_spin.h +++ b/src/REPLICA/neb_spin.h @@ -13,7 +13,8 @@ #ifdef COMMAND_CLASS -CommandStyle(neb_spin,NEB_SPIN) +CommandStyle(neb/spin,NEB_spin) +//CommandStyle(neb,NEB_spin) #else @@ -56,7 +57,11 @@ class NEB_spin : protected Pointers { double *freplica; // force on an image double *fmaxatomInRepl; // force on an image + //double geodesic_distance2(double *, double *); + //double evaluate_dt(); + //void advance_spins(double); void readfile(char *, int); + void initial_rotation(double *, double *, double); void open(char *); void print_status(); }; diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index 8cd9d33abd..ec21fe8838 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -153,11 +153,12 @@ void PairSpinExchange::init_style() neighbor->requests[irequest]->half = 0; neighbor->requests[irequest]->full = 1; - // checking if nve/spin is a listed fix + // checking if nve/spin or neb/spin are a listed fix int ifix = 0; while (ifix < modify->nfix) { if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + if (strcmp(modify->fix[ifix]->style,"neb/spin") == 0) break; ifix++; } if (ifix == modify->nfix) From 8ec9b6fb64930cc3798c4efd684f05f2f2e28296 Mon Sep 17 00:00:00 2001 From: casievers Date: Tue, 5 Feb 2019 11:49:15 -0800 Subject: [PATCH 0104/1242] Memory Use Reduction --- src/USER-PHONON/dynamical_matrix.cpp | 131 +++++++++++++++------------ src/USER-PHONON/dynamical_matrix.h | 8 +- 2 files changed, 77 insertions(+), 62 deletions(-) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index a7d8620d00..7d4caad226 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -23,6 +23,7 @@ #include "pair.h" #include "timer.h" #include "finish.h" +#include using namespace LAMMPS_NS; @@ -41,8 +42,6 @@ DynamicalMatrix::~DynamicalMatrix() { if (fp && me == 0) fclose(fp); memory->destroy(groupmap); - memory->destroy(dynmat); - memory->destroy(final_dynmat); fp = NULL; } @@ -75,32 +74,13 @@ void DynamicalMatrix::setup() neighbor->ndanger = 0; // compute all forces - force_clear(); external_force_clear = 0; - eflag=0; vflag=0; - if (pair_compute_flag) force->pair->compute(eflag,vflag); - else if (force->pair) force->pair->compute_dummy(eflag,vflag); - - if (atom->molecular) { - if (force->bond) force->bond->compute(eflag,vflag); - if (force->angle) force->angle->compute(eflag,vflag); - if (force->dihedral) force->dihedral->compute(eflag,vflag); - if (force->improper) force->improper->compute(eflag,vflag); - } - - if (force->kspace) { - force->kspace->setup(); - if (kspace_compute_flag) force->kspace->compute(eflag,vflag); - else force->kspace->compute_dummy(eflag,vflag); - } - - //modify->setup_pre_reverse(eflag,vflag); - if (force->newton) comm->reverse_comm(); + update_force(); //if all then skip communication groupmap population - if (group->count(igroup) == atom->natoms) + if (ngatoms == atom->natoms) for (int i=0; inatoms; i++) groupmap[i] = i; else @@ -133,9 +113,9 @@ void DynamicalMatrix::command(int narg, char **arg) igroup = group->find(arg[0]); if (igroup == -1) error->all(FLERR,"Could not find dynamical matrix group ID"); groupbit = group->bitmask[igroup]; - dynlen = (group->count(igroup))*3; + ngatoms = group->count(igroup); + dynlen = (ngatoms)*3; memory->create(groupmap,atom->natoms,"total_group_map:totalgm"); - memory->create(dynmat,int(dynlen),int(dynlen),"dynamic_matrix:dynmat"); update->setupflag = 1; int style = -1; @@ -162,16 +142,20 @@ void DynamicalMatrix::command(int narg, char **arg) if (style == REGULAR) { setup(); + timer->init(); + timer->barrier_start(); calculateMatrix(); - if (me ==0) writeMatrix(); + timer->barrier_stop(); } if (style == ESKM) { setup(); convert_units(update->unit_style); conversion = conv_energy/conv_distance/conv_mass; + timer->init(); + timer->barrier_start(); calculateMatrix(); - if (me ==0) writeMatrix(); + timer->barrier_stop(); } Finish finish(lmp); @@ -219,7 +203,7 @@ void DynamicalMatrix::options(int narg, char **arg) void DynamicalMatrix::openfile(const char* filename) { // if file already opened, return - if (me!=0) return; + //if (me!=0) return; if (file_opened) return; if (compressed) { @@ -261,54 +245,68 @@ void DynamicalMatrix::calculateMatrix() double *m = atom->mass; double **f = atom->f; - //initialize dynmat to all zeros - for (int i=0; i < dynlen; i++) - for (int j=0; j < dynlen; j++) - dynmat[i][j] = 0.; + double **dynmat = new double*[3]; + for (int i=0; i<3; i++) + dynmat[i] = new double[dynlen]; - energy_force(0); + double **fdynmat = new double*[3]; + for (int i=0; i<3; i++) + fdynmat[i] = new double[dynlen]; + + //initialize dynmat to all zeros + dynmat_clear(dynmat); if (comm->me == 0 && screen) fprintf(screen,"Calculating Dynamical Matrix...\n"); - for (int i=1; i<=natoms; i++){ + for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); if (local_idx >= 0){ - for (int alpha=0; alpha<3; alpha++){ + for (bigint alpha=0; alpha<3; alpha++){ displace_atom(local_idx, alpha, 1); - energy_force(0); - for (int j=1; j<=natoms; j++){ + update_force(); + for (bigint j=1; j<=natoms; j++){ local_jdx = atom->map(j); - if (local_jdx >= 0 && local_idx < nlocal && gm[i-1] >= 0 && gm[j-1] >= 0){ + if (local_jdx >= 0 && local_jdx < nlocal + && gm[i-1] >= 0 && gm[j-1] >= 0){ for (int beta=0; beta<3; beta++){ - dynmat[(gm[i-1])*3+alpha][(gm[j-1])*3+beta] += -f[j-1][beta]; + dynmat[alpha][(gm[j-1])*3+beta] = -f[local_jdx][beta]; } } } displace_atom(local_idx,alpha,-2); - energy_force(0); - for (int j=1; j<=natoms; j++){ + update_force(); + for (bigint j=1; j<=natoms; j++){ local_jdx = atom->map(j); - if (local_jdx >= 0 && local_idx < nlocal && gm[i-1] >= 0 && gm[j-1] >= 0){ - for (int beta=0; beta<3; beta++){ + if (local_jdx >= 0 && local_jdx < nlocal + && gm[i-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[(gm[i-1])*3+alpha][(gm[j-1])*3+beta] -= -f[j-1][beta]; - dynmat[(gm[i-1])*3+alpha][(gm[j-1])*3+beta] /= (2 * del * imass); - dynmat[(gm[i-1])*3+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; } } } displace_atom(local_idx,alpha,1); } + for (int k=0; k<3; k++) + MPI_Reduce(dynmat[k],fdynmat[k],dynlen,MPI_DOUBLE,MPI_SUM,0,world); + if (me == 0) + writeMatrix(fdynmat); + dynmat_clear(dynmat); } } + for (int i=0; i < 3; i++) + delete [] dynmat[i]; + delete [] dynmat; - memory->create(final_dynmat,int(dynlen),int(dynlen),"dynamic_matrix_buffer:buf"); - for (int i = 0; i < dynlen; i++) - MPI_Reduce(dynmat[i], final_dynmat[i], int(dynlen), MPI_DOUBLE, MPI_SUM, 0, world); + for (int i=0; i < 3; i++) + delete [] fdynmat[i]; + delete [] fdynmat; if (screen && me ==0 ) fprintf(screen,"Finished Calculating Dynamical Matrix\n"); } @@ -317,15 +315,17 @@ void DynamicalMatrix::calculateMatrix() write dynamical matrix ------------------------------------------------------------------------- */ -void DynamicalMatrix::writeMatrix() +void DynamicalMatrix::writeMatrix(double **dynmat) { + if (me != 0) + return; // print file comment lines if (!binaryflag && fp) { clearerr(fp); - for (int i = 0; i < dynlen; i++) { + for (int i = 0; i < 3; i++) { for (int j = 0; j < dynlen; j++) { - if ((j+1)%3==0) fprintf(fp, "%4.8f\n", final_dynmat[j][i]); - else fprintf(fp, "%4.8f ",final_dynmat[j][i]); + if ((j+1)%3==0) fprintf(fp, "%4.8f\n", dynmat[i][j]); + else fprintf(fp, "%4.8f ",dynmat[i][j]); } } } @@ -334,7 +334,7 @@ void DynamicalMatrix::writeMatrix() if (binaryflag && fp) { clearerr(fp); - fwrite(&final_dynmat[0], sizeof(double), dynlen * dynlen, fp); + fwrite(&dynmat[0], sizeof(double), 3 * dynlen, fp); if (ferror(fp)) error->one(FLERR, "Error writing to binary file"); } @@ -367,7 +367,7 @@ void DynamicalMatrix::displace_atom(int local_idx, int direction, int magnitude) return negative gradient for nextra_global dof in fextra ------------------------------------------------------------------------- */ -void DynamicalMatrix::energy_force(int resetflag) +void DynamicalMatrix::update_force() { force_clear(); @@ -412,6 +412,21 @@ void DynamicalMatrix::force_clear() } } +/* ---------------------------------------------------------------------- + clear dynmat needed +------------------------------------------------------------------------- */ + +void DynamicalMatrix::dynmat_clear(double **dynmat) +{ + + size_t nbytes = sizeof(double) * dynlen; + + if (nbytes) { + for (int i=0; i<3; i++) + memset(&dynmat[i][0],0,nbytes); + } +} + /* ---------------------------------------------------------------------- */ void DynamicalMatrix::convert_units(const char *style) @@ -485,7 +500,7 @@ void DynamicalMatrix::create_groupmap() //find number of local atoms in the group (final_gid) for (int i=1; i<=natoms; i++){ local_idx = atom->map(i); - if (mask[local_idx] & groupbit && local_idx < nlocal) + if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit) gid += 1; // gid at the end of loop is final_Gid } //create an array of length final_gid @@ -495,7 +510,7 @@ void DynamicalMatrix::create_groupmap() //create a map between global atom id and group atom id for each proc for (int i=1; i<=natoms; i++){ local_idx = atom->map(i); - if (mask[local_idx] & groupbit && local_idx < nlocal){ + if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit){ sub_groupmap[gid] = i; gid += 1; } @@ -515,7 +530,7 @@ 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); - std::sort(temp_groupmap,temp_groupmap+group->count(igroup)); + std::sort(temp_groupmap,temp_groupmap+ngatoms); //populate member groupmap based on temp groupmap for (int i=0; i Date: Tue, 5 Feb 2019 17:52:28 -0800 Subject: [PATCH 0105/1242] minor dynmat changes and start of third order changes --- src/USER-PHONON/dynamical_matrix.cpp | 76 +++++----- src/USER-PHONON/dynamical_matrix.h | 2 +- src/USER-PHONON/third_order.cpp | 201 ++++++++++++++++++--------- src/USER-PHONON/third_order.h | 5 +- 4 files changed, 180 insertions(+), 104 deletions(-) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index 7d4caad226..854d46adca 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -80,7 +80,7 @@ void DynamicalMatrix::setup() update_force(); //if all then skip communication groupmap population - if (ngatoms == atom->natoms) + if (gcount == atom->natoms) for (int i=0; inatoms; i++) groupmap[i] = i; else @@ -113,8 +113,8 @@ void DynamicalMatrix::command(int narg, char **arg) igroup = group->find(arg[0]); if (igroup == -1) error->all(FLERR,"Could not find dynamical matrix group ID"); groupbit = group->bitmask[igroup]; - ngatoms = group->count(igroup); - dynlen = (ngatoms)*3; + gcount = group->count(igroup); + dynlen = (gcount)*3; memory->create(groupmap,atom->natoms,"total_group_map:totalgm"); update->setupflag = 1; @@ -260,44 +260,42 @@ void DynamicalMatrix::calculateMatrix() for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); - if (local_idx >= 0){ - 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_jdx >= 0 && local_jdx < nlocal - && gm[i-1] >= 0 && gm[j-1] >= 0){ - for (int beta=0; beta<3; beta++){ - dynmat[alpha][(gm[j-1])*3+beta] = -f[local_jdx][beta]; - } + 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){ + for (int beta=0; beta<3; beta++){ + dynmat[alpha][(gm[j-1])*3+beta] = -f[local_jdx][beta]; } } - displace_atom(local_idx,alpha,-2); - update_force(); - for (bigint j=1; j<=natoms; j++){ - local_jdx = atom->map(j); - if (local_jdx >= 0 && local_jdx < nlocal - && gm[i-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; - } - } - } - displace_atom(local_idx,alpha,1); } - for (int k=0; k<3; k++) - MPI_Reduce(dynmat[k],fdynmat[k],dynlen,MPI_DOUBLE,MPI_SUM,0,world); - if (me == 0) - writeMatrix(fdynmat); - dynmat_clear(dynmat); + displace_atom(local_idx,alpha,-2); + 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){ + 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; + } + } + } + displace_atom(local_idx,alpha,1); } + for (int k=0; k<3; k++) + MPI_Reduce(dynmat[k],fdynmat[k],dynlen,MPI_DOUBLE,MPI_SUM,0,world); + if (me == 0) + writeMatrix(fdynmat); + dynmat_clear(dynmat); } for (int i=0; i < 3; i++) @@ -530,7 +528,7 @@ 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); - std::sort(temp_groupmap,temp_groupmap+ngatoms); + std::sort(temp_groupmap,temp_groupmap+gcount); //populate member groupmap based on temp groupmap for (int i=0; i using namespace LAMMPS_NS; @@ -72,28 +73,16 @@ void ThirdOrder::setup() neighbor->ndanger = 0; // compute all forces - force_clear(); + update_force(); external_force_clear = 0; - eflag=0; vflag=0; - if (pair_compute_flag) force->pair->compute(eflag,vflag); - else if (force->pair) force->pair->compute_dummy(eflag,vflag); - if (atom->molecular) { - if (force->bond) force->bond->compute(eflag,vflag); - if (force->angle) force->angle->compute(eflag,vflag); - if (force->dihedral) force->dihedral->compute(eflag,vflag); - if (force->improper) force->improper->compute(eflag,vflag); - } - - if (force->kspace) { - force->kspace->setup(); - if (kspace_compute_flag) force->kspace->compute(eflag,vflag); - else force->kspace->compute_dummy(eflag,vflag); - } - - if (force->newton) comm->reverse_comm(); + if (gcount == atom->natoms) + for (int i=0; inatoms; i++) + groupmap[i] = i; + else + create_groupmap(); } /* ---------------------------------------------------------------------- */ @@ -148,14 +137,20 @@ void ThirdOrder::command(int narg, char **arg) if (style == REGULAR) { setup(); + timer->init(); + timer->barrier_start(); calculateMatrix(); + timer->barrier_stop(); } if (style == BALLISTICO) { setup(); convert_units(update->unit_style); conversion = conv_energy/conv_distance/conv_distance; + timer->init(); + timer->barrier_start(); calculateMatrix(); + timer->barrier_stop(); } Finish finish(lmp); @@ -240,37 +235,78 @@ void ThirdOrder::calculateMatrix() int local_idx; // local index int local_jdx; // second local index int local_kdx; // third local index + int nlocal = atom->nlocal; int natoms = atom->natoms; - int *mask = atom->mask; + int *gm = groupmap; double **f = atom->f; - energy_force(0); + update_force(); if (comm->me == 0 && screen) fprintf(screen,"Calculating Anharmonic Dynamical Matrix...\n"); - for (int i=1; i<=natoms; i++){ + for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); - if (local_idx >= 0 && mask[local_idx] && groupbit){ - for (int alpha=0; alpha<3; alpha++){ - displace_atom(local_idx, alpha, 1); - for (int j=1; j<=natoms; j++){ - local_jdx = atom->map(j); - if (local_jdx >= 0&& mask[local_jdx] && groupbit){ - for (int beta=0; beta<3; beta++){ + for (bigint alpha=0; alpha<3; alpha++){ + displace_atom(local_idx, alpha, 1); + for (bigint j=1; j<=natoms; j++){ + local_jdx = atom->map(j); + for (int beta=0; beta<3; beta++){ + displace_atom(local_jdx, beta, 1); + update_force(); + for (bigint k=1; k<=natoms; k++){ + local_kdx = atom->map(k); + for (int gamma=0; gamma<3; gamma++){ + if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 + && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 + && local_kdx < nlocal) { + //first_derv[k*3+gamma] = f[k][gamma]; + } } } - } - displace_atom(local_idx,alpha,-2); - for (int j=1; j<=natoms; j++){ - local_jdx = atom->map(j); - if (local_jdx >= 0 && mask[local_jdx] && groupbit){ - for (int beta=0; beta<3; beta++){ - + displace_atom(local_jdx, beta, -2); + update_force(); + for (bigint k=1; k<=natoms; k++){ + local_kdx = atom->map(k); + for (int gamma=0; gamma<3; gamma++){ + if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 + && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 + && local_kdx < nlocal) { + } } } + displace_atom(local_jdx, beta, 1); } - displace_atom(local_idx,alpha,1); } + displace_atom(local_idx,alpha,-2); + for (bigint j=1; j<=natoms; j++){ + local_jdx = atom->map(j); + for (int beta=0; beta<3; beta++){ + displace_atom(local_jdx, beta, 1); + update_force(); + for (bigint k=1; k<=natoms; k++){ + local_kdx = atom->map(k); + for (int gamma=0; gamma<3; gamma++){ + if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 + && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 + && local_kdx < nlocal) { + } + } + } + displace_atom(local_jdx, beta, -2); + update_force(); + for (bigint k=1; k<=natoms; k++){ + local_kdx = atom->map(k); + for (int gamma=0; gamma<3; gamma++){ + if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 + && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 + && local_kdx < nlocal) { + } + } + } + displace_atom(local_jdx, beta, 1); + } + } + displace_atom(local_idx,alpha,1); } } @@ -397,34 +433,8 @@ void ThirdOrder::displace_atom(int local_idx, int direction, int magnitude) return negative gradient for nextra_global dof in fextra ------------------------------------------------------------------------- */ -void ThirdOrder::energy_force(int resetflag) +void ThirdOrder::update_force() { - // check for reneighboring - // always communicate since atoms move - int nflag = neighbor->decide(); - - if (nflag == 0) { - timer->stamp(); - comm->forward_comm(); - timer->stamp(Timer::COMM); - } else { - if (triclinic) domain->x2lamda(atom->nlocal); - domain->pbc(); - if (domain->box_change) { - domain->reset_box(); - comm->setup(); - if (neighbor->style) neighbor->setup_bins(); - } - timer->stamp(); - - comm->borders(); - if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - timer->stamp(Timer::COMM); - - neighbor->build(1); - timer->stamp(Timer::NEIGH); - } - force_clear(); timer->stamp(); @@ -527,3 +537,68 @@ void ThirdOrder::convert_units(const char *style) } else error->all(FLERR,"Units Type Conversion Not Found"); } + +/* ---------------------------------------------------------------------- */ + +void ThirdOrder::create_groupmap() +{ + //Create a group map which maps atom order onto group + + int local_idx; // local index + int gid = 0; //group index + int nlocal = atom->nlocal; + int *mask = atom->mask; + bigint natoms = atom->natoms; + int *recv = new int[comm->nprocs]; + int *displs = new int[comm->nprocs]; + int *temp_groupmap = new int[natoms]; + + //find number of local atoms in the group (final_gid) + for (int i=1; i<=natoms; i++){ + local_idx = atom->map(i); + if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit) + gid += 1; // gid at the end of loop is final_Gid + } + //create an array of length final_gid + int *sub_groupmap = new int[gid]; + + gid = 0; + //create a map between global atom id and group atom id for each proc + for (int i=1; i<=natoms; i++){ + local_idx = atom->map(i); + if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit){ + sub_groupmap[gid] = i; + gid += 1; + } + } + + //populate arrays for Allgatherv + for (int i=0; inprocs; i++){ + recv[i] = 0; + } + recv[comm->me] = gid; + MPI_Allreduce(recv,displs,4,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]; + else displs[i] = 0; + } + + //combine subgroup maps into total temporary groupmap + MPI_Allgatherv(sub_groupmap,gid,MPI_INT,temp_groupmap,recv,displs,MPI_INT,world); + std::sort(temp_groupmap,temp_groupmap+gcount); + + //populate member groupmap based on temp groupmap + for (int i=0; i Date: Wed, 6 Feb 2019 11:35:33 -0700 Subject: [PATCH 0106/1242] Commit JT 020619 - correction gneb/spin - run but do not converge yet - check forces --- src/REPLICA/neb_spin.cpp | 167 +++++++++++++++++++++++++-------------- 1 file changed, 108 insertions(+), 59 deletions(-) diff --git a/src/REPLICA/neb_spin.cpp b/src/REPLICA/neb_spin.cpp index 60d44d1875..8780cb9a0a 100644 --- a/src/REPLICA/neb_spin.cpp +++ b/src/REPLICA/neb_spin.cpp @@ -143,11 +143,11 @@ NEB_spin::~NEB_spin() void NEB_spin::command(int narg, char **arg) { - printf("test 1 \n"); + //printf("test 1 \n"); // test 1 double **sp1 = atom->sp; - printf("test 1 atom: i=%d,%g,%g,%g \n",1,sp1[1][0],sp1[1][1],sp1[1][2]); + //printf("test 1 atom: i=%d,%g,%g,%g \n",1,sp1[1][0],sp1[1][1],sp1[1][2]); //error->all(FLERR,"end neb_spin test"); @@ -212,8 +212,8 @@ void NEB_spin::command(int narg, char **arg) // test 1 double **sp = atom->sp; - printf("test 2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); - error->all(FLERR,"end neb_spin test"); + //printf("test 2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); + //error->all(FLERR,"end neb_spin test"); // run the NEB_spin calculation @@ -680,7 +680,7 @@ void NEB_spin::readfile(char *file, int flag) // test 1.2 //double **sp = atom->sp; - printf("test 1.2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); + //printf("test 1.2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); //error->all(FLERR,"end neb_spin test"); @@ -760,13 +760,13 @@ void NEB_spin::readfile(char *file, int flag) //domain->minimum_image(delx,dely,delz); // test - printf("spinit: %g %g %g \n",spinit[0],spinit[1],spinit[2]); - printf("spfinal bef: %g %g %g \n",spfinal[0],spfinal[1],spfinal[2]); + //printf("spinit: %g %g %g \n",spinit[0],spinit[1],spinit[2]); + //printf("spfinal bef: %g %g %g \n",spfinal[0],spfinal[1],spfinal[2]); initial_rotation(spinit,spfinal,fraction); // test - printf("spfinal aft: %g %g %g \n",spfinal[0],spfinal[1],spfinal[2]); + //printf("spfinal aft: %g %g %g \n",spfinal[0],spfinal[1],spfinal[2]); sp[m][0] = spfinal[0]; sp[m][1] = spfinal[1]; @@ -797,7 +797,7 @@ void NEB_spin::readfile(char *file, int flag) // test 1.3 //double **sp = atom->sp; - printf("test 1.3 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); + //printf("test 1.3 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); //error->all(FLERR,"end neb_spin test"); @@ -841,65 +841,101 @@ void NEB_spin::readfile(char *file, int flag) void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) { - // implementing initial rotation using atan2 - //atan2(crosslen,dots); - - - - double theta,spdot; - double inormdot,ispinorm; - double kix,kiy,kiz; - double kinorm, ikinorm; - double crossx,crossy,crossz; - //printf("inside rot, spi %g, spf %g \n",spi[0],sploc[0]); + // this is not a sufficient routine, + // we need more accurate verifications - spdot = spi[0]*sploc[0]+spi[1]*sploc[1]+spi[2]*sploc[2]; - theta = fraction*acos(spdot); + + // initial and final and inter ang. values + double itheta,iphi,ftheta,fphi,ktheta,kphi; + double spix,spiy,spiz,spfx,spfy,spfz; + double spkx,spky,spkz,iknorm; + + spix = spi[0]; + spiy = spi[1]; + spiz = spi[2]; + + spfx = sploc[0]; + spfy = sploc[1]; + spfz = sploc[2]; + + iphi = acos(spiz); + itheta = acos(spix/sin(iphi)); + + fphi = acos(spfz); + ftheta = acos(spfx/sin(fphi)); - printf("inside rot, theta %g \n",theta); - - kix = spi[1]*sploc[2]-spi[2]*sploc[1]; - kiy = spi[2]*sploc[0]-spi[0]*sploc[2]; - kiz = spi[0]*sploc[1]-spi[1]*sploc[0]; - - //printf("inside rot1.1, ki %g %g %g \n",kix,kiy,kiz); - - inormdot = 1.0/sqrt(spdot); - kinorm = kix*kix+kiy*kiy+kiz*kiz; - if (kinorm == 0.0) { - kix = 0.0; - kiy = 0.0; - kiz = 0.0; - } else { - ikinorm = 1.0/kinorm; - kix *= ikinorm; - kiy *= ikinorm; - kiz *= ikinorm; - } + kphi = iphi + fraction*(fphi-iphi); + ktheta = itheta + fraction*(ftheta-itheta); - //printf("inside rot1.2, kin %g %g %g \n",kix,kiy,kiz); + spkx = cos(ktheta)*sin(kphi); + spky = sin(ktheta)*sin(kphi); + spkz = cos(kphi); - crossx = kiy*spi[2]-kiz*spi[1]; - crossy = kiz*spi[0]-kix*spi[2]; - crossz = kix*spi[1]-kiy*spi[0]; - - //printf("inside rot1.3, cross %g %g %g \n",crossx,crossy,crossz); + iknorm = spkx*spkx+spky*spky+spkz*spkz; - sploc[0] = spi[0]*cos(theta)+crossx*sin(theta); - sploc[1] = spi[1]*cos(theta)+crossy*sin(theta); - sploc[2] = spi[2]*cos(theta)+crossz*sin(theta); + spkx *= iknorm; + spky *= iknorm; + spkz *= iknorm; + + sploc[0] = spkx; + sploc[1] = spky; + sploc[2] = spkz; + //double theta,spdot; + //double inormdot,ispinorm; + //double kix,kiy,kiz; + //double kinorm, ikinorm; + //double crossx,crossy,crossz; + + ////printf("inside rot, spi %g, spf %g \n",spi[0],sploc[0]); + + //spdot = spi[0]*sploc[0]+spi[1]*sploc[1]+spi[2]*sploc[2]; + //theta = fraction*acos(spdot); + + //printf("inside rot, theta %g \n",theta); + + //kix = spi[1]*sploc[2]-spi[2]*sploc[1]; + //kiy = spi[2]*sploc[0]-spi[0]*sploc[2]; + //kiz = spi[0]*sploc[1]-spi[1]*sploc[0]; + // + ////printf("inside rot1.1, ki %g %g %g \n",kix,kiy,kiz); + + //inormdot = 1.0/sqrt(spdot); + //kinorm = kix*kix+kiy*kiy+kiz*kiz; + //if (kinorm == 0.0) { + // kix = 0.0; + // kiy = 0.0; + // kiz = 0.0; + //} else { + // ikinorm = 1.0/kinorm; + // kix *= ikinorm; + // kiy *= ikinorm; + // kiz *= ikinorm; + //} + + ////printf("inside rot1.2, kin %g %g %g \n",kix,kiy,kiz); + + //crossx = kiy*spi[2]-kiz*spi[1]; + //crossy = kiz*spi[0]-kix*spi[2]; + //crossz = kix*spi[1]-kiy*spi[0]; + // + ////printf("inside rot1.3, cross %g %g %g \n",crossx,crossy,crossz); + + //sploc[0] = spi[0]*cos(theta)+crossx*sin(theta); + //sploc[1] = spi[1]*cos(theta)+crossy*sin(theta); + //sploc[2] = spi[2]*cos(theta)+crossz*sin(theta); + // + ////printf("inside rot2, spf %g %g %g \n",sploc[0],sploc[1],sploc[2]); + + //ispinorm = 1.0/sqrt(sploc[0]*sploc[0]+sploc[1]*sploc[1]+sploc[2]*sploc[2]); + + //sploc[0] *= ispinorm; + //sploc[1] *= ispinorm; + //sploc[2] *= ispinorm; //printf("inside rot2, spf %g %g %g \n",sploc[0],sploc[1],sploc[2]); - - ispinorm = 1.0/sqrt(sploc[0]*sploc[0]+sploc[1]*sploc[1]+sploc[2]*sploc[2]); - - sploc[0] *= ispinorm; - sploc[1] *= ispinorm; - sploc[2] *= ispinorm; - printf("inside rot2, spf %g %g %g \n",sploc[0],sploc[1],sploc[2]); } /* ---------------------------------------------------------------------- @@ -943,7 +979,20 @@ void NEB_spin::open(char *file) void NEB_spin::print_status() { - double fnorm2 = sqrt(update->minimize->fnorm_sqr()); + + //double fnorm2 = sqrt(update->minimize->fnorm_sqr()); + + // test fmax spin + int nlocal = atom->nlocal; + double **fm = atom->fm; + double fnorm2; + for (int i = 0; i < nlocal; i++) + fnorm2 += (fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]); + //for (int i = 0; i < nlocal; i++) + // if (mask[i] & groupbit) { + // fnorm2 += (fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]); + // } + double fmaxreplica; MPI_Allreduce(&fnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); double fnorminf = update->minimize->fnorm_inf(); From 490f67d332927091bc58ad02b2499b3414a0a590 Mon Sep 17 00:00:00 2001 From: casievers Date: Wed, 6 Feb 2019 12:05:41 -0800 Subject: [PATCH 0107/1242] third order tensor calculator --- src/USER-PHONON/dynamical_matrix.cpp | 14 ++- src/USER-PHONON/third_order.cpp | 167 ++++++++++----------------- src/USER-PHONON/third_order.h | 2 + 3 files changed, 70 insertions(+), 113 deletions(-) diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index 854d46adca..da98a23a7d 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -81,7 +81,7 @@ void DynamicalMatrix::setup() //if all then skip communication groupmap population if (gcount == atom->natoms) - for (int i=0; inatoms; i++) + for (bigint i=0; inatoms; i++) groupmap[i] = i; else create_groupmap(); @@ -268,7 +268,7 @@ void DynamicalMatrix::calculateMatrix() if (local_idx >= 0 && local_jdx >= 0 && local_jdx < nlocal && gm[i-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]; } } } @@ -321,7 +321,7 @@ void DynamicalMatrix::writeMatrix(double **dynmat) if (!binaryflag && fp) { clearerr(fp); for (int i = 0; i < 3; i++) { - for (int j = 0; j < dynlen; j++) { + 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]); } @@ -344,6 +344,8 @@ void DynamicalMatrix::writeMatrix(double **dynmat) void DynamicalMatrix::displace_atom(int local_idx, int direction, int magnitude) { + if (local_idx < 0) return; + double **x = atom->x; int *sametag = atom->sametag; int j = local_idx; @@ -496,7 +498,7 @@ void DynamicalMatrix::create_groupmap() int *temp_groupmap = new int[natoms]; //find number of local atoms in the group (final_gid) - for (int i=1; i<=natoms; i++){ + for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit) gid += 1; // gid at the end of loop is final_Gid @@ -506,7 +508,7 @@ void DynamicalMatrix::create_groupmap() gid = 0; //create a map between global atom id and group atom id for each proc - for (int i=1; i<=natoms; i++){ + for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit){ sub_groupmap[gid] = i; @@ -531,7 +533,7 @@ void DynamicalMatrix::create_groupmap() std::sort(temp_groupmap,temp_groupmap+gcount); //populate member groupmap based on temp groupmap - for (int i=0; inatoms) - for (int i=0; inatoms; i++) + for (bigint i=0; inatoms; i++) groupmap[i] = i; else create_groupmap(); @@ -111,6 +111,8 @@ void ThirdOrder::command(int narg, char **arg) igroup = group->find(arg[0]); if (igroup == -1) error->all(FLERR,"Could not find dynamical matrix group ID"); groupbit = group->bitmask[igroup]; + gcount = group->count(igroup); + dynlen = (gcount)*3; update->setupflag = 1; int style = -1; @@ -187,7 +189,7 @@ void ThirdOrder::options(int narg, char **arg) iarg += 2; } else error->all(FLERR,"Illegal dynamical_matrix command"); } - if (file_flag == 1) { + if (file_flag == 1 and me == 0) { openfile(filename); } } @@ -240,17 +242,20 @@ void ThirdOrder::calculateMatrix() int *gm = groupmap; double **f = atom->f; - update_force(); + double *dynmat = new double[3*dynlen]; + double *fdynmat = new double[3*dynlen]; + memset(&dynmat[0],0,dynlen*sizeof(double)); + memset(&fdynmat[0],0,dynlen*sizeof(double)); if (comm->me == 0 && screen) fprintf(screen,"Calculating Anharmonic Dynamical Matrix...\n"); for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); for (bigint alpha=0; alpha<3; alpha++){ - displace_atom(local_idx, alpha, 1); for (bigint j=1; j<=natoms; j++){ local_jdx = atom->map(j); for (int beta=0; beta<3; beta++){ + displace_atom(local_idx, alpha, 1); displace_atom(local_jdx, beta, 1); update_force(); for (bigint k=1; k<=natoms; k++){ @@ -259,7 +264,7 @@ void ThirdOrder::calculateMatrix() if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 && local_kdx < nlocal) { - //first_derv[k*3+gamma] = f[k][gamma]; + dynmat[gm[k-1]*3+gamma] += f[local_kdx][gamma]; } } } @@ -271,16 +276,12 @@ void ThirdOrder::calculateMatrix() if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 && local_kdx < nlocal) { + dynmat[gm[k-1]*3+gamma] -= f[local_kdx][gamma]; } } } displace_atom(local_jdx, beta, 1); - } - } - displace_atom(local_idx,alpha,-2); - for (bigint j=1; j<=natoms; j++){ - local_jdx = atom->map(j); - for (int beta=0; beta<3; beta++){ + displace_atom(local_idx,alpha,-2); displace_atom(local_jdx, beta, 1); update_force(); for (bigint k=1; k<=natoms; k++){ @@ -289,6 +290,7 @@ void ThirdOrder::calculateMatrix() if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 && local_kdx < nlocal) { + dynmat[gm[k-1]*3+gamma] -= f[local_kdx][gamma]; } } } @@ -300,119 +302,70 @@ void ThirdOrder::calculateMatrix() if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 && local_kdx < nlocal) { + dynmat[gm[k-1]*3+gamma] += f[local_kdx][gamma]; + dynmat[gm[k-1]*3+gamma] /= -(4 * del * del); } } } displace_atom(local_jdx, beta, 1); + displace_atom(local_idx, alpha, 1); + MPI_Reduce(dynmat,fdynmat,3*dynlen,MPI_DOUBLE,MPI_SUM,0,world); + if (me == 0){ + writeMatrix(fdynmat, gm[i-1], alpha, gm[j-1], beta); + } + memset(&dynmat[0],0,dynlen*sizeof(double)); } } - displace_atom(local_idx,alpha,1); } } - //for (int proc1=0; proc1 < comm->nprocs; proc1++) { - // plocal1 = atom->nlocal; // 1 proc nlocal = 8 - // MPI_Bcast(&plocal1, 1, MPI_INT, proc1, MPI_COMM_WORLD); // plocal1 = 8 - // for (int i = 0; i < plocal1; i++) { - // if (me==proc1 & mask[i] & groupbit) - // group_flag_1 = 1; - // MPI_Bcast(&group_flag_1, 1, MPI_INT, proc1, MPI_COMM_WORLD); - // if (group_flag_1) { - // if (me == proc1) id1 = aid[i]; - // MPI_Bcast(&id1, 1, MPI_INT, proc1, MPI_COMM_WORLD); - // for (int alpha = 0; alpha < 3; alpha++) { - // for (int proc2 = 0; proc2 < comm->nprocs; proc2++) { - // plocal2 = atom->nlocal; - // MPI_Bcast(&plocal2, 1, MPI_INT, proc2, MPI_COMM_WORLD); - // for (int j = 0; j < plocal2; j++) { - // if (me==proc2 & mask[j] & groupbit) - // group_flag_2 = 1; - // MPI_Bcast(&group_flag_2, 1, MPI_INT, proc2, MPI_COMM_WORLD); - // if (mask[j] & groupbit) { - // if (me == proc2) id2 = aid[j]; - // MPI_Bcast(&id2, 1, MPI_INT, proc2, MPI_COMM_WORLD); - // for (int beta = 0; beta < 3; beta++) { -// - // if (me == proc1) x[i][alpha] += del; -// - // if (me == proc2) x[j][beta] += del; - // energy_force(0); -//// - // for (int gamma = 0; gamma < 3; gamma++) { - // for (int k = 0; k < nlocal; k++) - // if (mask[k] & groupbit) { - // first_derv[k*3+gamma] = f[k][gamma]; - // } - // } -// - // if (me == proc2) x[j][beta] -= 2 * del; - // energy_force(0); -//// - // for (int gamma = 0; gamma < 3; gamma++) { - // for (int k = 0; k < nlocal; k++) - // if (mask[k] & groupbit) { - // first_derv[k*3+gamma] -= f[k][gamma]; - // } - // } -// - // if (me == proc2) x[j][beta] += 2 * del; -// - // if (me == proc1) x[i][alpha] -= 2 * del; -// - // energy_force(0); -//// - // for (int gamma = 0; gamma < 3; gamma++) { - // for (int k = 0; k < nlocal; k++) - // if (mask[k] & groupbit) { - // first_derv[k*3+gamma] -= f[k][gamma]; - // } - // } -//// - // if (me == proc2) x[j][beta] -= 2 * del; - // energy_force(0); -//// - // for (int k = 0; k < nlocal; k++) - // if (mask[k] & groupbit) { - // for (int gamma = 0; gamma < 3; gamma++) { - // first_derv[k*3+gamma] += f[k][gamma]; - // first_derv[k*3+gamma] /= -4*del*del; - // } - // double norm = pow(first_derv[k*3], 2) - // + pow(first_derv[k*3+1], 2) - // + pow(first_derv[k+3+2], 2); - // if (fp && norm > 1.0e-16) - // fprintf(fp, - // "%d %d %d %d %d %7.8f %7.8f %7.8f\n", - // id1, alpha + 1, id2, beta + 1, aid[k], - // first_derv[k*3] * conversion, - // first_derv[k*3+1] * conversion, - // first_derv[k*3+2] * conversion); - // } -//// - // if (me == proc2) x[j][beta] += del; -// - // if (me == proc1) x[i][alpha] += del; - // } - // } - // } - // } -//// - // } - // } - // } - //} -// + delete [] dynmat; + delete [] fdynmat; if (screen && me ==0 ) fprintf(screen,"Finished Calculating Third Order Tensor\n"); } +/* ---------------------------------------------------------------------- + write dynamical matrix +------------------------------------------------------------------------- */ + +void ThirdOrder::writeMatrix(double *dynmat, int i, int a, int j, int b) +{ + if (me != 0) + return; + + if (!binaryflag && fp) { + clearerr(fp); + for (int k = 0; k < gcount; k++){ + double norm = pow(dynmat[k*3], 2) + + pow(dynmat[k*3+1], 2) + + pow(dynmat[k+3+2], 2); + if (norm > 1.0e-16) + fprintf(fp, + "%d %d %d %d %d %7.8f %7.8f %7.8f\n", + i+1, a + 1, j+1, b + 1, groupmap[k]+1, + dynmat[k*3] * conversion, + dynmat[k*3+1] * conversion, + dynmat[k*3+2] * conversion); + } + } + else if (binaryflag && fp){ + clearerr(fp); + fwrite(&dynmat[0], sizeof(double), dynlen, fp); + } + if (ferror(fp)) error->one(FLERR,"Error writing to file"); + +} + /* ---------------------------------------------------------------------- Displace atoms ---------------------------------------------------------------------- */ void ThirdOrder::displace_atom(int local_idx, int direction, int magnitude) { + if (local_idx < 0) return; + double **x = atom->x; int *sametag = atom->sametag; int j = local_idx; @@ -554,7 +507,7 @@ void ThirdOrder::create_groupmap() int *temp_groupmap = new int[natoms]; //find number of local atoms in the group (final_gid) - for (int i=1; i<=natoms; i++){ + for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit) gid += 1; // gid at the end of loop is final_Gid @@ -564,7 +517,7 @@ void ThirdOrder::create_groupmap() gid = 0; //create a map between global atom id and group atom id for each proc - for (int i=1; i<=natoms; i++){ + for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit){ sub_groupmap[gid] = i; @@ -589,7 +542,7 @@ void ThirdOrder::create_groupmap() std::sort(temp_groupmap,temp_groupmap+gcount); //populate member groupmap based on temp groupmap - for (int i=0; i Date: Wed, 6 Feb 2019 14:42:37 -0700 Subject: [PATCH 0108/1242] Add team-based calcs to some KOKKOS package pair_styles --- src/KOKKOS/kokkos.cpp | 8 + src/KOKKOS/kokkos.h | 1 + src/KOKKOS/kokkos_type.h | 46 +++++ src/KOKKOS/pair_kokkos.h | 393 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 439 insertions(+), 9 deletions(-) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 9973b5a688..5d041bcbb0 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -192,6 +192,7 @@ KokkosLMP::KokkosLMP(LAMMPS *lmp, int narg, char **arg) : Pointers(lmp) forward_comm_on_host = 0; reverse_comm_on_host = 0; gpu_direct_flag = 1; + team_flag = 0; #if KOKKOS_USE_CUDA // only if we can safely detect, that GPU-direct is not available, change default @@ -228,6 +229,7 @@ void KokkosLMP::accelerator(int narg, char **arg) exchange_comm_classic = forward_comm_classic = reverse_comm_classic = 0; exchange_comm_on_host = forward_comm_on_host = reverse_comm_on_host = 0; gpu_direct_flag = 1; + team_flag = 0; int iarg = 0; while (iarg < narg) { @@ -317,6 +319,12 @@ void KokkosLMP::accelerator(int narg, char **arg) else if (strcmp(arg[iarg+1],"on") == 0) gpu_direct_flag = 1; else error->all(FLERR,"Illegal package kokkos command"); iarg += 2; + } else if (strcmp(arg[iarg],"team") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal package kokkos command"); + if (strcmp(arg[iarg+1],"off") == 0) team_flag = 0; + else if (strcmp(arg[iarg+1],"on") == 0) team_flag = 1; + else error->all(FLERR,"Illegal package kokkos command"); + iarg += 2; } else error->all(FLERR,"Illegal package kokkos command"); } diff --git a/src/KOKKOS/kokkos.h b/src/KOKKOS/kokkos.h index cd429d5c1c..a665329d70 100644 --- a/src/KOKKOS/kokkos.h +++ b/src/KOKKOS/kokkos.h @@ -36,6 +36,7 @@ class KokkosLMP : protected Pointers { int numa; int auto_sync; int gpu_direct_flag; + int team_flag; KokkosLMP(class LAMMPS *, int, char **); ~KokkosLMP(); diff --git a/src/KOKKOS/kokkos_type.h b/src/KOKKOS/kokkos_type.h index b88c92ff73..16d7c3cbd2 100644 --- a/src/KOKKOS/kokkos_type.h +++ b/src/KOKKOS/kokkos_type.h @@ -448,6 +448,52 @@ struct s_EV_FLOAT_REAX { }; typedef struct s_EV_FLOAT_REAX EV_FLOAT_REAX; +struct s_FEV_FLOAT { + F_FLOAT f[3]; + E_FLOAT evdwl; + E_FLOAT ecoul; + E_FLOAT v[6]; + KOKKOS_INLINE_FUNCTION + s_FEV_FLOAT() { + f[0] = 0; f[1] = 0; f[2] = 0; + evdwl = 0; + ecoul = 0; + v[0] = 0; v[1] = 0; v[2] = 0; + v[3] = 0; v[4] = 0; v[5] = 0; + } + + KOKKOS_INLINE_FUNCTION + void operator+=(const s_FEV_FLOAT &rhs) { + f[0] += rhs.f[0]; + f[1] += rhs.f[1]; + f[2] += rhs.f[2]; + evdwl += rhs.evdwl; + ecoul += rhs.ecoul; + v[0] += rhs.v[0]; + v[1] += rhs.v[1]; + v[2] += rhs.v[2]; + v[3] += rhs.v[3]; + v[4] += rhs.v[4]; + v[5] += rhs.v[5]; + } + + KOKKOS_INLINE_FUNCTION + void operator+=(const volatile s_FEV_FLOAT &rhs) volatile { + f[0] += rhs.f[0]; + f[1] += rhs.f[1]; + f[2] += rhs.f[2]; + evdwl += rhs.evdwl; + ecoul += rhs.ecoul; + v[0] += rhs.v[0]; + v[1] += rhs.v[1]; + v[2] += rhs.v[2]; + v[3] += rhs.v[3]; + v[4] += rhs.v[4]; + v[5] += rhs.v[5]; + } +}; +typedef struct s_FEV_FLOAT FEV_FLOAT; + #ifndef PREC_POS #define PREC_POS PRECISION #endif diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index ab616d2c07..8758b2f03c 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -86,6 +86,7 @@ struct PairComputeFunctor { NeighListKokkos* list_ptr): c(*c_ptr),list(*list_ptr) { // allocate duplicated memory + f = c.f; dup_f = Kokkos::Experimental::create_scatter_view::value >(c.f); dup_eatom = Kokkos::Experimental::create_scatter_view::value >(c.d_eatom); dup_vatom = Kokkos::Experimental::create_scatter_view::value >(c.d_vatom); @@ -255,6 +256,329 @@ struct PairComputeFunctor { return ev; } + // Use TeamPolicy, assume Newton off, Full Neighborlist, and no energy/virial + // Loop over neighbors of one atom without coulomb interaction + // This function is called in parallel + KOKKOS_FUNCTION + void compute_item_team(Kokkos::TeamPolicy<>::member_type team, + const NeighListKokkos &list, const NoCoulTag&) const { + + const int inum = team.league_size(); + const int atoms_per_team = team.team_size(); + const int firstatom = team.league_rank()*atoms_per_team; + const int lastatom = firstatom + atoms_per_team < inum ? firstatom + atoms_per_team : inum; + Kokkos::parallel_for(Kokkos::TeamThreadRange(team, firstatom, lastatom), [&] (const int &ii) { + + const int i = list.d_ilist[ii]; + const X_FLOAT xtmp = c.x(i,0); + const X_FLOAT ytmp = c.x(i,1); + const X_FLOAT ztmp = c.x(i,2); + const int itype = c.type(i); + + const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); + const int jnum = list.d_numneigh[i]; + + t_scalar3 fsum; + + Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team,jnum), + [&] (const int jj, t_scalar3& ftmp) { + + int j = neighbors_i(jj); + const F_FLOAT factor_lj = c.special_lj[sbmask(j)]; + j &= NEIGHMASK; + const X_FLOAT delx = xtmp - c.x(j,0); + const X_FLOAT dely = ytmp - c.x(j,1); + const X_FLOAT delz = ztmp - c.x(j,2); + const int jtype = c.type(j); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + if(rsq < (STACKPARAMS?c.m_cutsq[itype][jtype]:c.d_cutsq(itype,jtype))) { + + const F_FLOAT fpair = factor_lj*c.template compute_fpair(rsq,i,j,itype,jtype); + + ftmp.x += delx*fpair; + ftmp.y += dely*fpair; + ftmp.z += delz*fpair; + } + + },fsum); + + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) += fsum.x; + f(i,1) += fsum.y; + f(i,2) += fsum.z; + }); + + }); + } + + // Use TeamPolicy, assume Newton off, Full Neighborlist, and no energy/virial + // Loop over neighbors of one atom with coulomb interaction + // This function is called in parallel + KOKKOS_FUNCTION + void compute_item_team(Kokkos::TeamPolicy<>::member_type team, + const NeighListKokkos &list, const CoulTag& ) const { + + const int inum = team.league_size(); + const int atoms_per_team = team.team_size(); + int firstatom = team.league_rank()*atoms_per_team; + int lastatom = firstatom + atoms_per_team < inum ? firstatom + atoms_per_team : inum; + Kokkos::parallel_for(Kokkos::TeamThreadRange(team, firstatom, lastatom), [&] (const int &ii) { + + const int i = list.d_ilist[ii]; + const X_FLOAT xtmp = c.x(i,0); + const X_FLOAT ytmp = c.x(i,1); + const X_FLOAT ztmp = c.x(i,2); + const int itype = c.type(i); + const F_FLOAT qtmp = c.q(i); + + const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); + const int jnum = list.d_numneigh[i]; + + t_scalar3 fsum; + + Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team,jnum), + [&] (const int jj, t_scalar3& ftmp) { + int j = neighbors_i(jj); + const F_FLOAT factor_lj = c.special_lj[sbmask(j)]; + const F_FLOAT factor_coul = c.special_coul[sbmask(j)]; + j &= NEIGHMASK; + const X_FLOAT delx = xtmp - c.x(j,0); + const X_FLOAT dely = ytmp - c.x(j,1); + const X_FLOAT delz = ztmp - c.x(j,2); + const int jtype = c.type(j); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + if(rsq < (STACKPARAMS?c.m_cutsq[itype][jtype]:c.d_cutsq(itype,jtype))) { + + F_FLOAT fpair = F_FLOAT(); + + if(rsq < (STACKPARAMS?c.m_cut_ljsq[itype][jtype]:c.d_cut_ljsq(itype,jtype))) + fpair+=factor_lj*c.template compute_fpair(rsq,i,j,itype,jtype); + if(rsq < (STACKPARAMS?c.m_cut_coulsq[itype][jtype]:c.d_cut_coulsq(itype,jtype))) + fpair+=c.template compute_fcoul(rsq,i,j,itype,jtype,factor_coul,qtmp); + + ftmp.x += delx*fpair; + ftmp.y += dely*fpair; + ftmp.z += delz*fpair; + } + },fsum); + + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) += fsum.x; + f(i,1) += fsum.y; + f(i,2) += fsum.z; + }); + }); + } + + + // Use TeamPolicy, assume Newton off, Full Neighborlist, and energy/virial + // Loop over neighbors of one atom without coulomb interaction + // This function is called in parallel + KOKKOS_FUNCTION + EV_FLOAT compute_item_team_ev(Kokkos::TeamPolicy<>::member_type team, + const NeighListKokkos &list, const NoCoulTag&) const { + + EV_FLOAT ev; + + const int inum = team.league_size(); + const int atoms_per_team = team.team_size(); + const int firstatom = team.league_rank()*atoms_per_team; + const int lastatom = firstatom + atoms_per_team < inum ? firstatom + atoms_per_team : inum; + Kokkos::parallel_for(Kokkos::TeamThreadRange(team, firstatom, lastatom), [&] (const int &ii) { + + + const int i = list.d_ilist[ii]; + const X_FLOAT xtmp = c.x(i,0); + const X_FLOAT ytmp = c.x(i,1); + const X_FLOAT ztmp = c.x(i,2); + const int itype = c.type(i); + + const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); + const int jnum = list.d_numneigh[i]; + + FEV_FLOAT fev; + + Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team,jnum), + [&] (const int jj, FEV_FLOAT& fev_tmp) { + + int j = neighbors_i(jj); + const F_FLOAT factor_lj = c.special_lj[sbmask(j)]; + j &= NEIGHMASK; + const X_FLOAT delx = xtmp - c.x(j,0); + const X_FLOAT dely = ytmp - c.x(j,1); + const X_FLOAT delz = ztmp - c.x(j,2); + const int jtype = c.type(j); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + if(rsq < (STACKPARAMS?c.m_cutsq[itype][jtype]:c.d_cutsq(itype,jtype))) { + + const F_FLOAT fpair = factor_lj*c.template compute_fpair(rsq,i,j,itype,jtype); + + fev_tmp.f[0] += delx*fpair; + fev_tmp.f[1] += dely*fpair; + fev_tmp.f[2] += delz*fpair; + + F_FLOAT evdwl = 0.0; + if (c.eflag) { + evdwl = factor_lj * c.template compute_evdwl(rsq,i,j,itype,jtype); + fev.evdwl += 0.5*evdwl; + } + if (c.vflag_either) { + fev.v[0] += 0.5*delx*delx*fpair; + fev.v[1] += 0.5*dely*dely*fpair; + fev.v[2] += 0.5*delz*delz*fpair; + fev.v[3] += 0.5*delx*dely*fpair; + fev.v[4] += 0.5*delx*delz*fpair; + fev.v[5] += 0.5*dely*delz*fpair; + } + } + },fev); + + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) += fev.f[0]; + f(i,1) += fev.f[1]; + f(i,2) += fev.f[2]; + + if (c.eflag_global) + ev.evdwl += fev.evdwl; + + if (c.eflag_atom) + d_eatom(i,0) += fev.evdwl; + + if (c.vflag_global) { + ev.v[0] += fev.v[0]; + ev.v[1] += fev.v[1]; + ev.v[2] += fev.v[2]; + ev.v[3] += fev.v[3]; + ev.v[4] += fev.v[4]; + ev.v[5] += fev.v[5]; + } + + if (c.vflag_atom) { + d_vatom(i,0) += fev.v[0]; + d_vatom(i,1) += fev.v[1]; + d_vatom(i,2) += fev.v[2]; + d_vatom(i,3) += fev.v[3]; + d_vatom(i,4) += fev.v[4]; + d_vatom(i,5) += fev.v[5]; + } + }); + }); + return ev; + } + + // Use TeamPolicy, assume Newton off, Full Neighborlist, and energy/virial + // Loop over neighbors of one atom with coulomb interaction + // This function is called in parallel + KOKKOS_FUNCTION + EV_FLOAT compute_item_team_ev(Kokkos::TeamPolicy<>::member_type team, + const NeighListKokkos &list, const CoulTag& ) const { + + EV_FLOAT ev; + + const int inum = team.league_size(); + const int atoms_per_team = team.team_size(); + int firstatom = team.league_rank()*atoms_per_team; + int lastatom = firstatom + atoms_per_team < inum ? firstatom + atoms_per_team : inum; + Kokkos::parallel_for(Kokkos::TeamThreadRange(team, firstatom, lastatom), [&] (const int &ii) { + + const int i = list.d_ilist[ii]; + const X_FLOAT xtmp = c.x(i,0); + const X_FLOAT ytmp = c.x(i,1); + const X_FLOAT ztmp = c.x(i,2); + const int itype = c.type(i); + const F_FLOAT qtmp = c.q(i); + + const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); + const int jnum = list.d_numneigh[i]; + + FEV_FLOAT fev; + + Kokkos::parallel_reduce(Kokkos::ThreadVectorRange(team,jnum), + [&] (const int jj, FEV_FLOAT& fev_tmp) { + int j = neighbors_i(jj); + const F_FLOAT factor_lj = c.special_lj[sbmask(j)]; + const F_FLOAT factor_coul = c.special_coul[sbmask(j)]; + j &= NEIGHMASK; + const X_FLOAT delx = xtmp - c.x(j,0); + const X_FLOAT dely = ytmp - c.x(j,1); + const X_FLOAT delz = ztmp - c.x(j,2); + const int jtype = c.type(j); + const F_FLOAT rsq = delx*delx + dely*dely + delz*delz; + + if(rsq < (STACKPARAMS?c.m_cutsq[itype][jtype]:c.d_cutsq(itype,jtype))) { + + F_FLOAT fpair = F_FLOAT(); + + if(rsq < (STACKPARAMS?c.m_cut_ljsq[itype][jtype]:c.d_cut_ljsq(itype,jtype))) + fpair+=factor_lj*c.template compute_fpair(rsq,i,j,itype,jtype); + if(rsq < (STACKPARAMS?c.m_cut_coulsq[itype][jtype]:c.d_cut_coulsq(itype,jtype))) + fpair+=c.template compute_fcoul(rsq,i,j,itype,jtype,factor_coul,qtmp); + + fev.f[0] += delx*fpair; + fev.f[1] += dely*fpair; + fev.f[2] += delz*fpair; + + F_FLOAT evdwl = 0.0; + F_FLOAT ecoul = 0.0; + if (c.eflag) { + if(rsq < (STACKPARAMS?c.m_cut_ljsq[itype][jtype]:c.d_cut_ljsq(itype,jtype))) { + evdwl = factor_lj * c.template compute_evdwl(rsq,i,j,itype,jtype); + ev.evdwl += 0.5*evdwl; + } + if(rsq < (STACKPARAMS?c.m_cut_coulsq[itype][jtype]:c.d_cut_coulsq(itype,jtype))) { + ecoul = c.template compute_ecoul(rsq,i,j,itype,jtype,factor_coul,qtmp); + ev.ecoul += 0.5*ecoul; + } + } + if (c.vflag) { + fev.v[0] += 0.5*delx*delx*fpair; + fev.v[1] += 0.5*dely*dely*fpair; + fev.v[2] += 0.5*delz*delz*fpair; + fev.v[3] += 0.5*delx*dely*fpair; + fev.v[4] += 0.5*delx*delz*fpair; + fev.v[5] += 0.5*dely*delz*fpair; + } + } + },fev); + + Kokkos::single(Kokkos::PerThread(team), [&] (){ + f(i,0) += fev.f[0]; + f(i,1) += fev.f[1]; + f(i,2) += fev.f[2]; + + if (c.eflag_global) { + ev.evdwl += fev.evdwl; + ev.ecoul += fev.ecoul; + } + + if (c.eflag_atom) + d_eatom(i,0) += fev.evdwl + fev.ecoul; + + if (c.vflag_global) { + ev.v[0] += fev.v[0]; + ev.v[1] += fev.v[1]; + ev.v[2] += fev.v[2]; + ev.v[3] += fev.v[3]; + ev.v[4] += fev.v[4]; + ev.v[5] += fev.v[5]; + } + + if (c.vflag_atom) { + d_vatom(i,0) += fev.v[0]; + d_vatom(i,1) += fev.v[1]; + d_vatom(i,2) += fev.v[2]; + d_vatom(i,3) += fev.v[3]; + d_vatom(i,4) += fev.v[4]; + d_vatom(i,5) += fev.v[5]; + } + }); + }); + return ev; + } + KOKKOS_INLINE_FUNCTION void ev_tally(EV_FLOAT &ev, const int &i, const int &j, const F_FLOAT &epair, const F_FLOAT &fpair, const F_FLOAT &delx, @@ -355,6 +679,16 @@ struct PairComputeFunctor { else energy_virial += compute_item<1,0>(i,list,typename DoCoul::type()); } + + KOKKOS_INLINE_FUNCTION + void operator()(const typename Kokkos::TeamPolicy<>::member_type& team) const { + compute_item_team(team,list,typename DoCoul::type()); + } + + KOKKOS_INLINE_FUNCTION + void operator()(const typename Kokkos::TeamPolicy<>::member_type& team, value_type &energy_virial) const { + energy_virial += compute_item_team_ev(team,list,typename DoCoul::type()); + } }; template @@ -489,6 +823,15 @@ struct PairComputeFunctor { void operator()(const int i, value_type &energy_virial) const { energy_virial += compute_item<1,0>(i,list,typename DoCoul::type()); } + + KOKKOS_INLINE_FUNCTION + void operator()(const typename Kokkos::TeamPolicy<>::member_type& team) const + {} + + KOKKOS_INLINE_FUNCTION + void operator()(const typename Kokkos::TeamPolicy<>::member_type& team, value_type &energy_virial) const + {} + }; // Filter out Neighflags which are not supported for PairStyle @@ -507,20 +850,52 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, typename Kokkos::Impl::enable return ev; } +template +int GetTeamSize(FunctorStyle& functor, int team_size, int vector_length) { + int team_size_max = Kokkos::TeamPolicy<>::team_size_max(functor); + +#ifdef KOKKOS_ENABLE_CUDA + if(team_size*vector_length > team_size_max) + team_size = team_size_max/vector_length; +#else + team_size = 1; +#endif + return team_size; +} + // Submit ParallelFor for NEIGHFLAG=HALF,HALFTHREAD,FULL,N2 template EV_FLOAT pair_compute_neighlist (PairStyle* fpair, typename Kokkos::Impl::enable_if<(NEIGHFLAG&PairStyle::EnabledNeighFlags) != 0, NeighListKokkos*>::type list) { EV_FLOAT ev; - if(fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) { - PairComputeFunctor ff(fpair,list); - if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(list->inum,ff,ev); - else Kokkos::parallel_for(list->inum,ff); - ff.contribute(); + if (fpair->lmp->kokkos->team_flag) { + int vector_length = 8; + int atoms_per_team = 32; + + if(fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) { + PairComputeFunctor ff(fpair,list); + atoms_per_team = GetTeamSize(ff, atoms_per_team, vector_length); + Kokkos::TeamPolicy > policy(list->inum,atoms_per_team,vector_length); + if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(policy,ff,ev); + else Kokkos::parallel_for(policy,ff); + } else { + PairComputeFunctor ff(fpair,list); + atoms_per_team = GetTeamSize(ff, atoms_per_team, vector_length); + Kokkos::TeamPolicy > policy(list->inum,atoms_per_team,vector_length); + if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(policy,ff,ev); + else Kokkos::parallel_for(policy,ff); + } } else { - PairComputeFunctor ff(fpair,list); - if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(list->inum,ff,ev); - else Kokkos::parallel_for(list->inum,ff); - ff.contribute(); + if(fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) { + PairComputeFunctor ff(fpair,list); + if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(list->inum,ff,ev); + else Kokkos::parallel_for(list->inum,ff); + ff.contribute(); + } else { + PairComputeFunctor ff(fpair,list); + if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(list->inum,ff,ev); + else Kokkos::parallel_for(list->inum,ff); + ff.contribute(); + } } return ev; } From 4fe6528ed49ec73b25f1e372b785bac6d0b726ee Mon Sep 17 00:00:00 2001 From: efetis Date: Wed, 6 Feb 2019 16:56:09 -0800 Subject: [PATCH 0109/1242] Add support for Sphinx+PDF+MathJax --- doc/.gitignore | 1 + doc/Makefile | 38 +++++++++++++++++++++++--------- doc/src/JPG/coul_soft.jpg | Bin 12676 -> 38635 bytes doc/src/JPG/lj_soft.jpg | Bin 12313 -> 35805 bytes doc/src/JPG/uef_frames.jpg | Bin 12271 -> 37518 bytes doc/utils/sphinx-config/conf.py | 6 +++-- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/doc/.gitignore b/doc/.gitignore index 7d30949237..96112ac19c 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1,3 +1,4 @@ +/latex /html /spelling /LAMMPS.epub diff --git a/doc/Makefile b/doc/Makefile index d117c2d98c..3bb4c44502 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -56,7 +56,7 @@ clean-all: clean rm -rf $(BUILDDIR)/* utils/txt2html/txt2html.exe clean: - rm -rf $(RSTDIR) html old epub + rm -rf $(RSTDIR) html old epub latex rm -rf spelling clean-spelling: @@ -115,21 +115,39 @@ mobi: epub @ebook-convert LAMMPS.epub LAMMPS.mobi @echo "Conversion finished. The MOBI manual file is created." -pdf: utils/txt2html/txt2html.exe +pdf: $(OBJECTS) $(ANCHORCHECK) + @(\ + . $(VENV)/bin/activate ;\ + cp -r src/* $(RSTDIR)/ ;\ + sphinx-build $(SPHINXEXTRA) -b latex -c utils/sphinx-config -d $(BUILDDIR)/doctrees $(RSTDIR) latex ;\ + echo "############################################" ;\ + doc_anchor_check src/*.txt ;\ + echo "############################################" ;\ + deactivate ;\ + ) + @cd latex && \ + sed -i '' 's/\\begin{equation}//g' LAMMPS.tex && \ + sed -i '' 's/\\end{equation}//g' LAMMPS.tex && \ + make && \ + mv LAMMPS.pdf ../Manual.pdf && \ + cd ../; @(\ - set -e; \ cd src/Developer; \ pdflatex developer; \ pdflatex developer; \ mv developer.pdf ../../Developer.pdf; \ - cd ..; \ - ../utils/txt2html/txt2html.exe -b *.txt; \ - htmldoc --batch lammps.book; \ - for s in `echo *.txt | sed -e 's/ \(pairs\|bonds\|angles\|dihedrals\|impropers\|commands_list\|fixes\|computes\).txt/ /g' | sed -e 's,\.txt,\.html,g'` ; \ - do grep -q ^$$s lammps.book || \ - echo WARNING: doc file $$s missing in src/lammps.book; done; \ - rm *.html; \ + cd ../../; \ ) + @rm -rf latex/_sources + @rm -rf latex/PDF + @rm -rf latex/USER + @cp -r src/PDF latex/PDF + @cp -r src/USER latex/USER + @rm -rf latex/PDF/.[sg]* + @rm -rf latex/USER/.[sg]* + @rm -rf latex/USER/*/.[sg]* + @rm -rf latex/USER/*/*.[sg]* + @echo "Build finished. Manual.pdf and Developer.pdf are in this directory." old: utils/txt2html/txt2html.exe @rm -rf old diff --git a/doc/src/JPG/coul_soft.jpg b/doc/src/JPG/coul_soft.jpg index d2cc4c0c9af061cd00618ce42821a845073fbe2c..618d23b3060498b188b937ece2682f5f5911137f 100644 GIT binary patch literal 38635 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 literal 12676 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 z z(2+)(=T>km&M1|{afq~0*tyGA7c7ZDaJHU`Z>VpbX18VbtjkHL&?k|eokhJSRq-ESC$9XfodRm>?I zr0$BG010Gzn2}d9(p~ly2~haK1fMsakWU>hj=e%!n}dK$GL}v)hhdda7``Bzd?2>) zNY1k*_3P2*_aNAPIfWjeQ^}roMjPt+F(tc1w=l|xGiTojcB?JZMm_5AOT;AHL2kHU#x>~T(O%l^mti_! z%6O|GccmR~HManj40s z`saXz)L4gYWI~e{H8(^1F41>=GFqgMDE$8*4Y(hBVTC++tbX2nL#?`>OKta$DJK!9*F(C}~PiA!gJf zn4Su?mj|jK7qFa!575b$Lh;`QQ6^9ccl;rfpsq$#(}mh^yKAnZ%&p#SdRz^Y%!g;- zG}I8KGR)n};kC1;4v6HEL+jfkm14X5tE(M3TytHxAlw2SmWfKi(H{*7S$e=u4Ylg0 z0y)fa9Z{a3I2 zTVreiZ0=cZ%PDV@-w|ffw2Y@LO0>+b^r*#K!kWubAc;yd9OPj2!R3B7BZJ1_#>Nap@Ea(pgg!CbMN^5afV;({?X)9NPhf50FfL z+)hd}#SddJv;>r5DRh`0h~Vo1&M5Z) z8QJ-tNP@Y|W^7eO^1s{7_S|0@V6u?UgVn#sJ}Lmg1C=&s#&jNuJvMW4vJci=qXs<` zU#CFT@*sRnaeh`7%w4TxPRISTQaEbysWWR9eQMd%M56ZmH;{BIF?kaTiCX9BHUiHG zB|jH<+1N+ozv2N9b8wMY=Qqn1r<7pjxjsAHE^=!?0s*i%@i7chQE^%X`iV}#6qf9`r-PZ#E?!JF;?fZ$$^;@qwarflA zp({CNx2~;?W2B22UD4M-5<=QrfZmrLeq7HIrXB~TEEBfyEmma;zg{~=JD!3Ke%dJ7 zXcoy$CqH7wj@Ea8!}$MXmVf65p-ZaOD#3?i?^V)Wx+v+GOEk9UJnM5PgK&M3EtDs9 zXFpGzDVHe?TX%Vp$XXUuTubMf%T)Xnc!_xngjKF^<||+ZhaG%y4f!0qMRRL)&K1nG zY!2vHw0l6M14}Nr7uIkIsF#2{FVe6O0()gLkr6obag(z@u-jG~e z%80hM5l?Jsdr6gR8wZq2HU|GOFOB^iHM4JZdb|~4i2+1i1Oz(BRXn}m@Cfwa#_>V} zu&;>v*%W{W?_lvrm?6?F;ITwg23Mo!0<1&mPBblP&>QT&Vy0^bTAan0=VXw+5;A*S ZBx`pPu}5Rslm;g)|MLG7q=C0n{|jy)j^O|R diff --git a/doc/src/JPG/lj_soft.jpg b/doc/src/JPG/lj_soft.jpg index 47c6a04b9183d3af54795000ccde6732c6f075d6..98404f857d351a86433f2a20ebcbb0eeeea43748 100644 GIT binary patch literal 35805 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

&#tUwf{xCOt!Qe?M#i0)8bmwlkmZ?smdA%y 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 a^({P#@!7KBe}Xgr#jE`9F?ZYd@&5~Z%L_gL literal 12313 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

S5OqUqwpi^IIVL}t1h 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 diff --git a/doc/utils/sphinx-config/conf.py b/doc/utils/sphinx-config/conf.py index 3056687ff8..736aac3eb9 100644 --- a/doc/utils/sphinx-config/conf.py +++ b/doc/utils/sphinx-config/conf.py @@ -211,7 +211,9 @@ latex_elements = { #'pointsize': '10pt', # Additional stuff for the LaTeX preamble. -#'preamble': '', +'preamble': r''' +\setcounter{tocdepth}{2} +''' } # Grouping the document tree into LaTeX files. List of tuples @@ -229,7 +231,7 @@ latex_documents = [ # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False - +latex_toplevel_sectioning = 'part' # If true, show page references after internal links. #latex_show_pagerefs = False From 7c1fb847f4a006a8713e48939910a368f82819b8 Mon Sep 17 00:00:00 2001 From: efetis Date: Wed, 6 Feb 2019 17:32:47 -0800 Subject: [PATCH 0110/1242] Slight tweak to sed in doc/Makefile --- doc/Makefile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index 3bb4c44502..a38186666a 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -126,8 +126,13 @@ pdf: $(OBJECTS) $(ANCHORCHECK) deactivate ;\ ) @cd latex && \ - sed -i '' 's/\\begin{equation}//g' LAMMPS.tex && \ - sed -i '' 's/\\end{equation}//g' LAMMPS.tex && \ + sed 's/latexmk -pdf -dvi- -ps-/pdflatex/g' Makefile > temp && \ + mv temp Makefile && \ + sed 's/\\begin{equation}//g' LAMMPS.tex > tmp.tex && \ + mv tmp.tex LAMMPS.tex && \ + sed 's/\\end{equation}//g' LAMMPS.tex > tmp.tex && \ + mv tmp.tex LAMMPS.tex && \ + make && \ make && \ mv LAMMPS.pdf ../Manual.pdf && \ cd ../; From 927dc262b21f048576fe5de7ea1c1214c3654f4d Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 6 Feb 2019 23:41:45 -0600 Subject: [PATCH 0111/1242] Update CMake & Install.py for KIM API v2 --- cmake/CMakeLists.txt | 4 ++-- lib/kim/Install.py | 10 +++------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index ae2510c68b..ffef5d07c5 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -663,8 +663,8 @@ if(PKG_KIM) enable_language(Fortran) include(ExternalProject) ExternalProject_Add(kim_build - URL https://s3.openkim.org/kim-api/kim-api-v2-2.0.0-beta.3.txz - URL_MD5 67c103a00e84865848d004837262c76e + URL https://s3.openkim.org/kim-api/kim-api-v2-2.0.0.txz + URL_MD5 1ff8f563ad5991f7a2a25b35a13d7308 BINARY_DIR build CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} diff --git a/lib/kim/Install.py b/lib/kim/Install.py index 544fe2b65d..e2465eec85 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.0-beta.3" +version = "kim-api-v2-2.0.0" # help message @@ -35,19 +35,15 @@ Syntax from lib dir: python Install.py -b -v version -a kim-name Examples: make lib-kim args="-b" # install KIM API lib with only example models -make lib-kim args="-b -a Glue_Ercolessi_Adams_Al__MO_324507536345_001" # Ditto plus one model +make lib-kim args="-b -a EAM_ErcolessiAdams_1994_Al__MO_324507536345_002" # Ditto plus one model make lib-kim args="-b -a everything" # install KIM API lib with all models -make lib-kim args="-n -a EAM_Dynamo_Ackland_W__MO_141627196590_002" # only add one model or model driver +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 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 -in the "What is in the KIM API source package?" section """ pgroup = parser.add_mutually_exclusive_group() From 6068a719ff4d6641a5f703594da83b7d8fadcf65 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 6 Feb 2019 23:53:47 -0600 Subject: [PATCH 0112/1242] Updated example/kim/log.* files --- ... log.06Feb2019.in.kim.lj.lmp.newton-off.1} | 24 +++++++++---------- ... log.06Feb2019.in.kim.lj.lmp.newton-off.4} | 22 ++++++++--------- ...> log.06Feb2019.in.kim.lj.lmp.newton-on.1} | 20 ++++++++-------- ...> log.06Feb2019.in.kim.lj.lmp.newton-on.4} | 22 ++++++++--------- ...1 => log.06Feb2019.in.kim.lj.newton-off.1} | 22 ++++++++--------- ...4 => log.06Feb2019.in.kim.lj.newton-off.4} | 22 ++++++++--------- ....1 => log.06Feb2019.in.kim.lj.newton-on.1} | 22 ++++++++--------- ....4 => log.06Feb2019.in.kim.lj.newton-on.4} | 22 ++++++++--------- 8 files changed, 88 insertions(+), 88 deletions(-) rename examples/kim/{log.12Dec2018.in.kim.lj.lmp.newton-off.1 => log.06Feb2019.in.kim.lj.lmp.newton-off.1} (71%) rename examples/kim/{log.12Dec2018.in.kim.lj.lmp.newton-off.4 => log.06Feb2019.in.kim.lj.lmp.newton-off.4} (71%) rename examples/kim/{log.12Dec2018.in.kim.lj.lmp.newton-on.1 => log.06Feb2019.in.kim.lj.lmp.newton-on.1} (74%) rename examples/kim/{log.12Dec2018.in.kim.lj.lmp.newton-on.4 => log.06Feb2019.in.kim.lj.lmp.newton-on.4} (71%) rename examples/kim/{log.12Dec2018.in.kim.lj.newton-off.1 => log.06Feb2019.in.kim.lj.newton-off.1} (75%) rename examples/kim/{log.12Dec2018.in.kim.lj.newton-off.4 => log.06Feb2019.in.kim.lj.newton-off.4} (80%) rename examples/kim/{log.12Dec2018.in.kim.lj.newton-on.1 => log.06Feb2019.in.kim.lj.newton-on.1} (75%) rename examples/kim/{log.12Dec2018.in.kim.lj.newton-on.4 => log.06Feb2019.in.kim.lj.newton-on.4} (80%) diff --git a/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.1 b/examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-off.1 similarity index 71% rename from examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.1 rename to examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-off.1 index 0b67cc1ccb..5925fd750d 100644 --- a/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.1 +++ b/examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-off.1 @@ -1,11 +1,11 @@ -LAMMPS (24 Oct 2018) +LAMMPS (1 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 Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00307703 secs + Time spent = 0.004499 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -26,20 +26,20 @@ Per MPI rank memory allocation (min/avg/max) = 20.37 | 20.37 | 20.37 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.58348 on 1 procs for 100 steps with 32000 atoms +Loop time of 2.92885 on 1 procs for 100 steps with 32000 atoms -Performance: 3.344 ns/day, 7.176 hours/ns, 38.707 timesteps/s -99.9% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 2.950 ns/day, 8.136 hours/ns, 34.143 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 | 2.2621 | 2.2621 | 2.2621 | 0.0 | 87.56 -Neigh | 0.28294 | 0.28294 | 0.28294 | 0.0 | 10.95 -Comm | 0.0057185 | 0.0057185 | 0.0057185 | 0.0 | 0.22 -Output | 0.00010109 | 0.00010109 | 0.00010109 | 0.0 | 0.00 -Modify | 0.023396 | 0.023396 | 0.023396 | 0.0 | 0.91 -Other | | 0.009175 | | | 0.36 +Pair | 2.5638 | 2.5638 | 2.5638 | 0.0 | 87.54 +Neigh | 0.31935 | 0.31935 | 0.31935 | 0.0 | 10.90 +Comm | 0.006833 | 0.006833 | 0.006833 | 0.0 | 0.23 +Output | 0.000107 | 0.000107 | 0.000107 | 0.0 | 0.00 +Modify | 0.027806 | 0.027806 | 0.027806 | 0.0 | 0.95 +Other | | 0.01091 | | | 0.37 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -52,4 +52,4 @@ Total # of neighbors = 2370499 Ave neighs/atom = 74.0781 Neighbor list builds = 3 Dangerous builds = 0 -Total wall time: 0:00:02 +Total wall time: 0:00:03 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.4 b/examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-off.4 similarity index 71% rename from examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.4 rename to examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-off.4 index e2ee8e39bb..c1ca108c7b 100644 --- a/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-off.4 +++ b/examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-off.4 @@ -1,11 +1,11 @@ -LAMMPS (24 Oct 2018) +LAMMPS (1 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 Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.000934124 secs + Time spent = 0.001039 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -26,20 +26,20 @@ Per MPI rank memory allocation (min/avg/max) = 8.013 | 8.013 | 8.013 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 0.76167 on 4 procs for 100 steps with 32000 atoms +Loop time of 0.778581 on 4 procs for 100 steps with 32000 atoms -Performance: 11.343 ns/day, 2.116 hours/ns, 131.290 timesteps/s -99.7% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 11.097 ns/day, 2.163 hours/ns, 128.439 timesteps/s +99.8% 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.65549 | 0.6589 | 0.66089 | 0.3 | 86.51 -Neigh | 0.075691 | 0.075959 | 0.07641 | 0.1 | 9.97 -Comm | 0.0073049 | 0.007397 | 0.0074785 | 0.1 | 0.97 -Output | 5.6982e-05 | 0.00014746 | 0.00024986 | 0.0 | 0.02 -Modify | 0.0068338 | 0.0068703 | 0.0068941 | 0.0 | 0.90 -Other | | 0.0124 | | | 1.63 +Pair | 0.65171 | 0.65891 | 0.67656 | 1.3 | 84.63 +Neigh | 0.07924 | 0.079548 | 0.07997 | 0.1 | 10.22 +Comm | 0.006755 | 0.0069015 | 0.007072 | 0.2 | 0.89 +Output | 4.6e-05 | 9.725e-05 | 0.000203 | 0.0 | 0.01 +Modify | 0.006841 | 0.006941 | 0.007015 | 0.1 | 0.89 +Other | | 0.02618 | | | 3.36 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.1 b/examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-on.1 similarity index 74% rename from examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.1 rename to examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-on.1 index 91731438de..53555743d7 100644 --- a/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.1 +++ b/examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-on.1 @@ -1,11 +1,11 @@ -LAMMPS (24 Oct 2018) +LAMMPS (1 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 Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00311494 secs + Time spent = 0.003479 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -26,20 +26,20 @@ Per MPI rank memory allocation (min/avg/max) = 19.23 | 19.23 | 19.23 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.22646 on 1 procs for 100 steps with 32000 atoms +Loop time of 2.17978 on 1 procs for 100 steps with 32000 atoms -Performance: 3.881 ns/day, 6.185 hours/ns, 44.914 timesteps/s +Performance: 3.964 ns/day, 6.055 hours/ns, 45.876 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 | 2.0344 | 2.0344 | 2.0344 | 0.0 | 91.38 -Neigh | 0.14575 | 0.14575 | 0.14575 | 0.0 | 6.55 -Comm | 0.01127 | 0.01127 | 0.01127 | 0.0 | 0.51 -Output | 0.000103 | 0.000103 | 0.000103 | 0.0 | 0.00 -Modify | 0.024057 | 0.024057 | 0.024057 | 0.0 | 1.08 -Other | | 0.01083 | | | 0.49 +Pair | 1.9892 | 1.9892 | 1.9892 | 0.0 | 91.26 +Neigh | 0.14506 | 0.14506 | 0.14506 | 0.0 | 6.65 +Comm | 0.011049 | 0.011049 | 0.011049 | 0.0 | 0.51 +Output | 9.1e-05 | 9.1e-05 | 9.1e-05 | 0.0 | 0.00 +Modify | 0.02347 | 0.02347 | 0.02347 | 0.0 | 1.08 +Other | | 0.01094 | | | 0.50 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.4 b/examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-on.4 similarity index 71% rename from examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.4 rename to examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-on.4 index 92eb8ba8bc..f0fdf66193 100644 --- a/examples/kim/log.12Dec2018.in.kim.lj.lmp.newton-on.4 +++ b/examples/kim/log.06Feb2019.in.kim.lj.lmp.newton-on.4 @@ -1,11 +1,11 @@ -LAMMPS (24 Oct 2018) +LAMMPS (1 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 Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.000946045 secs + Time spent = 0.000919 secs Neighbor list info ... update every 1 steps, delay 0 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -26,20 +26,20 @@ Per MPI rank memory allocation (min/avg/max) = 7.632 | 7.632 | 7.632 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 0.639437 on 4 procs for 100 steps with 32000 atoms +Loop time of 0.63515 on 4 procs for 100 steps with 32000 atoms -Performance: 13.512 ns/day, 1.776 hours/ns, 156.388 timesteps/s -99.7% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 13.603 ns/day, 1.764 hours/ns, 157.443 timesteps/s +99.8% 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.55655 | 0.55752 | 0.55833 | 0.1 | 87.19 -Neigh | 0.040557 | 0.040752 | 0.041148 | 0.1 | 6.37 -Comm | 0.024693 | 0.025886 | 0.026853 | 0.5 | 4.05 -Output | 4.6015e-05 | 5.1558e-05 | 6.0081e-05 | 0.0 | 0.01 -Modify | 0.0088108 | 0.0089263 | 0.0090554 | 0.1 | 1.40 -Other | | 0.006306 | | | 0.99 +Pair | 0.55365 | 0.5566 | 0.55868 | 0.2 | 87.63 +Neigh | 0.041495 | 0.0418 | 0.04211 | 0.1 | 6.58 +Comm | 0.019086 | 0.021075 | 0.023898 | 1.2 | 3.32 +Output | 4.4e-05 | 5.025e-05 | 6e-05 | 0.0 | 0.01 +Modify | 0.009315 | 0.0093595 | 0.009422 | 0.0 | 1.47 +Other | | 0.006263 | | | 0.99 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.newton-off.1 b/examples/kim/log.06Feb2019.in.kim.lj.newton-off.1 similarity index 75% rename from examples/kim/log.12Dec2018.in.kim.lj.newton-off.1 rename to examples/kim/log.06Feb2019.in.kim.lj.newton-off.1 index c25368b917..0ab258fe0d 100644 --- a/examples/kim/log.12Dec2018.in.kim.lj.newton-off.1 +++ b/examples/kim/log.06Feb2019.in.kim.lj.newton-off.1 @@ -1,11 +1,11 @@ -LAMMPS (24 Oct 2018) +LAMMPS (1 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 Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.00450015 secs + Time spent = 0.003446 secs WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) Neighbor list info ... @@ -28,20 +28,20 @@ Per MPI rank memory allocation (min/avg/max) = 28.51 | 28.51 | 28.51 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 3.35585 on 1 procs for 100 steps with 32000 atoms +Loop time of 3.01669 on 1 procs for 100 steps with 32000 atoms -Performance: 2.575 ns/day, 9.322 hours/ns, 29.799 timesteps/s -99.2% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 2.864 ns/day, 8.380 hours/ns, 33.149 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 | 2.9239 | 2.9239 | 2.9239 | 0.0 | 87.13 -Neigh | 0.38492 | 0.38492 | 0.38492 | 0.0 | 11.47 -Comm | 0.0072038 | 0.0072038 | 0.0072038 | 0.0 | 0.21 -Output | 0.00010204 | 0.00010204 | 0.00010204 | 0.0 | 0.00 -Modify | 0.028316 | 0.028316 | 0.028316 | 0.0 | 0.84 -Other | | 0.01146 | | | 0.34 +Pair | 2.6562 | 2.6562 | 2.6562 | 0.0 | 88.05 +Neigh | 0.31903 | 0.31903 | 0.31903 | 0.0 | 10.58 +Comm | 0.00634 | 0.00634 | 0.00634 | 0.0 | 0.21 +Output | 9.1e-05 | 9.1e-05 | 9.1e-05 | 0.0 | 0.00 +Modify | 0.024723 | 0.024723 | 0.024723 | 0.0 | 0.82 +Other | | 0.01032 | | | 0.34 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.newton-off.4 b/examples/kim/log.06Feb2019.in.kim.lj.newton-off.4 similarity index 80% rename from examples/kim/log.12Dec2018.in.kim.lj.newton-off.4 rename to examples/kim/log.06Feb2019.in.kim.lj.newton-off.4 index c8c52d6e09..c17ea6afb7 100644 --- a/examples/kim/log.12Dec2018.in.kim.lj.newton-off.4 +++ b/examples/kim/log.06Feb2019.in.kim.lj.newton-off.4 @@ -1,11 +1,11 @@ -LAMMPS (24 Oct 2018) +LAMMPS (1 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 Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.00106215 secs + Time spent = 0.000921 secs WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) @@ -34,20 +34,20 @@ Per MPI rank memory allocation (min/avg/max) = 10.05 | 10.05 | 10.05 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 0.930494 on 4 procs for 100 steps with 32000 atoms +Loop time of 0.890192 on 4 procs for 100 steps with 32000 atoms -Performance: 9.285 ns/day, 2.585 hours/ns, 107.470 timesteps/s -99.5% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 9.706 ns/day, 2.473 hours/ns, 112.335 timesteps/s +99.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.80926 | 0.81195 | 0.81464 | 0.3 | 87.26 -Neigh | 0.089949 | 0.092688 | 0.095287 | 0.8 | 9.96 -Comm | 0.007302 | 0.0074284 | 0.0075471 | 0.1 | 0.80 -Output | 0.00012898 | 0.00014371 | 0.00016093 | 0.0 | 0.02 -Modify | 0.011517 | 0.011761 | 0.011959 | 0.2 | 1.26 -Other | | 0.006522 | | | 0.70 +Pair | 0.77867 | 0.77906 | 0.7794 | 0.0 | 87.52 +Neigh | 0.087831 | 0.088176 | 0.088805 | 0.1 | 9.91 +Comm | 0.006358 | 0.0065898 | 0.006815 | 0.3 | 0.74 +Output | 4.9e-05 | 5.975e-05 | 6.8e-05 | 0.0 | 0.01 +Modify | 0.010265 | 0.010429 | 0.010678 | 0.2 | 1.17 +Other | | 0.005874 | | | 0.66 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.newton-on.1 b/examples/kim/log.06Feb2019.in.kim.lj.newton-on.1 similarity index 75% rename from examples/kim/log.12Dec2018.in.kim.lj.newton-on.1 rename to examples/kim/log.06Feb2019.in.kim.lj.newton-on.1 index eec26307ac..59d018e12a 100644 --- a/examples/kim/log.12Dec2018.in.kim.lj.newton-on.1 +++ b/examples/kim/log.06Feb2019.in.kim.lj.newton-on.1 @@ -1,11 +1,11 @@ -LAMMPS (24 Oct 2018) +LAMMPS (1 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 Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 1 by 1 MPI processor grid Created 32000 atoms - Time spent = 0.0030508 secs + Time spent = 0.003089 secs WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) Neighbor list info ... @@ -28,20 +28,20 @@ Per MPI rank memory allocation (min/avg/max) = 28.12 | 28.12 | 28.12 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 2.97001 on 1 procs for 100 steps with 32000 atoms +Loop time of 3.05849 on 1 procs for 100 steps with 32000 atoms -Performance: 2.909 ns/day, 8.250 hours/ns, 33.670 timesteps/s -99.8% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 2.825 ns/day, 8.496 hours/ns, 32.696 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 | 2.5982 | 2.5982 | 2.5982 | 0.0 | 87.48 -Neigh | 0.32516 | 0.32516 | 0.32516 | 0.0 | 10.95 -Comm | 0.012059 | 0.012059 | 0.012059 | 0.0 | 0.41 -Output | 0.000103 | 0.000103 | 0.000103 | 0.0 | 0.00 -Modify | 0.023878 | 0.023878 | 0.023878 | 0.0 | 0.80 -Other | | 0.01058 | | | 0.36 +Pair | 2.6786 | 2.6786 | 2.6786 | 0.0 | 87.58 +Neigh | 0.33105 | 0.33105 | 0.33105 | 0.0 | 10.82 +Comm | 0.012602 | 0.012602 | 0.012602 | 0.0 | 0.41 +Output | 9.5e-05 | 9.5e-05 | 9.5e-05 | 0.0 | 0.00 +Modify | 0.024858 | 0.024858 | 0.024858 | 0.0 | 0.81 +Other | | 0.01132 | | | 0.37 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/kim/log.12Dec2018.in.kim.lj.newton-on.4 b/examples/kim/log.06Feb2019.in.kim.lj.newton-on.4 similarity index 80% rename from examples/kim/log.12Dec2018.in.kim.lj.newton-on.4 rename to examples/kim/log.06Feb2019.in.kim.lj.newton-on.4 index 6c0da32ba4..da8c9f0faa 100644 --- a/examples/kim/log.12Dec2018.in.kim.lj.newton-on.4 +++ b/examples/kim/log.06Feb2019.in.kim.lj.newton-on.4 @@ -1,11 +1,11 @@ -LAMMPS (24 Oct 2018) +LAMMPS (1 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 Lattice spacing in x,y,z = 4.43 4.43 4.43 Created orthogonal box = (0 0 0) to (88.6 88.6 88.6) 1 by 2 by 2 MPI processor grid Created 32000 atoms - Time spent = 0.000946999 secs + Time spent = 0.000893 secs WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) WARNING: KIM Model does not provide `partialParticleVirial'; virial per atom will be zero (src/KIM/pair_kim.cpp:1102) WARNING: KIM Model does not provide `partialParticleEnergy'; energy per atom will be zero (src/KIM/pair_kim.cpp:1097) @@ -34,20 +34,20 @@ Per MPI rank memory allocation (min/avg/max) = 9.789 | 9.789 | 9.789 Mbytes Step Temp E_pair E_mol TotEng Press 0 200 6290.8194 0 7118.0584 129712.25 100 95.179725 6718.814 0 7112.496 133346.59 -Loop time of 0.891065 on 4 procs for 100 steps with 32000 atoms +Loop time of 0.903182 on 4 procs for 100 steps with 32000 atoms -Performance: 9.696 ns/day, 2.475 hours/ns, 112.225 timesteps/s -99.8% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 9.566 ns/day, 2.509 hours/ns, 110.720 timesteps/s +99.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.75777 | 0.75864 | 0.75996 | 0.1 | 85.14 -Neigh | 0.088332 | 0.088883 | 0.089737 | 0.2 | 9.97 -Comm | 0.027187 | 0.02829 | 0.029602 | 0.6 | 3.17 -Output | 4.9114e-05 | 5.4777e-05 | 6.6042e-05 | 0.0 | 0.01 -Modify | 0.0088358 | 0.0089488 | 0.0091376 | 0.1 | 1.00 -Other | | 0.00625 | | | 0.70 +Pair | 0.76173 | 0.76349 | 0.76597 | 0.2 | 84.53 +Neigh | 0.088773 | 0.088938 | 0.089074 | 0.0 | 9.85 +Comm | 0.032018 | 0.03452 | 0.03638 | 0.9 | 3.82 +Output | 4e-05 | 4.425e-05 | 5.2e-05 | 0.0 | 0.00 +Modify | 0.009278 | 0.0093917 | 0.009528 | 0.1 | 1.04 +Other | | 0.006797 | | | 0.75 Nlocal: 8000 ave 8018 max 7967 min Histogram: 1 0 0 0 0 0 1 0 0 2 From 622eb4790220dfca53e40edf537ee4782cd94db6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 7 Feb 2019 01:16:48 -0500 Subject: [PATCH 0113/1242] some small tweaks, fixes for typos, and url corrections for the manual --- doc/.gitignore | 1 + doc/src/Install_windows.txt | 2 +- doc/src/Manual.txt | 10 ++-------- doc/utils/sphinx-config/conf.py | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/doc/.gitignore b/doc/.gitignore index 96112ac19c..920c5b9830 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1,5 +1,6 @@ /latex /html +/latex /spelling /LAMMPS.epub /LAMMPS.mobi diff --git a/doc/src/Install_windows.txt b/doc/src/Install_windows.txt index 78de4f09f7..7d5aab34f5 100644 --- a/doc/src/Install_windows.txt +++ b/doc/src/Install_windows.txt @@ -12,7 +12,7 @@ Download an executable for Windows :h3 Pre-compiled Windows installers which install LAMMPS executables on a Windows system can be downloaded from this site: -"http://rpm.lammps.org/windows.html"_http://rpm.lammps.org/windows.html +"http://packages.lammps.org/windows.html"_http://packages.lammps.org/windows.html Note that each installer package has a date in its name, which corresponds to the LAMMPS version of the same date. Installers for diff --git a/doc/src/Manual.txt b/doc/src/Manual.txt index b477ce9cf0..f5c6f914c7 100644 --- a/doc/src/Manual.txt +++ b/doc/src/Manual.txt @@ -37,27 +37,21 @@ LAMMPS is an open-source code, distributed freely under the terms of the GNU Public License (GPL). The "LAMMPS website"_lws has a variety of information about the code. -It includes links to an on-line version of this manual, a "mail +It includes links to an on-line version of this manual, a "mailing list"_http://lammps.sandia.gov/mail.html where users can post -questions, and a "GitHub site"https://github.com/lammps/lammps where +questions, and a "GitHub site"_https://github.com/lammps/lammps where all LAMMPS development is coordinated. :line -"PDF file"_Manual.pdf of the entire manual, generated by -"htmldoc"_http://freecode.com/projects/htmldoc - The content for this manual is part of the LAMMPS distribution. You can build a local copy of the Manual as HTML pages or a PDF file, by following the steps on the "Manual build"_Manual_build.html doc page. - There is also a "Developer.pdf"_Developer.pdf document which gives a brief description of the basic code structure of LAMMPS. :line -This manual is organized into the following sections. - Once you are familiar with LAMMPS, you may want to bookmark "this page"_Commands.html since it gives quick access to a doc page for every LAMMPS command. diff --git a/doc/utils/sphinx-config/conf.py b/doc/utils/sphinx-config/conf.py index 736aac3eb9..29de3af156 100644 --- a/doc/utils/sphinx-config/conf.py +++ b/doc/utils/sphinx-config/conf.py @@ -221,7 +221,7 @@ latex_elements = { # author, documentclass [howto, manual, or own class]). latex_documents = [ ('Manual', 'LAMMPS.tex', 'LAMMPS Documentation', - 'Steve Plimpton', 'manual'), + 'The LAMMPS Developers', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of From 0fade44b43f89d39448700f6150acc5c60a43ade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Sat, 9 Feb 2019 08:45:03 +0100 Subject: [PATCH 0114/1242] Update install.py --- python/install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/install.py b/python/install.py index 2cd6562557..5a97b6106d 100644 --- a/python/install.py +++ b/python/install.py @@ -22,7 +22,7 @@ else: pydir = "" # copy lammps.py to pydir if it exists # if pydir not specified, install in site-packages via distutils setup() -if sys.platform == 'darwin': +if 'liblammps.dylib' in os.listdir('../src/'): lib_ext = ".dylib" else: lib_ext = ".so" From 277f8356b1f34e3e449871c376706b2db1a724f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Sat, 9 Feb 2019 08:46:22 +0100 Subject: [PATCH 0115/1242] Update lammps.py --- python/lammps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/lammps.py b/python/lammps.py index 3d5fc7a6b2..c5c7dca33d 100644 --- a/python/lammps.py +++ b/python/lammps.py @@ -85,7 +85,7 @@ class lammps(object): # fall back to loading with a relative path, # typically requires LD_LIBRARY_PATH to be set appropriately - if sys.platform == 'darwin': + if 'liblammps.dylib' in os.listdir(modpath): lib_ext = ".dylib" else: lib_ext = ".so" From 4b8621e7ef9927058653d6f9cd48882a042c6563 Mon Sep 17 00:00:00 2001 From: casievers Date: Mon, 11 Feb 2019 19:46:22 -0800 Subject: [PATCH 0116/1242] Added additional tutorials for the dynamical matrix calculator --- .../dynamical_matrix_command/GaAs/GaAs.py | 39 +++++++++++++ .../dynamical_matrix_command/GaN/GaN.py | 39 +++++++++++++ .../dynamical_matrix_command/Quartz/quartz.py | 57 +++++++++++++++++++ .../{ => Silicon}/README.md | 4 +- .../{ => Silicon}/Si.opt.tersoff | 0 .../{ => Silicon}/ff-silicon.lmp | 0 .../{ => Silicon}/in.silicon | 0 .../lmp_bank/amorphous_silicon.lmp | 0 .../{ => Silicon}/lmp_bank/silicon_216.lmp | 0 .../{ => Silicon}/lmp_bank/silicon_512.lmp | 0 .../{ => Silicon}/lmp_bank/silicon_8.lmp | 0 .../{ => Silicon}/results/dynmat.dat | 0 .../{ => Silicon}/results/out.silicon | 0 .../{ => Silicon}/silicon_input_file.lmp | 0 .../{ => silicon}/Manual.md | 0 .../{ => silicon}/README.md | 4 +- .../{ => silicon}/Si.opt.tersoff | 0 .../{ => silicon}/combine.sh | 0 .../{ => silicon}/ff-silicon.lmp | 0 .../{ => silicon}/in.silicon | 0 .../{ => silicon}/lmp_bank/silicon_216.lmp | 0 .../{ => silicon}/lmp_bank/silicon_512.lmp | 0 .../{ => silicon}/lmp_bank/silicon_8.lmp | 0 .../{ => silicon}/results/out.silicon | 0 .../{ => silicon}/results/third_order | 0 .../{ => silicon}/silicon_input_file.lmp | 0 src/USER-PHONON/third_order.cpp | 13 ++--- 27 files changed, 144 insertions(+), 12 deletions(-) create mode 100644 examples/USER/phonon/dynamical_matrix_command/GaAs/GaAs.py create mode 100644 examples/USER/phonon/dynamical_matrix_command/GaN/GaN.py create mode 100644 examples/USER/phonon/dynamical_matrix_command/Quartz/quartz.py rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/README.md (77%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/Si.opt.tersoff (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/ff-silicon.lmp (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/in.silicon (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/lmp_bank/amorphous_silicon.lmp (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/lmp_bank/silicon_216.lmp (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/lmp_bank/silicon_512.lmp (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/lmp_bank/silicon_8.lmp (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/results/dynmat.dat (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/results/out.silicon (100%) rename examples/USER/phonon/dynamical_matrix_command/{ => Silicon}/silicon_input_file.lmp (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/Manual.md (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/README.md (82%) rename examples/USER/phonon/third_order_command/{ => silicon}/Si.opt.tersoff (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/combine.sh (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/ff-silicon.lmp (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/in.silicon (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/lmp_bank/silicon_216.lmp (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/lmp_bank/silicon_512.lmp (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/lmp_bank/silicon_8.lmp (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/results/out.silicon (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/results/third_order (100%) rename examples/USER/phonon/third_order_command/{ => silicon}/silicon_input_file.lmp (100%) diff --git a/examples/USER/phonon/dynamical_matrix_command/GaAs/GaAs.py b/examples/USER/phonon/dynamical_matrix_command/GaAs/GaAs.py new file mode 100644 index 0000000000..1e9d58a71b --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/GaAs/GaAs.py @@ -0,0 +1,39 @@ +from ase import Atoms, Atom +from ase.calculators.lammpslib import LAMMPSlib +import numpy as np +import matplotlib.pyplot as plt +from mpi4py import MPI + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() + +GaAs = Atoms([Atom('Ga', (0.0, 0.0, 0.0)), + Atom('As', (1.413425, 1.413425, 1.413425))], + cell=[(0.0, 2.82685, 2.82685), (2.82685, 0.0, 2.82685), (2.82685, 2.82685, 0.0)], + pbc=True,) + +cmds = ["pair_style bop", "pair_coeff * * ../../../../../potentials/GaAs.bop.table Ga As", + "comm_modify cutoff 12"] + +mends = ["info system", + "dynamical_matrix all eskm 0.000001 file dynmat.dat binary no", + "neigh_modify delay 0"] + +N = 5 +GaAs = GaAs.repeat([N, N, N]) + +lammps = LAMMPSlib(lmpcmds=cmds, atom_types={'Ga': 1, 'As': 2}, amendments=mends, log_file='lammps.log') + +GaAs.set_calculator(lammps) +GaAs.get_potential_energy() + +if rank == 0: + dynmat = np.loadtxt("dynmat.dat") + dynmat = dynmat.reshape(([int(3*(len(dynmat)/3)**0.5), int(3*(len(dynmat)/3)**0.5)])) + eigv = np.linalg.eigvals(dynmat) + eigv.sort() + eigv = np.sqrt(np.abs(eigv))/(2*np.pi) + plt.hist(eigv, 80) + plt.xlabel('Frequency (THz)') + plt.show() + diff --git a/examples/USER/phonon/dynamical_matrix_command/GaN/GaN.py b/examples/USER/phonon/dynamical_matrix_command/GaN/GaN.py new file mode 100644 index 0000000000..52e14ca47d --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/GaN/GaN.py @@ -0,0 +1,39 @@ +from ase import Atoms, Atom +from ase.calculators.lammpslib import LAMMPSlib +import numpy as np +import matplotlib.pyplot as plt +from mpi4py import MPI + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() + +GaN = Atoms([Atom('Ga', (1.59, 0.917986928012, 0.0)), + Atom('Ga', (1.59, -0.917986928012, 2.583)), + Atom('N', (1.59, 0.917986928012, 1.98891)), + Atom('N', (1.59, -0.917986928012, 4.57191))], + cell=[(1.59, -2.75396078403, 0.0), (1.59, 2.75396078403, 0.0), (0.0, 0.0, 5.166)], + pbc=True) + +cmds = ["pair_style tersoff", "pair_coeff * * ../../../../../potentials/GaN.tersoff Ga N"] + +mends = ["info system", + "dynamical_matrix all eskm 0.000001 file dynmat.dat binary no", + "neigh_modify delay 0"] + +N = 6 +GaN = GaN.repeat([N, N, N]) + +lammps = LAMMPSlib(lmpcmds=cmds, atom_types={'Ga': 1, 'N': 2}, amendments=mends, log_file='lammps.log') + +GaN.set_calculator(lammps) +GaN.get_potential_energy() + +if rank == 0: + dynmat = np.loadtxt("dynmat.dat") + dynmat = dynmat.reshape(([int(3*(len(dynmat)/3)**0.5), int(3*(len(dynmat)/3)**0.5)])) + eigv = np.linalg.eigvals(dynmat) + eigv.sort() + eigv = np.sqrt(np.abs(eigv))/(2*np.pi) + plt.hist(eigv, 80) + plt.xlabel('Frequency (THz)') + plt.show() diff --git a/examples/USER/phonon/dynamical_matrix_command/Quartz/quartz.py b/examples/USER/phonon/dynamical_matrix_command/Quartz/quartz.py new file mode 100644 index 0000000000..79a81aa95c --- /dev/null +++ b/examples/USER/phonon/dynamical_matrix_command/Quartz/quartz.py @@ -0,0 +1,57 @@ +from ase import Atoms, Atom +from ase.calculators.lammpslib import LAMMPSlib +import numpy as np +import matplotlib.pyplot as plt +from mpi4py import MPI + +comm = MPI.COMM_WORLD +rank = comm.Get_rank() + +quartz = Atoms( + [Atom('Si', (1.1545226, -1.99969180169, 0.0)), + Atom('Si', (1.1545226, 1.99969180169, 3.6036)), + Atom('Si', (2.6069548, 2.15247249027e-16, 1.8018)), + Atom('O', (1.6724232, -0.624132037742, 0.64378314)), + Atom('O', (1.6724232, 0.624132037742, 2.9598186618)), + Atom('O', (2.1623026, -2.49695388906, 4.2473849418)), + Atom('O', (3.5392742, 1.13629495821, 1.1580150582)), + Atom('O', (3.5392742, -1.13629495821, 2.4455813382)), + Atom('O', (2.1623026, 2.49695388906, 4.76161686))], + cell=[(2.458, -4.257380885, 0.0), (2.458, 4.257380885, 0.0), (0.0, 0.0, 5.4054)], + pbc=True, + ) + +# number of repeats +N = 3 +quartz = quartz.repeat([N, N, N]) + +header = ['units metal', + 'atom_style charge', + 'atom_modify map array sort 0 0'] + +cmds = ["pair_style buck/coul/long 10.0 8.0", + "pair_coeff 1 1 0 1 0", + "pair_coeff 1 2 18003.7572 0.20520 133.5381", + "pair_coeff 2 2 1388.7730 0.36232 175.0000", + "kspace_style ewald 1.0e-12", + "set type 1 charge 2.4", + "set type 2 charge -1.2"] + +mends = ["dynamical_matrix all eskm 0.000001 file dynmat.dat binary no", + "neigh_modify delay 0"] + + +lammps = LAMMPSlib(lmpcmds=cmds, lammps_header=header, amendments=mends, log_file='lammps.log') + +quartz.set_calculator(lammps) +quartz.get_potential_energy() + +if rank == 0: + dynmat = np.loadtxt("dynmat.dat") + dynmat = dynmat.reshape(([int(3*(len(dynmat)/3)**0.5), int(3*(len(dynmat)/3)**0.5)])) + eigv = np.linalg.eigvals(dynmat) + eigv.sort() + plt.hist(33*np.sqrt(np.abs(eigv))/(2*np.pi), 80) + plt.xlabel('Frequency (cm-1)') + plt.show() + diff --git a/examples/USER/phonon/dynamical_matrix_command/README.md b/examples/USER/phonon/dynamical_matrix_command/Silicon/README.md similarity index 77% rename from examples/USER/phonon/dynamical_matrix_command/README.md rename to examples/USER/phonon/dynamical_matrix_command/Silicon/README.md index 8981c1e63a..15ae158c62 100755 --- a/examples/USER/phonon/dynamical_matrix_command/README.md +++ b/examples/USER/phonon/dynamical_matrix_command/Silicon/README.md @@ -7,7 +7,7 @@ This directory contains the ingredients to calculate a dynamical matrix. Example: ``` NP=4 #number of processors -mpirun -np $NP lmp_mpi < in.silicon > out.silicon +mpirun -np $NP lmp_mpi -in in.silicon -out out.silicon ``` To test out a different silicon example: @@ -15,7 +15,7 @@ To test out a different silicon example: LMP_FILE=amorphous_silicon.lmp cp lmp_bank/$LMP_FILE ./silicon_input_file.lmp NP=4 #number of processors -mpirun -np $NP lmp_mpi < in.silicon > out.silicon +mpirun -np $NP lmp_mpi -in in.silicon -out out.silicon ``` ## Requires: MANYBODY and MOLECULE packages diff --git a/examples/USER/phonon/dynamical_matrix_command/Si.opt.tersoff b/examples/USER/phonon/dynamical_matrix_command/Silicon/Si.opt.tersoff similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/Si.opt.tersoff rename to examples/USER/phonon/dynamical_matrix_command/Silicon/Si.opt.tersoff diff --git a/examples/USER/phonon/dynamical_matrix_command/ff-silicon.lmp b/examples/USER/phonon/dynamical_matrix_command/Silicon/ff-silicon.lmp similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/ff-silicon.lmp rename to examples/USER/phonon/dynamical_matrix_command/Silicon/ff-silicon.lmp diff --git a/examples/USER/phonon/dynamical_matrix_command/in.silicon b/examples/USER/phonon/dynamical_matrix_command/Silicon/in.silicon similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/in.silicon rename to examples/USER/phonon/dynamical_matrix_command/Silicon/in.silicon diff --git a/examples/USER/phonon/dynamical_matrix_command/lmp_bank/amorphous_silicon.lmp b/examples/USER/phonon/dynamical_matrix_command/Silicon/lmp_bank/amorphous_silicon.lmp similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/lmp_bank/amorphous_silicon.lmp rename to examples/USER/phonon/dynamical_matrix_command/Silicon/lmp_bank/amorphous_silicon.lmp diff --git a/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_216.lmp b/examples/USER/phonon/dynamical_matrix_command/Silicon/lmp_bank/silicon_216.lmp similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_216.lmp rename to examples/USER/phonon/dynamical_matrix_command/Silicon/lmp_bank/silicon_216.lmp diff --git a/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_512.lmp b/examples/USER/phonon/dynamical_matrix_command/Silicon/lmp_bank/silicon_512.lmp similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_512.lmp rename to examples/USER/phonon/dynamical_matrix_command/Silicon/lmp_bank/silicon_512.lmp diff --git a/examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_8.lmp b/examples/USER/phonon/dynamical_matrix_command/Silicon/lmp_bank/silicon_8.lmp similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/lmp_bank/silicon_8.lmp rename to examples/USER/phonon/dynamical_matrix_command/Silicon/lmp_bank/silicon_8.lmp diff --git a/examples/USER/phonon/dynamical_matrix_command/results/dynmat.dat b/examples/USER/phonon/dynamical_matrix_command/Silicon/results/dynmat.dat similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/results/dynmat.dat rename to examples/USER/phonon/dynamical_matrix_command/Silicon/results/dynmat.dat diff --git a/examples/USER/phonon/dynamical_matrix_command/results/out.silicon b/examples/USER/phonon/dynamical_matrix_command/Silicon/results/out.silicon similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/results/out.silicon rename to examples/USER/phonon/dynamical_matrix_command/Silicon/results/out.silicon diff --git a/examples/USER/phonon/dynamical_matrix_command/silicon_input_file.lmp b/examples/USER/phonon/dynamical_matrix_command/Silicon/silicon_input_file.lmp similarity index 100% rename from examples/USER/phonon/dynamical_matrix_command/silicon_input_file.lmp rename to examples/USER/phonon/dynamical_matrix_command/Silicon/silicon_input_file.lmp diff --git a/examples/USER/phonon/third_order_command/Manual.md b/examples/USER/phonon/third_order_command/silicon/Manual.md similarity index 100% rename from examples/USER/phonon/third_order_command/Manual.md rename to examples/USER/phonon/third_order_command/silicon/Manual.md diff --git a/examples/USER/phonon/third_order_command/README.md b/examples/USER/phonon/third_order_command/silicon/README.md similarity index 82% rename from examples/USER/phonon/third_order_command/README.md rename to examples/USER/phonon/third_order_command/silicon/README.md index a9604e4575..c938734393 100755 --- a/examples/USER/phonon/third_order_command/README.md +++ b/examples/USER/phonon/third_order_command/silicon/README.md @@ -8,7 +8,7 @@ Example: ``` $THIRD_ORDER=third_order #tensor output file NP=4 #number of processors -mpirun -np $NP lmp_mpi < in.silicon > out.silicon +mpirun -np $NP lmp_mpi -in in.silicon -out out.silicon combine.sh third_order ``` @@ -18,7 +18,7 @@ $THIRD_ORDER=third_order $LMP_FILE=amorphous_silicon.lmp cp lmp_bank/$LMP_FILE ./silicon_input_file.lmp NP=4 #number of processors -mpirun -np $NP lmp_mpi < in.silicon > out.silicon +mpirun -np $NP lmp_mpi -in in.silicon -out out.silicon bash combine.sh $THIRD_ORDER ``` diff --git a/examples/USER/phonon/third_order_command/Si.opt.tersoff b/examples/USER/phonon/third_order_command/silicon/Si.opt.tersoff similarity index 100% rename from examples/USER/phonon/third_order_command/Si.opt.tersoff rename to examples/USER/phonon/third_order_command/silicon/Si.opt.tersoff diff --git a/examples/USER/phonon/third_order_command/combine.sh b/examples/USER/phonon/third_order_command/silicon/combine.sh similarity index 100% rename from examples/USER/phonon/third_order_command/combine.sh rename to examples/USER/phonon/third_order_command/silicon/combine.sh diff --git a/examples/USER/phonon/third_order_command/ff-silicon.lmp b/examples/USER/phonon/third_order_command/silicon/ff-silicon.lmp similarity index 100% rename from examples/USER/phonon/third_order_command/ff-silicon.lmp rename to examples/USER/phonon/third_order_command/silicon/ff-silicon.lmp diff --git a/examples/USER/phonon/third_order_command/in.silicon b/examples/USER/phonon/third_order_command/silicon/in.silicon similarity index 100% rename from examples/USER/phonon/third_order_command/in.silicon rename to examples/USER/phonon/third_order_command/silicon/in.silicon diff --git a/examples/USER/phonon/third_order_command/lmp_bank/silicon_216.lmp b/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_216.lmp similarity index 100% rename from examples/USER/phonon/third_order_command/lmp_bank/silicon_216.lmp rename to examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_216.lmp diff --git a/examples/USER/phonon/third_order_command/lmp_bank/silicon_512.lmp b/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_512.lmp similarity index 100% rename from examples/USER/phonon/third_order_command/lmp_bank/silicon_512.lmp rename to examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_512.lmp diff --git a/examples/USER/phonon/third_order_command/lmp_bank/silicon_8.lmp b/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_8.lmp similarity index 100% rename from examples/USER/phonon/third_order_command/lmp_bank/silicon_8.lmp rename to examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_8.lmp diff --git a/examples/USER/phonon/third_order_command/results/out.silicon b/examples/USER/phonon/third_order_command/silicon/results/out.silicon similarity index 100% rename from examples/USER/phonon/third_order_command/results/out.silicon rename to examples/USER/phonon/third_order_command/silicon/results/out.silicon diff --git a/examples/USER/phonon/third_order_command/results/third_order b/examples/USER/phonon/third_order_command/silicon/results/third_order similarity index 100% rename from examples/USER/phonon/third_order_command/results/third_order rename to examples/USER/phonon/third_order_command/silicon/results/third_order diff --git a/examples/USER/phonon/third_order_command/silicon_input_file.lmp b/examples/USER/phonon/third_order_command/silicon/silicon_input_file.lmp similarity index 100% rename from examples/USER/phonon/third_order_command/silicon_input_file.lmp rename to examples/USER/phonon/third_order_command/silicon/silicon_input_file.lmp diff --git a/src/USER-PHONON/third_order.cpp b/src/USER-PHONON/third_order.cpp index b2a684e6da..41382e64cb 100644 --- a/src/USER-PHONON/third_order.cpp +++ b/src/USER-PHONON/third_order.cpp @@ -168,13 +168,11 @@ void ThirdOrder::options(int narg, char **arg) if (narg < 0) error->all(FLERR,"Illegal dynamical_matrix command"); int iarg = 0; const char *filename = "third_order.txt"; - std::stringstream fss; while (iarg < narg) { if (strcmp(arg[iarg],"file") == 0) { if (iarg+2 > narg) error->all(FLERR, "Illegal dynamical_matrix command"); - fss << arg[iarg + 1] << me; - filename = fss.str().c_str(); + filename = arg[iarg + 1]; file_flag = 1; iarg += 2; } @@ -189,7 +187,7 @@ void ThirdOrder::options(int narg, char **arg) iarg += 2; } else error->all(FLERR,"Illegal dynamical_matrix command"); } - if (file_flag == 1 and me == 0) { + if (file_flag == 1 && me == 0) { openfile(filename); } } @@ -338,10 +336,9 @@ void ThirdOrder::writeMatrix(double *dynmat, int i, int a, int j, int b) if (!binaryflag && fp) { clearerr(fp); for (int k = 0; k < gcount; k++){ - double norm = pow(dynmat[k*3], 2) - + pow(dynmat[k*3+1], 2) - + pow(dynmat[k+3+2], 2); - if (norm > 1.0e-16) + if (dynmat[k*3] > 1.0e-16 + && dynmat[k*3+1] > 1.0e-16 + && dynmat[k*3+2] > 1.0e-16) fprintf(fp, "%d %d %d %d %d %7.8f %7.8f %7.8f\n", i+1, a + 1, j+1, b + 1, groupmap[k]+1, From b7413226e0a42db8fa5030a3aecb944760a05bcf Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Mon, 11 Feb 2019 21:37:06 -0700 Subject: [PATCH 0117/1242] 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 e7c1ca1fca7ac8b91c9ce4fc3b1036f2eca0b3d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Tue, 12 Feb 2019 08:07:28 +0100 Subject: [PATCH 0118/1242] Revert changes --- python/install.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/python/install.py b/python/install.py index 5a97b6106d..feb6527352 100644 --- a/python/install.py +++ b/python/install.py @@ -22,11 +22,6 @@ else: pydir = "" # copy lammps.py to pydir if it exists # if pydir not specified, install in site-packages via distutils setup() -if 'liblammps.dylib' in os.listdir('../src/'): - lib_ext = ".dylib" -else: - lib_ext = ".so" - if pydir: if not os.path.isdir(pydir): print( "ERROR: pydir %s does not exist" % pydir) @@ -41,7 +36,7 @@ if pydir: str = "cp ../src/liblammps.so %s" % pydir print(str) try: - shutil.copyfile("../src/liblammps" + lib_ext, os.path.join(pydir,"liblammps" + lib_ext) ) + shutil.copyfile("../src/liblammps.so", os.path.join(pydir,"liblammps.so") ) except shutil.Error: pass # source and destination are identical sys.exit() @@ -70,7 +65,7 @@ try: url = "http://lammps.sandia.gov", description = "LAMMPS molecular dynamics library", py_modules = ["lammps"], - data_files = [(get_python_lib(), ["../src/liblammps" + lib_ext])]) + data_files = [(get_python_lib(), ["../src/liblammps.so"])]) except: tryuser=True print ("Installation into global site-packages dir failed.\nTrying user site dir %s now." % site.USER_SITE) @@ -86,9 +81,8 @@ if tryuser: url = "http://lammps.sandia.gov", description = "LAMMPS molecular dynamics library", py_modules = ["lammps"], - data_files = [(site.USER_SITE, ["../src/liblammps" + lib_ext])]) + data_files = [(site.USER_SITE, ["../src/liblammps.so"])]) except: print("Installation into user site package dir failed.\nGo to ../python and install manually.") - From f5e3c538802d4504b074d46c4da142724f1842c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Tue, 12 Feb 2019 08:08:22 +0100 Subject: [PATCH 0119/1242] Update install.py --- python/install.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/install.py b/python/install.py index feb6527352..9308506fd2 100644 --- a/python/install.py +++ b/python/install.py @@ -86,3 +86,4 @@ if tryuser: print("Installation into user site package dir failed.\nGo to ../python and install manually.") + From e582c0d4e5eec1b5e22954e3249719e69827deb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Tue, 12 Feb 2019 08:20:54 +0100 Subject: [PATCH 0120/1242] Update lammps.py --- python/lammps.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/lammps.py b/python/lammps.py index c5c7dca33d..9b3790f2db 100644 --- a/python/lammps.py +++ b/python/lammps.py @@ -85,7 +85,7 @@ class lammps(object): # fall back to loading with a relative path, # typically requires LD_LIBRARY_PATH to be set appropriately - if 'liblammps.dylib' in os.listdir(modpath): + if any([f.startswith('liblammps') and f.endswith('.dylib') for f in os.listdir(modpath)]): lib_ext = ".dylib" else: lib_ext = ".so" From 6ff1557af8c03becc5615ccebcd41334a0cf082b Mon Sep 17 00:00:00 2001 From: dsbolin Date: Tue, 12 Feb 2019 07:42:26 -0700 Subject: [PATCH 0121/1242] 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 88b62fa6bdf80f1b3ed5db4d807fadfc376f2742 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 13 Feb 2019 12:43:35 -0500 Subject: [PATCH 0122/1242] add old style PDF build to "make old" target. this will create the old style Manual.pdf in the old folder and put Developer.pdf there, too. --- doc/Makefile | 14 +++++++++++++- doc/src/lammps.book | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index a38186666a..044e358bd5 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -39,7 +39,7 @@ help: @echo "Please use \`make ' where is one of" @echo " html create HTML doc pages in html dir" @echo " pdf create Developer.pdf and Manual.pdf in this dir" - @echo " old create old-style HTML doc pages in old dir" + @echo " old create old-style HTML doc pages and Manual.pdf in old dir" @echo " fetch fetch HTML and PDF files from LAMMPS web site" @echo " epub create ePUB format manual for e-book readers" @echo " mobi convert ePUB to MOBI format manual for e-book readers (e.g. Kindle)" @@ -162,6 +162,18 @@ old: utils/txt2html/txt2html.exe cp Eqs/*.jpg ../old/Eqs; \ cp JPG/* ../old/JPG; \ cp PDF/* ../old/PDF; + @( set -e;\ + cd src/Developer; \ + pdflatex developer; \ + pdflatex developer; \ + mv developer.pdf ../../old/Developer.pdf; \ + cd ../../old; \ + for s in `echo ../src/*.txt | sed -e 's,\.\./src/,,g' -e 's/ \(pairs\|bonds\|angles\|dihedrals\|impropers\|commands_list\|fixes\|computes\).txt/ /g' | sed -e 's,\.txt,\.html,g'` ; \ + do grep -q ^$$s ../src/lammps.book || \ + echo WARNING: doc file $$s missing in src/lammps.book; done; \ + htmldoc --batch ../src/lammps.book; \ + ) + fetch: @rm -rf html_www Manual_www.pdf Developer_www.pdf diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 02a55e3810..4c24719870 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -1,5 +1,5 @@ #HTMLDOC 1.8.28 --t pdf14 -f "../Manual.pdf" --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --textcolor #000000 --linkcolor #0000ff --linkstyle plain --bodycolor #ffffff --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer ..1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=9 --jpeg=0 --fontsize 11.0 --fontspacing 1.2 --headingfont Sans --bodyfont Serif --headfootsize 11.0 --headfootfont Sans-Bold --charset iso-8859-15 --links --embedfonts --pagemode document --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 --no-strict --no-overflow +-t pdf14 -f "Manual.pdf" --book --toclevels 4 --no-numbered --toctitle "Table of Contents" --title --textcolor #000000 --linkcolor #0000ff --linkstyle plain --bodycolor #ffffff --size Universal --left 1.00in --right 0.50in --top 0.50in --bottom 0.50in --header .t. --header1 ... --footer ..1 --nup 1 --tocheader .t. --tocfooter ..i --portrait --color --no-pscommands --no-xrxcomments --compression=9 --jpeg=0 --fontsize 11.0 --fontspacing 1.2 --headingfont Sans --bodyfont Serif --headfootsize 11.0 --headfootfont Sans-Bold --charset iso-8859-15 --links --embedfonts --pagemode document --pagelayout single --firstpage c1 --pageeffect none --pageduration 10 --effectduration 1.0 --no-encryption --permissions all --owner-password "" --user-password "" --browserwidth 680 --no-strict --no-overflow Manual.html Intro.html Intro_overview.html From 01088559308210647ef8a604f8cd023c64e3f663 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 14 Feb 2019 02:54:02 -0500 Subject: [PATCH 0123/1242] update .gitignore for the doc folder --- doc/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/.gitignore b/doc/.gitignore index 920c5b9830..88679898a8 100644 --- a/doc/.gitignore +++ b/doc/.gitignore @@ -1,4 +1,4 @@ -/latex +/old /html /latex /spelling From b3a7a534a99b85c97b863f46c13684bf1422fbf2 Mon Sep 17 00:00:00 2001 From: Donatas Surblys Date: Thu, 14 Feb 2019 18:54:59 +0900 Subject: [PATCH 0124/1242] make fix langevin correctly account for energy with 'zero yes' --- src/fix_langevin.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index d829982274..d49ad61371 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -605,6 +605,11 @@ void FixLangevin::post_force_untemplated f[i][0] -= fsumall[0]; f[i][1] -= fsumall[1]; f[i][2] -= fsumall[2]; + if (Tp_TALLY) { + flangevin[i][0] -= fsumall[0]; + flangevin[i][1] -= fsumall[1]; + flangevin[i][2] -= fsumall[2]; + } } } } From 8020f5b9650f078c8aad2ec0c83cf67a02bd0901 Mon Sep 17 00:00:00 2001 From: Donatas Surblys Date: Thu, 14 Feb 2019 18:54:59 +0900 Subject: [PATCH 0125/1242] remove warning messages when using 'tally yes zero yes' with fix langevin --- src/fix_langevin.cpp | 2 -- src/fix_langevin.h | 6 ------ 2 files changed, 8 deletions(-) diff --git a/src/fix_langevin.cpp b/src/fix_langevin.cpp index d49ad61371..36ea47daf6 100644 --- a/src/fix_langevin.cpp +++ b/src/fix_langevin.cpp @@ -177,8 +177,6 @@ FixLangevin::FixLangevin(LAMMPS *lmp, int narg, char **arg) : } } - if (tallyflag && zeroflag && comm->me == 0) - error->warning(FLERR,"Energy tally does not account for 'zero yes'"); } /* ---------------------------------------------------------------------- */ diff --git a/src/fix_langevin.h b/src/fix_langevin.h index 2883ac9ea2..024e7a9539 100644 --- a/src/fix_langevin.h +++ b/src/fix_langevin.h @@ -104,12 +104,6 @@ E: Fix langevin period must be > 0.0 The time window for temperature relaxation must be > 0 -W: Energy tally does not account for 'zero yes' - -The energy removed by using the 'zero yes' flag is not accounted -for in the energy tally and thus energy conservation cannot be -monitored in this case. - E: Fix langevin omega requires atom style sphere Self-explanatory. From d0ed6f2bf54354cbaf8ee6e915542b51eb272fb3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 14 Feb 2019 05:45:52 -0500 Subject: [PATCH 0126/1242] reflect changes to fix langevin also in the manual --- doc/src/Errors_warnings.txt | 6 ------ doc/src/fix_langevin.txt | 4 ---- 2 files changed, 10 deletions(-) diff --git a/doc/src/Errors_warnings.txt b/doc/src/Errors_warnings.txt index 079688c639..47dd597af8 100644 --- a/doc/src/Errors_warnings.txt +++ b/doc/src/Errors_warnings.txt @@ -178,12 +178,6 @@ When using fixes like box/relax, the potential energy used by the minimizer is augmented by an additional energy provided by the fix. Thus the printed converged energy may be different from the total potential energy. :dd -{Energy tally does not account for 'zero yes'} :dt - -The energy removed by using the 'zero yes' flag is not accounted -for in the energy tally and thus energy conservation cannot be -monitored in this case. :dd - {Estimated error in splitting of dispersion coeffs is %g} :dt Error is greater than 0.0001 percent. :dd diff --git a/doc/src/fix_langevin.txt b/doc/src/fix_langevin.txt index 85c97a3436..861eed4a6f 100644 --- a/doc/src/fix_langevin.txt +++ b/doc/src/fix_langevin.txt @@ -217,10 +217,6 @@ the particles. As described below, this energy can then be printed out or added to the potential energy of the system to monitor energy conservation. -NOTE: this accumulated energy does NOT include kinetic energy removed -by the {zero} flag. LAMMPS will print a warning when both options are -active. - The keyword {zero} can be used to eliminate drift due to the thermostat. Because the random forces on different atoms are independent, they do not sum exactly to zero. As a result, this fix From e95cf4e9176ca92b769e250e2c02f069a8b790d3 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Thu, 14 Feb 2019 13:38:28 -0600 Subject: [PATCH 0127/1242] Some various doc updates for kim-api support --- cmake/Modules/FindKIM-API-V2.cmake | 5 ----- doc/src/pair_kim.txt | 6 +++--- lib/kim/README | 16 ++++++++-------- src/KIM/pair_kim.cpp | 2 +- src/KIM/pair_kim.h | 2 +- 5 files changed, 13 insertions(+), 18 deletions(-) diff --git a/cmake/Modules/FindKIM-API-V2.cmake b/cmake/Modules/FindKIM-API-V2.cmake index 0cc947e139..6ca6e068df 100644 --- a/cmake/Modules/FindKIM-API-V2.cmake +++ b/cmake/Modules/FindKIM-API-V2.cmake @@ -28,11 +28,6 @@ # Ryan S. Elliott # -# -# Release: This file is part of the kim-api.git repository. -# - - # - Find KIM-API-V2 # # sets standard pkg_check_modules variables plus: diff --git a/doc/src/pair_kim.txt b/doc/src/pair_kim.txt index 0c05913117..67ab0b6c07 100644 --- a/doc/src/pair_kim.txt +++ b/doc/src/pair_kim.txt @@ -48,8 +48,8 @@ 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 "Making -LAMMPS"_Section_start.html#start_3 section and the ./lib/kim/README for details +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. :line @@ -115,7 +115,7 @@ LAMMPS was built with that package. See the "Build package"_Build_package.html doc page for more info. This current version of pair_style kim is compatible with the -kim-api package version 2.0.0-beta.2 and higher. +kim-api package version 2.0.0 and higher. [Related commands:] diff --git a/lib/kim/README b/lib/kim/README index 7cf8f9bb7d..0e51a30870 100644 --- a/lib/kim/README +++ b/lib/kim/README @@ -20,17 +20,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.Y.Z" > ./kim-prefix.txt +$ printf "${PWD}/installed-kim-api-vX-X.Y.Z" > ./kim-prefix.txt 2. Download and unpack the kim-api -$ wget http://s3.openkim.org/kim-api/kim-api-vX.Y.Z.txz -$ tar zxvf kim-api-vX.Y.Z.txz +$ wget http://s3.openkim.org/kim-api/kim-api-vX-X.Y.Z.txz +$ tar zxvf kim-api-vX-X.Y.Z.txz # configure the kim-api -$ cd kim-api-vX.Y.Z +$ cd kim-api-vX-X.Y.Z $ mkdir build && cd build -$ cmake .. -DCMAKE_INSTALL_PREFIX=${PWD}/../../installed-kim-api-vX.Y.Z +$ cmake .. -DCMAKE_INSTALL_PREFIX=${PWD}/../../installed-kim-api-vX-X.Y.Z 3. Build and install the kim-api and model @@ -40,13 +40,13 @@ $ make install 4. Remove source and build files $ cd ../../ -$ rm -rf kim-api-vX.Y.Z -$ rm -rf kim-api-vX.Y.Z.txz +$ rm -rf kim-api-vX-X.Y.Z +$ rm -rf kim-api-vX-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.Y.Z/bin/kim-api-vX-activate +$ 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 diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 6981b028b2..a4517b848c 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -50,7 +50,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v2.0.0-beta.2 (and newer) package + Designed for use with the kim-api-v2-2.0.0 (and newer) package ------------------------------------------------------------------------- */ #include diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index a23d5cd317..a6f882347d 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -50,7 +50,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v2.0.0-beta.2 (and newer) package + Designed for use with the kim-api-v2-2.0.0 (and newer) package ------------------------------------------------------------------------- */ #ifdef PAIR_CLASS From c193a9aee902a8a5f7eac683d04be3051fb377fe Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Thu, 14 Feb 2019 19:28:18 -0600 Subject: [PATCH 0128/1242] Updated Errors_messages.txt & false_positives.txt --- doc/src/Errors_messages.txt | 2 -- doc/utils/sphinx-config/false_positives.txt | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/src/Errors_messages.txt b/doc/src/Errors_messages.txt index dab46874fb..fb5003e602 100644 --- a/doc/src/Errors_messages.txt +++ b/doc/src/Errors_messages.txt @@ -10179,8 +10179,6 @@ valid. :dd Self-explanatory. :dd -{Unrecognized virial argument in pair_style command} :dt - {Unsupported mixing rule in kspace_style ewald/disp} :dt Only geometric mixing is supported. :dd diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 5844dd3454..b76ec11f8d 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1384,6 +1384,7 @@ libfftw libgcc libgpu libjpeg +libkim liblammps Liblammps liblink From afa50ab61a4fc4511dd3bce2ab8b955c20f6e27c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Feb 2019 02:21:07 -0500 Subject: [PATCH 0129/1242] update pathspec when linking KIM API from downloaded archive --- cmake/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index b40c9aaeb2..c49dcfae71 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -674,7 +674,7 @@ if(PKG_KIM) ) 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}/lib/libkim-api-v2.2${CMAKE_SHARED_LIBRARY_SUFFIX}) + set(KIM-API-V2_LDFLAGS ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/libkim-api-v2${CMAKE_SHARED_LIBRARY_SUFFIX}) list(APPEND LAMMPS_DEPS kim_build) else() find_package(KIM-API-V2) From c2725f5a49a3368885a467ac9bbbba8c278a4c53 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Feb 2019 03:53:09 -0500 Subject: [PATCH 0130/1242] forward build type setting to compiling downloaded KIM API --- cmake/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index c49dcfae71..30c8171f28 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -670,7 +670,7 @@ if(PKG_KIM) -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} -DCMAKE_Fortran_COMPILER=${CMAKE_Fortran_COMPILER} -DCMAKE_INSTALL_PREFIX= - -DCMAKE_BUILD_TYPE=Release + -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) From 318dd347379085ed6ce38c89f5af57cb03338727 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Feb 2019 15:00:04 -0500 Subject: [PATCH 0131/1242] correct cut-n-paste error --- src/atom_vec_body.cpp | 2 +- src/atom_vec_ellipsoid.cpp | 2 +- src/atom_vec_line.cpp | 2 +- src/atom_vec_tri.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/atom_vec_body.cpp b/src/atom_vec_body.cpp index 5a277627ee..893a4c7dc4 100644 --- a/src/atom_vec_body.cpp +++ b/src/atom_vec_body.cpp @@ -1286,7 +1286,7 @@ void AtomVecBody::data_atom(double *coord, imageint imagetmp, char **values) body[nlocal] = atoi(values[2]); if (body[nlocal] == 0) body[nlocal] = -1; else if (body[nlocal] == 1) body[nlocal] = 0; - else error->one(FLERR,"Invalid atom type in Atoms section of data file"); + else error->one(FLERR,"Invalid bodyflag in Atoms section of data file"); rmass[nlocal] = atof(values[3]); if (rmass[nlocal] <= 0.0) diff --git a/src/atom_vec_ellipsoid.cpp b/src/atom_vec_ellipsoid.cpp index c569f89a09..2bf3f683d0 100644 --- a/src/atom_vec_ellipsoid.cpp +++ b/src/atom_vec_ellipsoid.cpp @@ -1148,7 +1148,7 @@ void AtomVecEllipsoid::data_atom(double *coord, imageint imagetmp, ellipsoid[nlocal] = atoi(values[2]); if (ellipsoid[nlocal] == 0) ellipsoid[nlocal] = -1; else if (ellipsoid[nlocal] == 1) ellipsoid[nlocal] = 0; - else error->one(FLERR,"Invalid atom type in Atoms section of data file"); + else error->one(FLERR,"Invalid ellipsoidflag in Atoms section of data file"); rmass[nlocal] = atof(values[3]); if (rmass[nlocal] <= 0.0) diff --git a/src/atom_vec_line.cpp b/src/atom_vec_line.cpp index 9babfe3735..020b622c93 100644 --- a/src/atom_vec_line.cpp +++ b/src/atom_vec_line.cpp @@ -1044,7 +1044,7 @@ void AtomVecLine::data_atom(double *coord, imageint imagetmp, char **values) line[nlocal] = atoi(values[3]); if (line[nlocal] == 0) line[nlocal] = -1; else if (line[nlocal] == 1) line[nlocal] = 0; - else error->one(FLERR,"Invalid atom type in Atoms section of data file"); + else error->one(FLERR,"Invalid lineflag in Atoms section of data file"); rmass[nlocal] = atof(values[4]); if (rmass[nlocal] <= 0.0) diff --git a/src/atom_vec_tri.cpp b/src/atom_vec_tri.cpp index 2c31b95cfe..8fbe0a92dc 100644 --- a/src/atom_vec_tri.cpp +++ b/src/atom_vec_tri.cpp @@ -1443,7 +1443,7 @@ void AtomVecTri::data_atom(double *coord, imageint imagetmp, char **values) tri[nlocal] = atoi(values[3]); if (tri[nlocal] == 0) tri[nlocal] = -1; else if (tri[nlocal] == 1) tri[nlocal] = 0; - else error->one(FLERR,"Invalid atom type in Atoms section of data file"); + else error->one(FLERR,"Invalid triflag in Atoms section of data file"); rmass[nlocal] = atof(values[4]); if (rmass[nlocal] <= 0.0) From 09de4fb9536d21939a952c23b734aaa344c17f10 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Feb 2019 15:01:13 -0500 Subject: [PATCH 0132/1242] add support for checking consistency of atom bonus data --- src/atom.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/atom.h | 6 ++++++ 2 files changed, 46 insertions(+) diff --git a/src/atom.cpp b/src/atom.cpp index be4d12d52e..a149268767 100644 --- a/src/atom.cpp +++ b/src/atom.cpp @@ -58,6 +58,7 @@ Atom::Atom(LAMMPS *lmp) : Pointers(lmp) natoms = 0; nlocal = nghost = nmax = 0; ntypes = 0; + nellipsoids = nlines = ntris = nbodies = 0; nbondtypes = nangletypes = ndihedraltypes = nimpropertypes = 0; nbonds = nangles = ndihedrals = nimpropers = 0; @@ -738,6 +739,45 @@ int Atom::tag_consecutive() return 1; } +/* ---------------------------------------------------------------------- + check that bonus data settings are valid + error if number of atoms with ellipsoid/line/tri/body flags + are consistent with global setting. +------------------------------------------------------------------------- */ + +void Atom::bonus_check() +{ + bigint local_ellipsoids = 0, local_lines = 0, local_tris = 0; + bigint local_bodies = 0, num_global; + + for (int i = 0; i < nlocal; ++i) { + if (ellipsoid && (ellipsoid[i] >=0)) ++local_ellipsoids; + if (line && (line[i] >=0)) ++local_lines; + if (tri && (tri[i] >=0)) ++local_tris; + if (body && (body[i] >=0)) ++local_bodies; + } + + MPI_Allreduce(&local_ellipsoids,&num_global,1,MPI_LMP_BIGINT,MPI_MIN,world); + if (nellipsoids != num_global) + error->all(FLERR,"Inconsistent 'ellipsoids' header value and number of " + "atoms with enabled ellipsoid flags"); + + MPI_Allreduce(&local_lines,&num_global,1,MPI_LMP_BIGINT,MPI_MIN,world); + if (nlines != num_global) + error->all(FLERR,"Inconsistent 'lines' header value and number of " + "atoms with enabled line flags"); + + MPI_Allreduce(&local_tris,&num_global,1,MPI_LMP_BIGINT,MPI_MIN,world); + if (ntris != num_global) + error->all(FLERR,"Inconsistent 'tris' header value and number of " + "atoms with enabled tri flags"); + + MPI_Allreduce(&local_bodies,&num_global,1,MPI_LMP_BIGINT,MPI_MIN,world); + if (nbodies != num_global) + error->all(FLERR,"Inconsistent 'bodies' header value and number of " + "atoms with enabled body flags"); +} + /* ---------------------------------------------------------------------- count and return words in a single line make copy of line before using strtok so as not to change line diff --git a/src/atom.h b/src/atom.h index 324ad0f2d2..b2a657cf1a 100644 --- a/src/atom.h +++ b/src/atom.h @@ -34,6 +34,10 @@ class Atom : protected Pointers { int tag_enable; // 0/1 if atom ID tags are defined int molecular; // 0 = atomic, 1 = standard molecular system, // 2 = molecule template system + bigint nellipsoids; // number of ellipsoids + bigint nlines; // number of lines + bigint ntris; // number of triangles + bigint nbodies; // number of bodies bigint nbonds,nangles,ndihedrals,nimpropers; int ntypes,nbondtypes,nangletypes,ndihedraltypes,nimpropertypes; @@ -233,6 +237,8 @@ class Atom : protected Pointers { void tag_extend(); int tag_consecutive(); + void bonus_check(); + int parse_data(const char *); int count_words(const char *); int count_words(const char *, char *); From d89084841285547b3be999c297124bcf85c460c2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Feb 2019 15:03:59 -0500 Subject: [PATCH 0133/1242] add a check for consistent bonus data --- src/read_data.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/read_data.cpp b/src/read_data.cpp index a640368fb0..2f4484010b 100644 --- a/src/read_data.cpp +++ b/src/read_data.cpp @@ -396,7 +396,8 @@ void ReadData::command(int narg, char **arg) // values in this data file - natoms = ntypes = 0; + natoms = 0; + ntypes = 0; nbonds = nangles = ndihedrals = nimpropers = 0; nbondtypes = nangletypes = ndihedraltypes = nimpropertypes = 0; @@ -993,18 +994,29 @@ void ReadData::header(int firstpass) if (!avec_ellipsoid) error->all(FLERR,"No ellipsoids allowed with this atom style"); sscanf(line,BIGINT_FORMAT,&nellipsoids); + if (addflag == NONE) atom->nellipsoids = nellipsoids; + else if (firstpass) atom->nellipsoids += nellipsoids; + } else if (strstr(line,"lines")) { if (!avec_line) error->all(FLERR,"No lines allowed with this atom style"); sscanf(line,BIGINT_FORMAT,&nlines); + if (addflag == NONE) atom->nlines = nlines; + else if (firstpass) atom->nlines += nlines; + } else if (strstr(line,"triangles")) { if (!avec_tri) error->all(FLERR,"No triangles allowed with this atom style"); sscanf(line,BIGINT_FORMAT,&ntris); + if (addflag == NONE) atom->ntris = ntris; + else if (firstpass) atom->ntris += ntris; + } else if (strstr(line,"bodies")) { if (!avec_body) error->all(FLERR,"No bodies allowed with this atom style"); sscanf(line,BIGINT_FORMAT,&nbodies); + if (addflag == NONE) atom->nbodies = nbodies; + else if (firstpass) atom->nbodies += nbodies; } else if (strstr(line,"bonds")) { sscanf(line,BIGINT_FORMAT,&nbonds); @@ -1084,6 +1096,10 @@ void ReadData::header(int firstpass) // error check on total system size if (atom->natoms < 0 || atom->natoms >= MAXBIGINT || + atom->nellipsoids < 0 || atom->nellipsoids >= MAXBIGINT || + atom->nlines < 0 || atom->nlines >= MAXBIGINT || + atom->ntris < 0 || atom->ntris >= MAXBIGINT || + atom->nbodies < 0 || atom->nbodies >= MAXBIGINT || atom->nbonds < 0 || atom->nbonds >= MAXBIGINT || atom->nangles < 0 || atom->nangles >= MAXBIGINT || atom->ndihedrals < 0 || atom->ndihedrals >= MAXBIGINT || @@ -1174,6 +1190,10 @@ void ReadData::atoms() atom->tag_check(); + // check that bonus data has been reserved as needed + + atom->bonus_check(); + // create global mapping of atoms if (atom->map_style) { From 7d0c0bc9849ec95d3cd7fdfa3fc3c170010bfee5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Feb 2019 17:14:01 -0500 Subject: [PATCH 0134/1242] make nlocal_bonus accessible --- src/atom_vec_body.h | 4 +++- src/atom_vec_ellipsoid.h | 4 +++- src/atom_vec_line.h | 4 +++- src/atom_vec_tri.h | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/atom_vec_body.h b/src/atom_vec_body.h index 3244b0f64d..7cc052b6c5 100644 --- a/src/atom_vec_body.h +++ b/src/atom_vec_body.h @@ -92,6 +92,8 @@ class AtomVecBody : public AtomVec { double radius_body(int, int, int *, double *); void set_quat(int, double *); + int nlocal_bonus; + private: tagint *tag; int *type,*mask; @@ -102,7 +104,7 @@ class AtomVecBody : public AtomVec { double **angmom,**torque; int *body; - int nlocal_bonus,nghost_bonus,nmax_bonus; + int nghost_bonus,nmax_bonus; int intdoubleratio; // sizeof(double) / sizeof(int) MyPoolChunk *icp; diff --git a/src/atom_vec_ellipsoid.h b/src/atom_vec_ellipsoid.h index 6beb68b176..d71859624e 100644 --- a/src/atom_vec_ellipsoid.h +++ b/src/atom_vec_ellipsoid.h @@ -83,6 +83,8 @@ class AtomVecEllipsoid : public AtomVec { void set_shape(int, double, double, double); + int nlocal_bonus; + private: tagint *tag; int *type,*mask; @@ -92,7 +94,7 @@ class AtomVecEllipsoid : public AtomVec { double **angmom,**torque; int *ellipsoid; - int nlocal_bonus,nghost_bonus,nmax_bonus; + int nghost_bonus,nmax_bonus; void grow_bonus(); void copy_bonus(int, int); diff --git a/src/atom_vec_line.h b/src/atom_vec_line.h index 7f07532fa4..6c8701cfc2 100644 --- a/src/atom_vec_line.h +++ b/src/atom_vec_line.h @@ -83,6 +83,8 @@ class AtomVecLine : public AtomVec { void set_length(int, double); + int nlocal_bonus; + private: tagint *tag; int *type,*mask; @@ -93,7 +95,7 @@ class AtomVecLine : public AtomVec { double **omega,**torque; int *line; - int nlocal_bonus,nghost_bonus,nmax_bonus; + int nghost_bonus,nmax_bonus; void grow_bonus(); void copy_bonus(int, int); diff --git a/src/atom_vec_tri.h b/src/atom_vec_tri.h index 390efc7c10..81b4c1ada9 100644 --- a/src/atom_vec_tri.h +++ b/src/atom_vec_tri.h @@ -85,6 +85,8 @@ class AtomVecTri : public AtomVec { void set_equilateral(int, double); + int nlocal_bonus; + private: tagint *tag; int *type,*mask; @@ -95,7 +97,7 @@ class AtomVecTri : public AtomVec { double **omega,**angmom,**torque; int *tri; - int nlocal_bonus,nghost_bonus,nmax_bonus; + int nghost_bonus,nmax_bonus; void grow_bonus(); void copy_bonus(int, int); From 07c1942b1396fe965552aba0cc81e603e500cc7c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Feb 2019 17:14:45 -0500 Subject: [PATCH 0135/1242] update global bonus data counters after deleting atoms --- src/delete_atoms.cpp | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/delete_atoms.cpp b/src/delete_atoms.cpp index ec713b8b84..9259ca4f4b 100644 --- a/src/delete_atoms.cpp +++ b/src/delete_atoms.cpp @@ -16,6 +16,10 @@ #include "delete_atoms.h" #include "atom.h" #include "atom_vec.h" +#include "atom_vec_ellipsoid.h" +#include "atom_vec_line.h" +#include "atom_vec_tri.h" +#include "atom_vec_body.h" #include "molecule.h" #include "comm.h" #include "domain.h" @@ -121,11 +125,39 @@ void DeleteAtoms::command(int narg, char **arg) } // reset atom->natoms and also topology counts - // reset atom->map if it exists - // set nghost to 0 so old ghosts of deleted atoms won't be mapped bigint nblocal = atom->nlocal; MPI_Allreduce(&nblocal,&atom->natoms,1,MPI_LMP_BIGINT,MPI_SUM,world); + + // reset bonus data counts + + AtomVecEllipsoid *avec_ellipsoid = + (AtomVecEllipsoid *) atom->style_match("ellipsoid"); + AtomVecLine *avec_line = (AtomVecLine *) atom->style_match("line"); + AtomVecTri *avec_tri = (AtomVecTri *) atom->style_match("tri"); + AtomVecBody *avec_body = (AtomVecBody *) atom->style_match("body"); + bigint nlocal_bonus; + + if (atom->nellipsoids > 0) { + nlocal_bonus = avec_ellipsoid->nlocal_bonus; + MPI_Allreduce(&nlocal_bonus,&atom->nellipsoids,1,MPI_LMP_BIGINT,MPI_MIN,world); + } + if (atom->nlines > 0) { + nlocal_bonus = avec_line->nlocal_bonus; + MPI_Allreduce(&nlocal_bonus,&atom->nlines,1,MPI_LMP_BIGINT,MPI_MIN,world); + } + if (atom->ntris > 0) { + nlocal_bonus = avec_tri->nlocal_bonus; + MPI_Allreduce(&nlocal_bonus,&atom->ntris,1,MPI_LMP_BIGINT,MPI_MIN,world); + } + if (atom->nbodies > 0) { + nlocal_bonus = avec_body->nlocal_bonus; + MPI_Allreduce(&nlocal_bonus,&atom->nbodies,1,MPI_LMP_BIGINT,MPI_MIN,world); + } + + // reset atom->map if it exists + // set nghost to 0 so old ghosts of deleted atoms won't be mapped + if (atom->map_style) { atom->nghost = 0; atom->map_init(); From 7b47c82452d8de1629f51b830e2df71981c390ce Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Feb 2019 18:50:35 -0500 Subject: [PATCH 0136/1242] update global bonus data counters --- src/set.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/set.cpp b/src/set.cpp index 34b86ea328..00b2d8a9b0 100644 --- a/src/set.cpp +++ b/src/set.cpp @@ -964,6 +964,21 @@ void Set::set(int keyword) count++; } + // update bonus data numbers + if (keyword == SHAPE) { + bigint nlocal_bonus = avec_ellipsoid->nlocal_bonus; + MPI_Allreduce(&nlocal_bonus,&atom->nellipsoids,1, + MPI_LMP_BIGINT,MPI_SUM,world); + } + if (keyword == LENGTH) { + bigint nlocal_bonus = avec_line->nlocal_bonus; + MPI_Allreduce(&nlocal_bonus,&atom->nlines,1,MPI_LMP_BIGINT,MPI_SUM,world); + } + if (keyword == TRI) { + bigint nlocal_bonus = avec_tri->nlocal_bonus; + MPI_Allreduce(&nlocal_bonus,&atom->ntris,1,MPI_LMP_BIGINT,MPI_SUM,world); + } + // clear up per-atom memory if allocated memory->destroy(vec1); From a0450fbd2b411916aea033617ba275f31ea2ec26 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 17 Feb 2019 18:51:15 -0500 Subject: [PATCH 0137/1242] fix copy-n-modify error --- src/delete_atoms.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/delete_atoms.cpp b/src/delete_atoms.cpp index 9259ca4f4b..41df167f07 100644 --- a/src/delete_atoms.cpp +++ b/src/delete_atoms.cpp @@ -140,19 +140,19 @@ void DeleteAtoms::command(int narg, char **arg) if (atom->nellipsoids > 0) { nlocal_bonus = avec_ellipsoid->nlocal_bonus; - MPI_Allreduce(&nlocal_bonus,&atom->nellipsoids,1,MPI_LMP_BIGINT,MPI_MIN,world); + MPI_Allreduce(&nlocal_bonus,&atom->nellipsoids,1,MPI_LMP_BIGINT,MPI_SUM,world); } if (atom->nlines > 0) { nlocal_bonus = avec_line->nlocal_bonus; - MPI_Allreduce(&nlocal_bonus,&atom->nlines,1,MPI_LMP_BIGINT,MPI_MIN,world); + MPI_Allreduce(&nlocal_bonus,&atom->nlines,1,MPI_LMP_BIGINT,MPI_SUM,world); } if (atom->ntris > 0) { nlocal_bonus = avec_tri->nlocal_bonus; - MPI_Allreduce(&nlocal_bonus,&atom->ntris,1,MPI_LMP_BIGINT,MPI_MIN,world); + MPI_Allreduce(&nlocal_bonus,&atom->ntris,1,MPI_LMP_BIGINT,MPI_SUM,world); } if (atom->nbodies > 0) { nlocal_bonus = avec_body->nlocal_bonus; - MPI_Allreduce(&nlocal_bonus,&atom->nbodies,1,MPI_LMP_BIGINT,MPI_MIN,world); + MPI_Allreduce(&nlocal_bonus,&atom->nbodies,1,MPI_LMP_BIGINT,MPI_SUM,world); } // reset atom->map if it exists From d8e8a0d2d24fcbbf26b5b60fb876ea3d85ba023b Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Mon, 18 Feb 2019 09:58:34 -0700 Subject: [PATCH 0138/1242] 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 0139/1242] 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 0140/1242] 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 8db88b1c02a6b9e26e2eafad986707efb06ab85a Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Thu, 24 Jan 2019 13:48:08 -0500 Subject: [PATCH 0141/1242] Added initial untested ADIOS 2.x code with cmake building problems --- cmake/CMakeLists.txt | 48 +++- runconf | 22 ++ src/USER-ADIOS/Install.sh | 89 +++++++ src/USER-ADIOS/README | 16 ++ src/USER-ADIOS/dump_atom_adios.cpp | 314 ++++++++++++++++++++++++ src/USER-ADIOS/dump_atom_adios.h | 70 ++++++ src/USER-ADIOS/dump_custom_adios.cpp | 354 +++++++++++++++++++++++++++ src/USER-ADIOS/dump_custom_adios.h | 94 +++++++ 8 files changed, 1005 insertions(+), 2 deletions(-) create mode 100644 runconf create mode 100644 src/USER-ADIOS/Install.sh create mode 100644 src/USER-ADIOS/README create mode 100644 src/USER-ADIOS/dump_atom_adios.cpp create mode 100644 src/USER-ADIOS/dump_atom_adios.h create mode 100644 src/USER-ADIOS/dump_custom_adios.cpp create mode 100644 src/USER-ADIOS/dump_custom_adios.h diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 9ad64a59ed..5010643fd8 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -2,7 +2,22 @@ # CMake build system # This file is part of LAMMPS # Created by Christoph Junghans and Richard Berger -cmake_minimum_required(VERSION 2.8.12) +if(PKG_USER-ADIOS) + message(STATUS "Force newer standards because using ADIOS") + cmake_minimum_required(VERSION 3.6) + # Force C++11 and C99 + set(CMAKE_CXX_STANDARD 11) + set(CMAKE_CXX_STANDARD_REQUIRED True) + # Use meta-compile features if available, otherwise use specific language + # features +# if(NOT (CMAKE_VERSION VERSION_LESS 3.9)) +# set(ADIOS2_CXX11_FEATURES cxx_std_11) +# else() +# set(ADIOS2_CXX11_FEATURES cxx_auto_type cxx_nullptr) +# endif() +else() + cmake_minimum_required(VERSION 2.8.12) +endif() project(lammps CXX) set(SOVERSION 0) @@ -178,7 +193,7 @@ set(DEFAULT_PACKAGES ASPHERE BODY CLASS2 COLLOID COMPRESS DIPOLE GRANULAR USER-MEAMC USER-MGPT USER-MISC USER-MOFFF USER-MOLFILE USER-NETCDF USER-PHONON USER-PLUMED USER-PTM USER-QTB USER-REAXC USER-SCAFACOS USER-SDPD USER-SMD USER-SMTBQ USER-SPH USER-TALLY USER-UEF USER-VTK - USER-QUIP USER-QMMM USER-YAFF) + USER-QUIP USER-QMMM USER-YAFF USER-ADIOS) set(ACCEL_PACKAGES USER-OMP KOKKOS OPT USER-INTEL GPU) set(OTHER_PACKAGES CORESHELL QEQ) foreach(PKG ${DEFAULT_PACKAGES}) @@ -613,6 +628,7 @@ 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) @@ -1354,6 +1370,34 @@ if(BUILD_EXE) endif() endif() +#if(PKG_USER-ADIOS) +# cmake_minimum_required(VERSION 3.6) +# enable_language(C) +# +# find_package(ADIOS2 REQUIRED) +## find_package(MPI REQUIRED) +# include_directories(${ADIOS2_INCLUDE_DIRS}) +## include_directories(/opt/adios2/include) +## list(APPEND LAMMPS_LINK_LIBS ${ADIOS2_LIBRARIES}) +# list(APPEND LAMMPS_LINK_LIBS ${MPI_C_LIBRARIES}) +# if(BUILD_LIB) +## target_link_libraries(lammps adios2::adios2 MPI::MPI_C) +## #target_include_directories(lammps PRIVATE ${ADIOS_INCLUDE_DIRS}) +# elseif(BUILD_EXE) +## target_link_libraries(lmp adios2::adios2 MPI::MPI_C) +# endif() +#endif(PKG_USER-ADIOS) + +if(PKG_USER-ADIOS) + enable_language(C) + find_package(ADIOS2 REQUIRED) + if(BUILD_LIB) + target_link_libraries(lammps adios2::adios2) + elseif(BUILD_EXE) + target_link_libraries(lmp adios2::adios2) + endif() +endif() + ############################################################################### # Build documentation ############################################################################### diff --git a/runconf b/runconf new file mode 100644 index 0000000000..bb313981c5 --- /dev/null +++ b/runconf @@ -0,0 +1,22 @@ + +# -D LAMMPS_SIZES=value # smallbig (default) or bigbig or smallsmall + +export HDF5_ROOT=/opt/hdf5-serial +export ADIOS2_DIR=/opt/adios2 + +cmake -D CMAKE_INSTALL_PREFIX=/opt/lammps \ + -D CMAKE_BUILD_TYPE=Debug \ + -D BUILD_MPI=yes \ + -D LAMMPS_MACHINE=adiosvm \ + -D BUILD_EXE=yes \ + -D BUILD_LIB=no \ + -D BUILD_SHARED_LIBS=no \ + -D BUILD_DOC=no \ + -D LAMMPS_SIZES=smallbig \ + -D PKG_USER-H5MD=yes \ + -D PKG_USER-ADIOS=yes \ + ../cmake + + + + diff --git a/src/USER-ADIOS/Install.sh b/src/USER-ADIOS/Install.sh new file mode 100644 index 0000000000..cae755406b --- /dev/null +++ b/src/USER-ADIOS/Install.sh @@ -0,0 +1,89 @@ +# Install/unInstall package files in LAMMPS +# mode = 0/1/2 for uninstall/install/update + +mode=$1 + +# arg1 = file, arg2 = file it depends on + +action () { + if (test $mode = 0) then + rm -f ../$1 + elif (! cmp -s $1 ../$1) then + if (test -z "$2" || test -e ../$2) then + cp $1 .. + if (test $mode = 2) then + echo " updating src/$1" + fi + fi + elif (test -n "$2") then + if (test ! -e ../$2) then + rm -f ../$1 + fi + fi +} + +for file in *.cpp *.h; do + action $file +done + +# edit 2 Makefile.package files to include/exclude package info + +if (test $1 = 1) then + +# if (test -z "$ADIOS_DIR") then +# if command -v adios_config; then +# ADIOS_DIR=`adios_config -d` +# else +# echo "ERROR: ADIOS_DIR environment variable needs to point to ADIOS" \ +# " installation directory or adios_config should be in PATH" +# fi +# fi +# ADIOS_INC=-I${ADIOS_DIR}/include +# ADIOS_LIB=`${ADIOS_DIR}/bin/adios_config -l` +# +# echo "adios_SYSINC=${ADIOS_INC} +#adios_SYSLIB=${ADIOS_LIB} +#adios_SYSPATH=${ADIOS_DIR} +#" > ../Makefile.adios + + + if (test -e ../Makefile.package) then + sed -i -e 's/[^ \t]*adios[^ \t]* //g' ../Makefile.package + sed -i -e 's/-DLMP_ADIOS //g' ../Makefile.package + sed -i -e '/^adios_SYS.*$/d' ../Makefile.package +# sed -i -e '4 i \ +#adios_SYSINC='"${ADIOS_INC}"' +#' ../Makefile.package +# sed -i -e '5 i \ +#adios_SYSLIB='"${ADIOS_LIB}"' +#' ../Makefile.package +# sed -i -e '6 i \ +#adios_SYSPATH='"${ADIOS_DIR}"' +#' ../Makefile.package + sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_ADIOS |' ../Makefile.package + sed -i -e 's|^PKG_SYSINC =[ \t]*|&$(adios_SYSINC) |' ../Makefile.package + sed -i -e 's|^PKG_SYSLIB =[ \t]*|&$(adios_SYSLIB) |' ../Makefile.package + sed -i -e 's|^PKG_SYSPATH =[ \t]*|&$(adios_SYSPATH) |' ../Makefile.package + fi + + if (test -e ../Makefile.package.settings) then + sed -i -e '/^include.*adios.*$/d' ../Makefile.package.settings + # multiline form needed for BSD sed on Macs + sed -i -e '4 i \ +include ..\/..\/lib\/adios\/Makefile.lammps +' ../Makefile.package.settings + fi + +elif (test $1 = 0) then + + if (test -e ../Makefile.package) then + sed -i -e 's/[^ \t]*adios[^ \t]* //g' ../Makefile.package + sed -i -e 's/-DLMP_ADIOS //g' ../Makefile.package + sed -i -e '/^adios_SYS.*$/d' ../Makefile.package + fi + + if (test -e ../Makefile.package.settings) then + sed -i -e '/^include.*adios.*$/d' ../Makefile.package.settings + fi + +fi diff --git a/src/USER-ADIOS/README b/src/USER-ADIOS/README new file mode 100644 index 0000000000..49717a741f --- /dev/null +++ b/src/USER-ADIOS/README @@ -0,0 +1,16 @@ +This package provides the adios dump and restart styles. + +See the doc page for the "dump adios" and "restart adios" commands. +These styles require having ADIOS 2.x itself installed on your system. + +Configure LAMMPS with CMake + a. set the environment variable + ADIOS2_DIR + to the ADIOS 2.x installation path + b. use the cmake option + -D PKG_USER-ADIOS=yes + +The person who created this package is Norbert Podhorszki (Oak Ridge National Laboratory); +If you need help, please submit a ticket at the OLCF ticket user support mentioning his name in the ticket. +https://www.olcf.ornl.gov/support/submit-ticket + diff --git a/src/USER-ADIOS/dump_atom_adios.cpp b/src/USER-ADIOS/dump_atom_adios.cpp new file mode 100644 index 0000000000..b6ace357ac --- /dev/null +++ b/src/USER-ADIOS/dump_atom_adios.cpp @@ -0,0 +1,314 @@ +/* ---------------------------------------------------------------------- + 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: Norbert Podhorszki (ORNL) +------------------------------------------------------------------------- */ + +#include +#include "dump_atom_adios.h" +#include "domain.h" +#include "atom.h" +#include "update.h" +#include "group.h" +#include "memory.h" +#include "universe.h" +#include "error.h" + + +using namespace LAMMPS_NS; + +#define MAX_TEXT_HEADER_SIZE 4096 +#define DUMP_BUF_CHUNK_SIZE 16384 +#define DUMP_BUF_INCREMENT_SIZE 4096 + +/* ---------------------------------------------------------------------- */ + +DumpAtomADIOS::DumpAtomADIOS(LAMMPS *lmp, int narg, char **arg) : + DumpAtom(lmp, narg, arg) +{ + ad = new adios2::ADIOS("adios2_config.xml", world, adios2::DebugON); + groupSize = 0; +} + +/* ---------------------------------------------------------------------- */ + +DumpAtomADIOS::~DumpAtomADIOS() +{ + if (fh) + { + fh.Close(); + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpAtomADIOS::openfile() +{ + if (multifile) { + // if one file per timestep, replace '*' with current timestep + char *filestar = strdup(filename); + char *filecurrent = new char[strlen(filestar) + 16]; + char *ptr = strchr(filestar,'*'); + *ptr = '\0'; + if (padflag == 0) + sprintf(filecurrent,"%s" BIGINT_FORMAT "%s", + filestar,update->ntimestep,ptr+1); + else { + char bif[8],pad[16]; + strcpy(bif,BIGINT_FORMAT); + sprintf(pad,"%%s%%0%d%s%%s",padflag,&bif[1]); + sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1); + } + fh = io.Open(filecurrent, adios2::Mode::Write, world); + if (!fh) { + char str[128]; + sprintf(str,"Cannot open dump file %s",filecurrent); + error->one(FLERR,str); + } + free(filestar); + delete [] filecurrent; + } + else + { + if (!singlefile_opened) + { + fh = io.Open(filename, adios2::Mode::Write, world); + if (!fh) { + char str[128]; + sprintf(str,"Cannot open dump file %s",filename); + error->one(FLERR,str); + } + singlefile_opened = 1; + } + + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpAtomADIOS::write() +{ + if (domain->triclinic == 0) { + boxxlo = domain->boxlo[0]; + boxxhi = domain->boxhi[0]; + boxylo = domain->boxlo[1]; + boxyhi = domain->boxhi[1]; + boxzlo = domain->boxlo[2]; + boxzhi = domain->boxhi[2]; + } else { + boxxlo = domain->boxlo_bound[0]; + boxxhi = domain->boxhi_bound[0]; + boxylo = domain->boxlo_bound[1]; + boxyhi = domain->boxhi_bound[1]; + boxzlo = domain->boxlo_bound[2]; + boxzhi = domain->boxhi_bound[2]; + boxxy = domain->xy; + boxxz = domain->xz; + boxyz = domain->yz; + } + + // nme = # of dump lines this proc contributes to dump + + nme = count(); + + // ntotal = total # of atoms in snapshot + // atomOffset = sum of # of atoms up to this proc (exclusive prefix sum) + + bigint bnme = nme; + MPI_Allreduce(&bnme,&ntotal,1,MPI_LMP_BIGINT,MPI_SUM,world); + + bigint atomOffset; // sum of all atoms on processes 0..me-1 + MPI_Scan (&bnme, &atomOffset, 1, MPI_LMP_BIGINT, MPI_SUM, world); + atomOffset -= nme; // exclusive prefix sum needed + + // Now we know the global size and the local subset size and offset + // of the atoms table + size_t nAtomsGlobal = static_cast(ntotal); + size_t startRow = static_cast(atomOffset); + size_t nAtomsLocal = static_cast(nme); + size_t nColumns = static_cast(size_one); + varAtoms.SetShape({nAtomsGlobal,nColumns}); + varAtoms.SetSelection({{startRow, 0}, {nAtomsLocal,nColumns}}); + + // insure buf is sized for packing + // adios does not limit per-process data size so nme*size_one is not constrained to int + // if sorting on IDs also request ID list from pack() + // sort buf as needed + + if (nme > maxbuf) { + maxbuf = nme; + memory->destroy(buf); + memory->create(buf,(maxbuf*size_one),"dump:buf"); + } + if (sort_flag && sortcol == 0 && nme > maxids) { + maxids = nme; + memory->destroy(ids); + memory->create(ids,maxids,"dump:ids"); + } + + if (sort_flag && sortcol == 0) pack(ids); + else pack(NULL); + if (sort_flag) sort(); + + // Calculate data size written by this process + groupSize = nme * size_one * sizeof(double); // size of atoms data on this process + groupSize += 3*sizeof(uint64_t) + 1*sizeof(int); // scalars written by each process + if (me == 0) { + groupSize += 1*sizeof(uint64_t) + 1*sizeof(int) + 6*sizeof(double); // scalars + if (domain->triclinic) { + groupSize += 3*sizeof(double); // boxxy, boxxz, boxyz + } + } + + openfile(); + fh.BeginStep(); + // write info on data as scalars (by me==0) + if (me == 0) { + fh.Put("ntimestep", update->ntimestep); + fh.Put("nprocs", nprocs); + + fh.Put("boxxlo", boxxlo); + fh.Put("boxxhi", boxxhi); + fh.Put("boxylo", boxylo); + fh.Put("boxyhi", boxyhi); + fh.Put("boxzlo", boxzlo); + fh.Put("boxzhi", boxzhi); + + if (domain->triclinic) { + fh.Put("boxxy", boxxy); + fh.Put("boxxz", boxxz); + fh.Put("boxyz", boxyz); + } + } + // Everyone needs to write scalar variables that are used as dimensions and offsets of arrays + fh.Put("natoms", ntotal); + fh.Put("ncolumns", size_one); + fh.Put("nme", bnme); + fh.Put("offset", atomOffset); + // now write the atoms + fh.Put("atoms", buf); + fh.EndStep();// I/O will happen now... + + if (multifile) + { + fh.Close(); + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpAtomADIOS::init_style() +{ + if (image_flag == 0) size_one = 5; + else size_one = 8; + + // setup boundary string + + domain->boundary_string(boundstr); + + // remove % from filename since ADIOS always writes a global file with data/metadata + int len = strlen(filename); + char *ptr = strchr(filename,'%'); + if (ptr) { + *ptr = '\0'; + char *s = new char[len-1]; + sprintf(s,"%s%s",filename,ptr+1); + strncpy(filename,s,len); + } + + // setup column string + + if (scale_flag == 0 && image_flag == 0) + columns = (char *) "id type x y z"; + else if (scale_flag == 0 && image_flag == 1) + columns = (char *) "id type x y z ix iy iz"; + else if (scale_flag == 1 && image_flag == 0) + columns = (char *) "id type xs ys zs"; + else if (scale_flag == 1 && image_flag == 1) + columns = (char *) "id type xs ys zs ix iy iz"; + + // setup function ptrs + + if (scale_flag == 1 && image_flag == 0 && domain->triclinic == 0) + pack_choice = &DumpAtomADIOS::pack_scale_noimage; + else if (scale_flag == 1 && image_flag == 1 && domain->triclinic == 0) + pack_choice = &DumpAtomADIOS::pack_scale_image; + else if (scale_flag == 1 && image_flag == 0 && domain->triclinic == 1) + pack_choice = &DumpAtomADIOS::pack_scale_noimage_triclinic; + else if (scale_flag == 1 && image_flag == 1 && domain->triclinic == 1) + pack_choice = &DumpAtomADIOS::pack_scale_image_triclinic; + else if (scale_flag == 0 && image_flag == 0) + pack_choice = &DumpAtomADIOS::pack_noscale_noimage; + else if (scale_flag == 0 && image_flag == 1) + pack_choice = &DumpAtomADIOS::pack_noscale_image; + + /* Define the group of variables for the atom style here since it's a fixed set */ + adios2::IO io = ad->DeclareIO(ioName); + if (!io.InConfigFile()) + { + // if not defined by user, we can change the default settings + // BPFile is the default writer + io.SetEngine("BPFile"); + int num_aggregators = multiproc; + if (num_aggregators == 0) + num_aggregators = 1; + char nstreams[128]; + sprintf (nstreams, "%d", num_aggregators); + io.SetParameters({{"substreams", nstreams}}); + if (me==0 && screen) fprintf(screen, "ADIOS method for %s is n-to-m (aggregation with %s writers)\n", filename, nstreams); + } + + + io.DefineVariable("ntimestep"); + io.DefineVariable("natoms"); + + io.DefineVariable("nprocs"); + io.DefineVariable("ncolumns"); + + io.DefineVariable("boxxlo"); + io.DefineVariable("boxxhi"); + io.DefineVariable("boxylo"); + io.DefineVariable("boxyhi"); + io.DefineVariable("boxzlo"); + io.DefineVariable("boxzhi"); + + io.DefineVariable("boxxy"); + io.DefineVariable("boxxz"); + io.DefineVariable("boxyz"); + + io.DefineAttribute("triclinic", domain->triclinic); + io.DefineAttribute("scaled", scale_flag); + io.DefineAttribute("image", image_flag); + + int *boundaryptr = reinterpret_cast(domain->boundary); + io.DefineAttribute("boundary", boundaryptr, 6); + + io.DefineAttribute("columns", columns); + io.DefineAttribute("boundarystr", boundstr); + io.DefineAttribute("LAMMPS/dump_style", "atom"); + io.DefineAttribute("LAMMPS/version", universe->version); + io.DefineAttribute("LAMMPS/num_ver", universe->num_ver); + + io.DefineVariable("nme", {adios2::LocalValueDim}); // local dimension variable + io.DefineVariable("offset", {adios2::LocalValueDim}); // local dimension variable + + // atom table size is not known at the moment + // it will be correctly defined at the moment of write + size_t UnknownSizeYet = 1; + size_t nColumns = static_cast(size_one); + varAtoms = io.DefineVariable("atoms", + {UnknownSizeYet,nColumns}, + {UnknownSizeYet, 0}, + {UnknownSizeYet,nColumns}); +} diff --git a/src/USER-ADIOS/dump_atom_adios.h b/src/USER-ADIOS/dump_atom_adios.h new file mode 100644 index 0000000000..a3999bea76 --- /dev/null +++ b/src/USER-ADIOS/dump_atom_adios.h @@ -0,0 +1,70 @@ +/* -*- 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 DUMP_CLASS + +DumpStyle(atom/adios,DumpAtomADIOS) + +#else + +#ifndef LMP_DUMP_ATOM_ADIOS_H +#define LMP_DUMP_ATOM_ADIOS_H + +#include "dump_atom.h" +#include +#include +#include "adios2.h" + +namespace LAMMPS_NS { + +class DumpAtomADIOS : public DumpAtom { + + public: + DumpAtomADIOS(class LAMMPS *, int, char **); + virtual ~DumpAtomADIOS(); + + protected: + + const std::string ioName="atom"; // name of adios group, referrable in adios2_config.xml + adios2::ADIOS *ad = nullptr; // adios object + adios2::IO io; // adios group of variables and attributes in this dump + adios2::Engine fh; // adios file/stream handle object + adios2::Variable varAtoms; // one ADIOS output variable we need to change + uint64_t groupSize; // pre-calculate # of bytes written per processor in a step before writing anything + uint64_t groupTotalSize; // ADIOS buffer size returned by adios_group_size(), valid only if size is > default 16MB ADIOS buffer + std::string filecurrent; // name of file for this round (with % and * replaced) + + virtual void openfile(); + virtual void write(); + virtual void init_style(); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Cannot open dump file %s + +The output file for the dump command cannot be opened. Check that the +path and name are correct. + +E: Too much per-proc info for dump + +Number of local atoms times number of columns must fit in a 32-bit +integer for dump. + +*/ diff --git a/src/USER-ADIOS/dump_custom_adios.cpp b/src/USER-ADIOS/dump_custom_adios.cpp new file mode 100644 index 0000000000..738e6dc076 --- /dev/null +++ b/src/USER-ADIOS/dump_custom_adios.cpp @@ -0,0 +1,354 @@ +/* ---------------------------------------------------------------------- + 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: Paul Coffman (IBM) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "dump_custom_adios.h" +#include "atom.h" +#include "force.h" +#include "domain.h" +#include "region.h" +#include "group.h" +#include "input.h" +#include "variable.h" +#include "update.h" +#include "modify.h" +#include "compute.h" +#include "fix.h" +#include "universe.h" +#include "memory.h" +#include "error.h" +#include + +using namespace LAMMPS_NS; + +#define MAX_TEXT_HEADER_SIZE 4096 +#define DUMP_BUF_CHUNK_SIZE 16384 +#define DUMP_BUF_INCREMENT_SIZE 4096 + +enum{ID,MOL,TYPE,ELEMENT,MASS, + X,Y,Z,XS,YS,ZS,XSTRI,YSTRI,ZSTRI,XU,YU,ZU,XUTRI,YUTRI,ZUTRI, + XSU,YSU,ZSU,XSUTRI,YSUTRI,ZSUTRI, + IX,IY,IZ, + VX,VY,VZ,FX,FY,FZ, + Q,MUX,MUY,MUZ,MU,RADIUS,DIAMETER, + OMEGAX,OMEGAY,OMEGAZ,ANGMOMX,ANGMOMY,ANGMOMZ, + TQX,TQY,TQZ,SPIN,ERADIUS,ERVEL,ERFORCE, + COMPUTE,FIX,VARIABLE}; +enum{LT,LE,GT,GE,EQ,NEQ}; +enum{INT,DOUBLE,STRING,BIGINT}; // same as in DumpCustom + +/* ---------------------------------------------------------------------- */ + +DumpCustomADIOS::DumpCustomADIOS(LAMMPS *lmp, int narg, char **arg) : + DumpCustom(lmp, narg, arg) +{ + ad = new adios2::ADIOS("adios2_config.xml", world, adios2::DebugON); + groupsize = 0; + //if (screen) fprintf(screen, "DumpCustomADIOS constructor: nvariable=%d id_variable=%p, variables=%p, nfield=%d, earg=%p\n", nvariable, id_variable, variable, nfield, earg); + columnNames.reserve(nfield); + for (int i = 0; i < nfield; ++i) { + columnNames[i]=std::string(earg[i]); + //if (screen) fprintf(screen, "earg[%d] = '%s'\n", i, earg[i]); + } +} + +/* ---------------------------------------------------------------------- */ + +DumpCustomADIOS::~DumpCustomADIOS() +{ + columnNames.clear(); + if (fh) + { + fh.Close(); + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpCustomADIOS::openfile() +{ + if (multifile) { + // if one file per timestep, replace '*' with current timestep + char *filestar = strdup(filename); + char *filecurrent = new char[strlen(filestar) + 16]; + char *ptr = strchr(filestar,'*'); + *ptr = '\0'; + if (padflag == 0) + sprintf(filecurrent,"%s" BIGINT_FORMAT "%s", + filestar,update->ntimestep,ptr+1); + else { + char bif[8],pad[16]; + strcpy(bif,BIGINT_FORMAT); + sprintf(pad,"%%s%%0%d%s%%s",padflag,&bif[1]); + sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1); + } + fh = io.Open(filecurrent, adios2::Mode::Write, world); + if (!fh) { + char str[128]; + sprintf(str,"Cannot open dump file %s",filecurrent); + error->one(FLERR,str); + } + free(filestar); + delete [] filecurrent; + } + else + { + if (!singlefile_opened) + { + fh = io.Open(filename, adios2::Mode::Write, world); + if (!fh) { + char str[128]; + sprintf(str,"Cannot open dump file %s",filename); + error->one(FLERR,str); + } + singlefile_opened = 1; + } + + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpCustomADIOS::write() +{ + if (domain->triclinic == 0) { + boxxlo = domain->boxlo[0]; + boxxhi = domain->boxhi[0]; + boxylo = domain->boxlo[1]; + boxyhi = domain->boxhi[1]; + boxzlo = domain->boxlo[2]; + boxzhi = domain->boxhi[2]; + } else { + boxxlo = domain->boxlo_bound[0]; + boxxhi = domain->boxhi_bound[0]; + boxylo = domain->boxlo_bound[1]; + boxyhi = domain->boxhi_bound[1]; + boxzlo = domain->boxlo_bound[2]; + boxzhi = domain->boxhi_bound[2]; + boxxy = domain->xy; + boxxz = domain->xz; + boxyz = domain->yz; + } + + // nme = # of dump lines this proc contributes to dump + + nme = count(); + + // ntotal = total # of atoms in snapshot + // atomOffset = sum of # of atoms up to this proc (exclusive prefix sum) + + bigint bnme = nme; + MPI_Allreduce(&bnme,&ntotal,1,MPI_LMP_BIGINT,MPI_SUM,world); + + bigint atomOffset; // sum of all atoms on processes 0..me-1 + MPI_Scan (&bnme, &atomOffset, 1, MPI_LMP_BIGINT, MPI_SUM, world); + atomOffset -= nme; // exclusive prefix sum needed + + // Now we know the global size and the local subset size and offset + // of the atoms table + size_t nAtomsGlobal = static_cast(ntotal); + size_t startRow = static_cast(atomOffset); + size_t nAtomsLocal = static_cast(nme); + size_t nColumns = static_cast(size_one); + varAtoms.SetShape({nAtomsGlobal,nColumns}); + varAtoms.SetSelection({{startRow, 0}, {nAtomsLocal,nColumns}}); + + // insure filewriter proc can receive everyone's info + // limit nmax*size_one to int since used as arg in MPI_Rsend() below + // pack my data into buf + // if sorting on IDs also request ID list from pack() + // sort buf as needed + + if (nme > maxbuf) { + if ((bigint) nme * size_one > MAXSMALLINT) + error->all(FLERR,"Too much per-proc info for dump"); + maxbuf = nme; + memory->destroy(buf); + memory->create(buf,(maxbuf*size_one),"dump:buf"); + } + if (sort_flag && sortcol == 0 && nme > maxids) { + maxids = nme; + memory->destroy(ids); + memory->create(ids,maxids,"dump:ids"); + } + + if (sort_flag && sortcol == 0) pack(ids); + else pack(NULL); + if (sort_flag) sort(); + + // Calculate data size written by this process + groupsize = nme * size_one * sizeof(double); // size of atoms data on this process + groupsize += 3*sizeof(uint64_t) + 1*sizeof(int); // scalars written by each process + if (me == 0) { + groupsize += 1*sizeof(uint64_t) + 1*sizeof(int) + 6*sizeof(double); // scalars + if (domain->triclinic) { + groupsize += 3*sizeof(double); // boxxy, boxxz, boxyz + } + } + + openfile(); + fh.BeginStep(); + // write info on data as scalars (by me==0) + if (me == 0) { + fh.Put("ntimestep", update->ntimestep); + fh.Put("nprocs", nprocs); + + fh.Put("boxxlo", boxxlo); + fh.Put("boxxhi", boxxhi); + fh.Put("boxylo", boxylo); + fh.Put("boxyhi", boxyhi); + fh.Put("boxzlo", boxzlo); + fh.Put("boxzhi", boxzhi); + + if (domain->triclinic) { + fh.Put("boxxy", boxxy); + fh.Put("boxxz", boxxz); + fh.Put("boxyz", boxyz); + } + } + // Everyone needs to write scalar variables that are used as dimensions and offsets of arrays + fh.Put("natoms", ntotal); + fh.Put("ncolumns", size_one); + fh.Put("nme", bnme); + fh.Put("offset", atomOffset); + // now write the atoms + fh.Put("atoms", buf); + fh.EndStep();// I/O will happen now... + + if (multifile) + { + fh.Close(); + } +} + +/* ---------------------------------------------------------------------- */ + +void DumpCustomADIOS::init_style() +{ + + // setup boundary string + + domain->boundary_string(boundstr); + + // remove % from filename since ADIOS always writes a global file with data/metadata + int len = strlen(filename); + char *ptr = strchr(filename,'%'); + if (ptr) { + *ptr = '\0'; + char *s = new char[len-1]; + sprintf(s,"%s%s",filename,ptr+1); + strncpy(filename,s,len); + } + + /* The next four loops are copied from dump_custom_mpiio, but nothing is done with them. + * It is unclear why we need them here. + * For metadata, variable[] will be written out as an ADIOS attribute if nvariable>0 + */ + // find current ptr for each compute,fix,variable + // check that fix frequency is acceptable + int icompute; + for (int i = 0; i < ncompute; i++) { + icompute = modify->find_compute(id_compute[i]); + if (icompute < 0) error->all(FLERR,"Could not find dump custom compute ID"); + compute[i] = modify->compute[icompute]; + } + + int ifix; + for (int i = 0; i < nfix; i++) { + ifix = modify->find_fix(id_fix[i]); + if (ifix < 0) error->all(FLERR,"Could not find dump custom fix ID"); + fix[i] = modify->fix[ifix]; + if (nevery % modify->fix[ifix]->peratom_freq) + error->all(FLERR,"Dump custom and fix not computed at compatible times"); + } + + int ivariable; + for (int i = 0; i < nvariable; i++) { + ivariable = input->variable->find(id_variable[i]); + if (ivariable < 0) + error->all(FLERR,"Could not find dump custom variable name"); + variable[i] = ivariable; + } + + // set index and check validity of region + if (iregion >= 0) { + iregion = domain->find_region(idregion); + if (iregion == -1) + error->all(FLERR,"Region ID for dump custom does not exist"); + } + + /* Define the group of variables for the atom style here since it's a fixed set */ + adios2::IO io = ad->DeclareIO(ioName); + if (!io.InConfigFile()) + { + // if not defined by user, we can change the default settings + // BPFile is the default writer + io.SetEngine("BPFile"); + int num_aggregators = multiproc; + if (num_aggregators == 0) + num_aggregators = 1; + char nstreams[128]; + sprintf (nstreams, "%d", num_aggregators); + io.SetParameters({{"substreams", nstreams}}); + if (me==0 && screen) fprintf(screen, "ADIOS method for %s is n-to-m (aggregation with %s writers)\n", filename, nstreams); + } + + + io.DefineVariable("ntimestep"); + io.DefineVariable("natoms"); + + io.DefineVariable("nprocs"); + io.DefineVariable("ncolumns"); + + io.DefineVariable("boxxlo"); + io.DefineVariable("boxxhi"); + io.DefineVariable("boxylo"); + io.DefineVariable("boxyhi"); + io.DefineVariable("boxzlo"); + io.DefineVariable("boxzhi"); + + io.DefineVariable("boxxy"); + io.DefineVariable("boxxz"); + io.DefineVariable("boxyz"); + + io.DefineAttribute("triclinic", domain->triclinic); + + int *boundaryptr = reinterpret_cast(domain->boundary); + io.DefineAttribute("boundary", boundaryptr, 6); + + size_t nColumns = static_cast(size_one); + io.DefineAttribute("columns", columnNames.data(), nColumns); + io.DefineAttribute("columnstr", columns); + io.DefineAttribute("boundarystr", boundstr); + io.DefineAttribute("LAMMPS/dump_style", "atom"); + io.DefineAttribute("LAMMPS/version", universe->version); + io.DefineAttribute("LAMMPS/num_ver", universe->num_ver); + + io.DefineVariable("nme", {adios2::LocalValueDim}); // local dimension variable + io.DefineVariable("offset", {adios2::LocalValueDim}); // local dimension variable + + // atom table size is not known at the moment + // it will be correctly defined at the moment of write + size_t UnknownSizeYet = 1; + varAtoms = io.DefineVariable("atoms", + {UnknownSizeYet,nColumns}, + {UnknownSizeYet, 0}, + {UnknownSizeYet,nColumns}); + +} diff --git a/src/USER-ADIOS/dump_custom_adios.h b/src/USER-ADIOS/dump_custom_adios.h new file mode 100644 index 0000000000..2461e20b2e --- /dev/null +++ b/src/USER-ADIOS/dump_custom_adios.h @@ -0,0 +1,94 @@ +/* -*- 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 DUMP_CLASS + +DumpStyle(custom/adios,DumpCustomADIOS) + +#else + +#ifndef LMP_DUMP_CUSTOM_ADIOS_H +#define LMP_DUMP_CUSTOM_ADIOS_H + +#include "dump_custom.h" +#include +#include +#include "adios2.h" + +namespace LAMMPS_NS { + +class DumpCustomADIOS : public DumpCustom { + public: + DumpCustomADIOS(class LAMMPS *, int, char **); + virtual ~DumpCustomADIOS(); + + protected: + + const std::string ioName="custom"; // name of adios group, referrable in adios2_config.xml + adios2::ADIOS *ad = nullptr; // adios object + adios2::IO io; // adios group of variables and attributes in this dump + adios2::Engine fh; // adios file/stream handle object + adios2::Variable varAtoms; // one ADIOS output variable we need to change + uint64_t groupsize; // pre-calculate # of bytes written per processor in a step before writing anything + std::vectorcolumnNames; // list of column names for the atom table (individual list of 'columns' string) + + virtual void openfile(); + virtual void write(); + virtual void init_style(); + +}; + +} + +#endif +#endif + +/* ERROR/WARNING messages: + +E: Cannot open dump file %s + +The output file for the dump command cannot be opened. Check that the +path and name are correct. + +E: Too much per-proc info for dump + +Number of local atoms times number of columns must fit in a 32-bit +integer for dump. + +E: Dump_modify format string is too short + +There are more fields to be dumped in a line of output than your +format string specifies. + +E: Could not find dump custom compute ID + +Self-explanatory. + +E: Could not find dump custom fix ID + +Self-explanatory. + +E: Dump custom and fix not computed at compatible times + +The fix must produce per-atom quantities on timesteps that dump custom +needs them. + +E: Could not find dump custom variable name + +Self-explanatory. + +E: Region ID for dump custom does not exist + +Self-explanatory. + +*/ From 24234d3a0bc43ba1ba22800c0fb9fafd24464309 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Thu, 24 Jan 2019 14:14:50 -0500 Subject: [PATCH 0142/1242] Fixed cmake build for ADIOS 2.x --- cmake/CMakeLists.txt | 38 +++++++++++--------------------------- runconf | 2 +- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 5010643fd8..bf2a176d58 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -216,6 +216,17 @@ endif() 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 + enable_language(C) + find_package(ADIOS2 REQUIRED) + list(APPEND LAMMPS_LINK_LIBS adios2::adios2) +endif() + + # do MPI detection after language activation, if MPI for these language is required find_package(MPI QUIET) option(BUILD_MPI "Build MPI version" ${MPI_FOUND}) @@ -1370,33 +1381,6 @@ if(BUILD_EXE) endif() endif() -#if(PKG_USER-ADIOS) -# cmake_minimum_required(VERSION 3.6) -# enable_language(C) -# -# find_package(ADIOS2 REQUIRED) -## find_package(MPI REQUIRED) -# include_directories(${ADIOS2_INCLUDE_DIRS}) -## include_directories(/opt/adios2/include) -## list(APPEND LAMMPS_LINK_LIBS ${ADIOS2_LIBRARIES}) -# list(APPEND LAMMPS_LINK_LIBS ${MPI_C_LIBRARIES}) -# if(BUILD_LIB) -## target_link_libraries(lammps adios2::adios2 MPI::MPI_C) -## #target_include_directories(lammps PRIVATE ${ADIOS_INCLUDE_DIRS}) -# elseif(BUILD_EXE) -## target_link_libraries(lmp adios2::adios2 MPI::MPI_C) -# endif() -#endif(PKG_USER-ADIOS) - -if(PKG_USER-ADIOS) - enable_language(C) - find_package(ADIOS2 REQUIRED) - if(BUILD_LIB) - target_link_libraries(lammps adios2::adios2) - elseif(BUILD_EXE) - target_link_libraries(lmp adios2::adios2) - endif() -endif() ############################################################################### # Build documentation diff --git a/runconf b/runconf index bb313981c5..18f05f38a5 100644 --- a/runconf +++ b/runconf @@ -1,7 +1,7 @@ # -D LAMMPS_SIZES=value # smallbig (default) or bigbig or smallsmall -export HDF5_ROOT=/opt/hdf5-serial +export HDF5_ROOT=/opt/hdf5-parallel export ADIOS2_DIR=/opt/adios2 cmake -D CMAKE_INSTALL_PREFIX=/opt/lammps \ From 200fed9d4c484318002779e728d33ad234d7cb55 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Thu, 24 Jan 2019 15:00:32 -0500 Subject: [PATCH 0143/1242] Fix basic errors in USER-ADIOS code --- src/USER-ADIOS/dump_atom_adios.cpp | 2 +- src/USER-ADIOS/dump_custom_adios.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/USER-ADIOS/dump_atom_adios.cpp b/src/USER-ADIOS/dump_atom_adios.cpp index b6ace357ac..e7a5f05e9d 100644 --- a/src/USER-ADIOS/dump_atom_adios.cpp +++ b/src/USER-ADIOS/dump_atom_adios.cpp @@ -254,7 +254,7 @@ void DumpAtomADIOS::init_style() pack_choice = &DumpAtomADIOS::pack_noscale_image; /* Define the group of variables for the atom style here since it's a fixed set */ - adios2::IO io = ad->DeclareIO(ioName); + io = ad->DeclareIO(ioName); if (!io.InConfigFile()) { // if not defined by user, we can change the default settings diff --git a/src/USER-ADIOS/dump_custom_adios.cpp b/src/USER-ADIOS/dump_custom_adios.cpp index 738e6dc076..5f54b987b1 100644 --- a/src/USER-ADIOS/dump_custom_adios.cpp +++ b/src/USER-ADIOS/dump_custom_adios.cpp @@ -63,7 +63,7 @@ DumpCustomADIOS::DumpCustomADIOS(LAMMPS *lmp, int narg, char **arg) : //if (screen) fprintf(screen, "DumpCustomADIOS constructor: nvariable=%d id_variable=%p, variables=%p, nfield=%d, earg=%p\n", nvariable, id_variable, variable, nfield, earg); columnNames.reserve(nfield); for (int i = 0; i < nfield; ++i) { - columnNames[i]=std::string(earg[i]); + columnNames.push_back(earg[i]); //if (screen) fprintf(screen, "earg[%d] = '%s'\n", i, earg[i]); } } @@ -294,7 +294,7 @@ void DumpCustomADIOS::init_style() } /* Define the group of variables for the atom style here since it's a fixed set */ - adios2::IO io = ad->DeclareIO(ioName); + io = ad->DeclareIO(ioName); if (!io.InConfigFile()) { // if not defined by user, we can change the default settings From 410d79d8b7d8ce4f01db038e10bd2a043a8dcdfd Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Thu, 24 Jan 2019 15:01:15 -0500 Subject: [PATCH 0144/1242] Add an example for USER/adios based on the balance example --- examples/USER/adios/adios2_config.xml | 45 ++++++++++ examples/USER/adios/in.adios_balance | 56 +++++++++++++ examples/USER/adios/log.balance | 114 ++++++++++++++++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 examples/USER/adios/adios2_config.xml create mode 100644 examples/USER/adios/in.adios_balance create mode 100644 examples/USER/adios/log.balance diff --git a/examples/USER/adios/adios2_config.xml b/examples/USER/adios/adios2_config.xml new file mode 100644 index 0000000000..5e1908eb52 --- /dev/null +++ b/examples/USER/adios/adios2_config.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/USER/adios/in.adios_balance b/examples/USER/adios/in.adios_balance new file mode 100644 index 0000000000..b44870afbb --- /dev/null +++ b/examples/USER/adios/in.adios_balance @@ -0,0 +1,56 @@ +# 2d circle of particles inside a box with LJ walls + +variable b index 0 + +variable x index 50 +variable y index 20 +variable d index 20 +variable v index 5 +variable w index 2 + +units lj +dimension 2 +atom_style atomic +boundary f f p + +lattice hex 0.85 +region box block 0 $x 0 $y -0.5 0.5 +create_box 1 box +region circle sphere $(v_d/2+1) $(v_d/2/sqrt(3.0)+1) 0.0 $(v_d/2) +create_atoms 1 region circle +mass 1 1.0 + +velocity all create 0.5 87287 loop geom +velocity all set $v $w 0 sum yes + +pair_style lj/cut 2.5 +pair_coeff 1 1 10.0 1.0 2.5 + +neighbor 0.3 bin +neigh_modify delay 0 every 1 check yes + +fix 1 all nve + +fix 2 all wall/lj93 xlo 0.0 1 1 2.5 xhi $x 1 1 2.5 +fix 3 all wall/lj93 ylo 0.0 1 1 2.5 yhi $y 1 1 2.5 + +comm_style tiled +fix 10 all balance 50 0.9 rcb + +compute 1 all property/atom proc +variable p atom c_1%10 +dump 2 all custom 50 balance.dump id v_p x y z +dump 3 all custom/adios 50 balance_custom.bp id v_p x y z +dump 4 all atom/adios 50 balance_atom.bp + +#dump 3 all image 50 image.*.jpg v_p type & +# adiam 1.0 view 0 0 zoom 1.8 subbox yes 0.02 +#variable colors string & +# "red green blue yellow white & +# purple pink orange lime gray" +#dump_modify 3 pad 5 amap 0 10 sa 1 10 ${colors} + +thermo_style custom step temp epair press f_10[3] f_10 +thermo 100 + +run 200 diff --git a/examples/USER/adios/log.balance b/examples/USER/adios/log.balance new file mode 100644 index 0000000000..162ecf7741 --- /dev/null +++ b/examples/USER/adios/log.balance @@ -0,0 +1,114 @@ +LAMMPS (4 Jan 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 circle of particles inside a box with LJ walls + +variable b index 0 + +variable x index 50 +variable y index 20 +variable d index 20 +variable v index 5 +variable w index 2 + +units lj +dimension 2 +atom_style atomic +boundary f f p + +lattice hex 0.85 +Lattice spacing in x,y,z = 1.16553 2.01877 1.16553 +region box block 0 $x 0 $y -0.5 0.5 +region box block 0 50 0 $y -0.5 0.5 +region box block 0 50 0 20 -0.5 0.5 +create_box 1 box +Created orthogonal box = (0 0 -0.582767) to (58.2767 40.3753 0.582767) + 2 by 2 by 1 MPI processor grid +region circle sphere $(v_d/2+1) $(v_d/2/sqrt(3.0)+1) 0.0 $(v_d/2) +region circle sphere 11 $(v_d/2/sqrt(3.0)+1) 0.0 $(v_d/2) +region circle sphere 11 6.7735026918962581988 0.0 $(v_d/2) +region circle sphere 11 6.7735026918962581988 0.0 10 +create_atoms 1 region circle +Created 361 atoms + Time spent = 0.00171804 secs +mass 1 1.0 + +velocity all create 0.5 87287 loop geom +velocity all set $v $w 0 sum yes +velocity all set 5 $w 0 sum yes +velocity all set 5 2 0 sum yes + +pair_style lj/cut 2.5 +pair_coeff 1 1 10.0 1.0 2.5 + +neighbor 0.3 bin +neigh_modify delay 0 every 1 check yes + +fix 1 all nve + +fix 2 all wall/lj93 xlo 0.0 1 1 2.5 xhi $x 1 1 2.5 +fix 2 all wall/lj93 xlo 0.0 1 1 2.5 xhi 50 1 1 2.5 +fix 3 all wall/lj93 ylo 0.0 1 1 2.5 yhi $y 1 1 2.5 +fix 3 all wall/lj93 ylo 0.0 1 1 2.5 yhi 20 1 1 2.5 + +comm_style tiled +fix 10 all balance 50 0.9 rcb + +compute 1 all property/atom proc +variable p atom c_1%10 +dump 2 all custom 50 balance.dump id v_p x y z +dump 3 all custom/adios 50 balance_custom.bp id v_p x y z +dump 4 all atom/adios 50 balance_atom.bp + +#dump 3 all image 50 image.*.jpg v_p type # adiam 1.0 view 0 0 zoom 1.8 subbox yes 0.02 +#variable colors string # "red green blue yellow white # purple pink orange lime gray" +#dump_modify 3 pad 5 amap 0 10 sa 1 10 ${colors} + +thermo_style custom step temp epair press f_10[3] f_10 +thermo 100 + +run 200 +Neighbor list info ... + update every 1 steps, delay 0 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 = 42 29 1 + 1 neighbor lists, perpetual/occasional/extra = 1 0 0 + (1) pair lj/cut, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/2d/newton + bin: standard +Per MPI rank memory allocation (min/avg/max) = 4.926 | 4.933 | 4.944 Mbytes +Step Temp E_pair Press f_10[3] f_10 + 0 25.701528 -29.143179 -1.2407285 3.2354571 1.0526316 + 100 26.269576 -29.713313 7.9052334 1.2742382 1.0304709 + 200 26.368336 -29.809962 1.6412462 1.2520776 1.0083102 +Loop time of 0.0992351 on 4 procs for 200 steps with 361 atoms + +Performance: 870660.046 tau/day, 2015.417 timesteps/s +32.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.0078368 | 0.0081607 | 0.0085468 | 0.3 | 8.22 +Neigh | 0.002804 | 0.0045915 | 0.0092173 | 3.9 | 4.63 +Comm | 0.044407 | 0.05352 | 0.062051 | 3.0 | 53.93 +Output | 0.011406 | 0.012025 | 0.01342 | 0.7 | 12.12 +Modify | 0.006305 | 0.0064294 | 0.0066617 | 0.2 | 6.48 +Other | | 0.01451 | | | 14.62 + +Nlocal: 90.25 ave 91 max 90 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Nghost: 58.25 ave 64 max 51 min +Histogram: 1 0 0 0 0 0 2 0 0 1 +Neighs: 730.75 ave 801 max 671 min +Histogram: 1 0 1 0 0 1 0 0 0 1 + +Total # of neighbors = 2923 +Ave neighs/atom = 8.09695 +Neighbor list builds = 60 +Dangerous builds = 0 +Total wall time: 0:00:00 From a4b9542ba95581a299c421e8d0b20545af06df68 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Wed, 6 Feb 2019 14:32:01 -0500 Subject: [PATCH 0145/1242] remove personal runconf file. cleanup ADIOS2 xml config file for example --- examples/USER/adios/adios2_config.xml | 17 ++--------------- runconf | 22 ---------------------- 2 files changed, 2 insertions(+), 37 deletions(-) delete mode 100644 runconf diff --git a/examples/USER/adios/adios2_config.xml b/examples/USER/adios/adios2_config.xml index 5e1908eb52..7462731d43 100644 --- a/examples/USER/adios/adios2_config.xml +++ b/examples/USER/adios/adios2_config.xml @@ -4,25 +4,12 @@ - - diff --git a/runconf b/runconf deleted file mode 100644 index 18f05f38a5..0000000000 --- a/runconf +++ /dev/null @@ -1,22 +0,0 @@ - -# -D LAMMPS_SIZES=value # smallbig (default) or bigbig or smallsmall - -export HDF5_ROOT=/opt/hdf5-parallel -export ADIOS2_DIR=/opt/adios2 - -cmake -D CMAKE_INSTALL_PREFIX=/opt/lammps \ - -D CMAKE_BUILD_TYPE=Debug \ - -D BUILD_MPI=yes \ - -D LAMMPS_MACHINE=adiosvm \ - -D BUILD_EXE=yes \ - -D BUILD_LIB=no \ - -D BUILD_SHARED_LIBS=no \ - -D BUILD_DOC=no \ - -D LAMMPS_SIZES=smallbig \ - -D PKG_USER-H5MD=yes \ - -D PKG_USER-ADIOS=yes \ - ../cmake - - - - From 9c52a3754681686500412345c4dad983745cc19e Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Thu, 7 Feb 2019 16:38:36 -0500 Subject: [PATCH 0146/1242] PIMPL implementation of USER-ADIOS to hide internal data from style header file --- cmake/CMakeLists.txt | 9 +- src/USER-ADIOS/dump_atom_adios.cpp | 275 ++++++++++--------- src/USER-ADIOS/dump_atom_adios.h | 58 ++-- src/USER-ADIOS/dump_custom_adios.cpp | 384 ++++++++++++++++----------- src/USER-ADIOS/dump_custom_adios.h | 85 +++--- 5 files changed, 447 insertions(+), 364 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index bf2a176d58..e5d362fe52 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -3,18 +3,11 @@ # This file is part of LAMMPS # Created by Christoph Junghans and Richard Berger if(PKG_USER-ADIOS) - message(STATUS "Force newer standards because using ADIOS") + message(STATUS "Force newer standards because of using ADIOS") cmake_minimum_required(VERSION 3.6) # Force C++11 and C99 set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) - # Use meta-compile features if available, otherwise use specific language - # features -# if(NOT (CMAKE_VERSION VERSION_LESS 3.9)) -# set(ADIOS2_CXX11_FEATURES cxx_std_11) -# else() -# set(ADIOS2_CXX11_FEATURES cxx_auto_type cxx_nullptr) -# endif() else() cmake_minimum_required(VERSION 2.8.12) endif() diff --git a/src/USER-ADIOS/dump_atom_adios.cpp b/src/USER-ADIOS/dump_atom_adios.cpp index e7a5f05e9d..55d6c5fbf9 100644 --- a/src/USER-ADIOS/dump_atom_adios.cpp +++ b/src/USER-ADIOS/dump_atom_adios.cpp @@ -15,16 +15,17 @@ Contributing author: Norbert Podhorszki (ORNL) ------------------------------------------------------------------------- */ -#include #include "dump_atom_adios.h" -#include "domain.h" #include "atom.h" -#include "update.h" +#include "domain.h" +#include "error.h" #include "group.h" #include "memory.h" #include "universe.h" -#include "error.h" +#include "update.h" +#include +#include "adios2.h" using namespace LAMMPS_NS; @@ -32,23 +33,44 @@ using namespace LAMMPS_NS; #define DUMP_BUF_CHUNK_SIZE 16384 #define DUMP_BUF_INCREMENT_SIZE 4096 +namespace LAMMPS_NS +{ +class DumpAtomADIOSInternal +{ + +public: + DumpAtomADIOSInternal(){}; + ~DumpAtomADIOSInternal() = default; + + // name of adios group, referrable in adios2_config.xml + const std::string ioName = "atom"; + adios2::ADIOS *ad = nullptr; // adios object + adios2::IO io; // adios group of variables and attributes in this dump + adios2::Engine fh; // adios file/stream handle object + // one ADIOS output variable we need to change every step + adios2::Variable varAtoms; +}; +} + /* ---------------------------------------------------------------------- */ -DumpAtomADIOS::DumpAtomADIOS(LAMMPS *lmp, int narg, char **arg) : - DumpAtom(lmp, narg, arg) +DumpAtomADIOS::DumpAtomADIOS(LAMMPS *lmp, int narg, char **arg) +: DumpAtom(lmp, narg, arg) { - ad = new adios2::ADIOS("adios2_config.xml", world, adios2::DebugON); - groupSize = 0; + internal = new DumpAtomADIOSInternal(); + internal->ad = + new adios2::ADIOS("adios2_config.xml", world, adios2::DebugON); } /* ---------------------------------------------------------------------- */ DumpAtomADIOS::~DumpAtomADIOS() { - if (fh) - { - fh.Close(); + if (internal->fh) { + internal->fh.Close(); } + delete internal->ad; + delete internal; } /* ---------------------------------------------------------------------- */ @@ -59,39 +81,39 @@ void DumpAtomADIOS::openfile() // if one file per timestep, replace '*' with current timestep char *filestar = strdup(filename); char *filecurrent = new char[strlen(filestar) + 16]; - char *ptr = strchr(filestar,'*'); + char *ptr = strchr(filestar, '*'); *ptr = '\0'; if (padflag == 0) - sprintf(filecurrent,"%s" BIGINT_FORMAT "%s", - filestar,update->ntimestep,ptr+1); + snprintf(filecurrent, sizeof(filecurrent), "%s" BIGINT_FORMAT "%s", + filestar, update->ntimestep, ptr + 1); else { - char bif[8],pad[16]; - strcpy(bif,BIGINT_FORMAT); - sprintf(pad,"%%s%%0%d%s%%s",padflag,&bif[1]); - sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1); + char bif[8], pad[16]; + strcpy(bif, BIGINT_FORMAT); + snprintf(pad, sizeof(pad), "%%s%%0%d%s%%s", padflag, &bif[1]); + snprintf(filecurrent, sizeof(filecurrent), pad, filestar, + update->ntimestep, ptr + 1); } - fh = io.Open(filecurrent, adios2::Mode::Write, world); - if (!fh) { + internal->fh = + internal->io.Open(filecurrent, adios2::Mode::Write, world); + if (!internal->fh) { char str[128]; - sprintf(str,"Cannot open dump file %s",filecurrent); - error->one(FLERR,str); + snprintf(str, sizeof(str), "Cannot open dump file %s", filecurrent); + error->one(FLERR, str); } free(filestar); - delete [] filecurrent; - } - else - { - if (!singlefile_opened) - { - fh = io.Open(filename, adios2::Mode::Write, world); - if (!fh) { + delete[] filecurrent; + } else { + if (!singlefile_opened) { + internal->fh = + internal->io.Open(filename, adios2::Mode::Write, world); + if (!internal->fh) { char str[128]; - sprintf(str,"Cannot open dump file %s",filename); - error->one(FLERR,str); + snprintf(str, sizeof(str), "Cannot open dump file %s", + filename); + error->one(FLERR, str); } singlefile_opened = 1; } - } } @@ -126,83 +148,77 @@ void DumpAtomADIOS::write() // atomOffset = sum of # of atoms up to this proc (exclusive prefix sum) bigint bnme = nme; - MPI_Allreduce(&bnme,&ntotal,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&bnme, &ntotal, 1, MPI_LMP_BIGINT, MPI_SUM, world); bigint atomOffset; // sum of all atoms on processes 0..me-1 - MPI_Scan (&bnme, &atomOffset, 1, MPI_LMP_BIGINT, MPI_SUM, world); + MPI_Scan(&bnme, &atomOffset, 1, MPI_LMP_BIGINT, MPI_SUM, world); atomOffset -= nme; // exclusive prefix sum needed // Now we know the global size and the local subset size and offset - // of the atoms table + // of the atoms table size_t nAtomsGlobal = static_cast(ntotal); size_t startRow = static_cast(atomOffset); size_t nAtomsLocal = static_cast(nme); size_t nColumns = static_cast(size_one); - varAtoms.SetShape({nAtomsGlobal,nColumns}); - varAtoms.SetSelection({{startRow, 0}, {nAtomsLocal,nColumns}}); + internal->varAtoms.SetShape({nAtomsGlobal, nColumns}); + internal->varAtoms.SetSelection({{startRow, 0}, {nAtomsLocal, nColumns}}); // insure buf is sized for packing - // adios does not limit per-process data size so nme*size_one is not constrained to int + // adios does not limit per-process data size so nme*size_one is not + // constrained to int // if sorting on IDs also request ID list from pack() // sort buf as needed if (nme > maxbuf) { maxbuf = nme; memory->destroy(buf); - memory->create(buf,(maxbuf*size_one),"dump:buf"); + memory->create(buf, (maxbuf * size_one), "dump:buf"); } if (sort_flag && sortcol == 0 && nme > maxids) { maxids = nme; memory->destroy(ids); - memory->create(ids,maxids,"dump:ids"); + memory->create(ids, maxids, "dump:ids"); } - if (sort_flag && sortcol == 0) pack(ids); - else pack(NULL); - if (sort_flag) sort(); - - // Calculate data size written by this process - groupSize = nme * size_one * sizeof(double); // size of atoms data on this process - groupSize += 3*sizeof(uint64_t) + 1*sizeof(int); // scalars written by each process - if (me == 0) { - groupSize += 1*sizeof(uint64_t) + 1*sizeof(int) + 6*sizeof(double); // scalars - if (domain->triclinic) { - groupSize += 3*sizeof(double); // boxxy, boxxz, boxyz - } - } + if (sort_flag && sortcol == 0) + pack(ids); + else + pack(NULL); + if (sort_flag) + sort(); openfile(); - fh.BeginStep(); + internal->fh.BeginStep(); // write info on data as scalars (by me==0) if (me == 0) { - fh.Put("ntimestep", update->ntimestep); - fh.Put("nprocs", nprocs); + internal->fh.Put("ntimestep", update->ntimestep); + internal->fh.Put("nprocs", nprocs); - fh.Put("boxxlo", boxxlo); - fh.Put("boxxhi", boxxhi); - fh.Put("boxylo", boxylo); - fh.Put("boxyhi", boxyhi); - fh.Put("boxzlo", boxzlo); - fh.Put("boxzhi", boxzhi); + internal->fh.Put("boxxlo", boxxlo); + internal->fh.Put("boxxhi", boxxhi); + internal->fh.Put("boxylo", boxylo); + internal->fh.Put("boxyhi", boxyhi); + internal->fh.Put("boxzlo", boxzlo); + internal->fh.Put("boxzhi", boxzhi); if (domain->triclinic) { - fh.Put("boxxy", boxxy); - fh.Put("boxxz", boxxz); - fh.Put("boxyz", boxyz); + internal->fh.Put("boxxy", boxxy); + internal->fh.Put("boxxz", boxxz); + internal->fh.Put("boxyz", boxyz); } } - // Everyone needs to write scalar variables that are used as dimensions and offsets of arrays - fh.Put("natoms", ntotal); - fh.Put("ncolumns", size_one); - fh.Put("nme", bnme); - fh.Put("offset", atomOffset); + // Everyone needs to write scalar variables that are used as dimensions and + // offsets of arrays + internal->fh.Put("natoms", ntotal); + internal->fh.Put("ncolumns", size_one); + internal->fh.Put("nme", bnme); + internal->fh.Put("offset", atomOffset); // now write the atoms - fh.Put("atoms", buf); - fh.EndStep();// I/O will happen now... + internal->fh.Put(internal->varAtoms, buf); + internal->fh.EndStep(); // I/O will happen now... - if (multifile) - { - fh.Close(); + if (multifile) { + internal->fh.Close(); } } @@ -210,33 +226,36 @@ void DumpAtomADIOS::write() void DumpAtomADIOS::init_style() { - if (image_flag == 0) size_one = 5; - else size_one = 8; + if (image_flag == 0) + size_one = 5; + else + size_one = 8; // setup boundary string domain->boundary_string(boundstr); - // remove % from filename since ADIOS always writes a global file with data/metadata + // remove % from filename since ADIOS always writes a global file with + // data/metadata int len = strlen(filename); - char *ptr = strchr(filename,'%'); + char *ptr = strchr(filename, '%'); if (ptr) { *ptr = '\0'; - char *s = new char[len-1]; - sprintf(s,"%s%s",filename,ptr+1); - strncpy(filename,s,len); + char *s = new char[len - 1]; + snprintf(s, sizeof(s), "%s%s", filename, ptr + 1); + strncpy(filename, s, len); } // setup column string if (scale_flag == 0 && image_flag == 0) - columns = (char *) "id type x y z"; + columns = (char *)"id type x y z"; else if (scale_flag == 0 && image_flag == 1) - columns = (char *) "id type x y z ix iy iz"; + columns = (char *)"id type x y z ix iy iz"; else if (scale_flag == 1 && image_flag == 0) - columns = (char *) "id type xs ys zs"; + columns = (char *)"id type xs ys zs"; else if (scale_flag == 1 && image_flag == 1) - columns = (char *) "id type xs ys zs ix iy iz"; + columns = (char *)"id type xs ys zs ix iy iz"; // setup function ptrs @@ -253,62 +272,68 @@ void DumpAtomADIOS::init_style() else if (scale_flag == 0 && image_flag == 1) pack_choice = &DumpAtomADIOS::pack_noscale_image; - /* Define the group of variables for the atom style here since it's a fixed set */ - io = ad->DeclareIO(ioName); - if (!io.InConfigFile()) - { + /* Define the group of variables for the atom style here since it's a fixed + * set */ + internal->io = internal->ad->DeclareIO(internal->ioName); + if (!internal->io.InConfigFile()) { // if not defined by user, we can change the default settings // BPFile is the default writer - io.SetEngine("BPFile"); + internal->io.SetEngine("BPFile"); int num_aggregators = multiproc; if (num_aggregators == 0) num_aggregators = 1; char nstreams[128]; - sprintf (nstreams, "%d", num_aggregators); - io.SetParameters({{"substreams", nstreams}}); - if (me==0 && screen) fprintf(screen, "ADIOS method for %s is n-to-m (aggregation with %s writers)\n", filename, nstreams); + snprintf(nstreams, sizeof(nstreams), "%d", num_aggregators); + internal->io.SetParameters({{"substreams", nstreams}}); + if (me == 0 && screen) + fprintf( + screen, + "ADIOS method for %s is n-to-m (aggregation with %s writers)\n", + filename, nstreams); } + internal->io.DefineVariable("ntimestep"); + internal->io.DefineVariable("natoms"); - io.DefineVariable("ntimestep"); - io.DefineVariable("natoms"); + internal->io.DefineVariable("nprocs"); + internal->io.DefineVariable("ncolumns"); - io.DefineVariable("nprocs"); - io.DefineVariable("ncolumns"); + internal->io.DefineVariable("boxxlo"); + internal->io.DefineVariable("boxxhi"); + internal->io.DefineVariable("boxylo"); + internal->io.DefineVariable("boxyhi"); + internal->io.DefineVariable("boxzlo"); + internal->io.DefineVariable("boxzhi"); - io.DefineVariable("boxxlo"); - io.DefineVariable("boxxhi"); - io.DefineVariable("boxylo"); - io.DefineVariable("boxyhi"); - io.DefineVariable("boxzlo"); - io.DefineVariable("boxzhi"); + internal->io.DefineVariable("boxxy"); + internal->io.DefineVariable("boxxz"); + internal->io.DefineVariable("boxyz"); - io.DefineVariable("boxxy"); - io.DefineVariable("boxxz"); - io.DefineVariable("boxyz"); + internal->io.DefineAttribute("triclinic", domain->triclinic); + internal->io.DefineAttribute("scaled", scale_flag); + internal->io.DefineAttribute("image", image_flag); - io.DefineAttribute("triclinic", domain->triclinic); - io.DefineAttribute("scaled", scale_flag); - io.DefineAttribute("image", image_flag); + int *boundaryptr = reinterpret_cast(domain->boundary); + internal->io.DefineAttribute("boundary", boundaryptr, 6); - int *boundaryptr = reinterpret_cast(domain->boundary); - io.DefineAttribute("boundary", boundaryptr, 6); + internal->io.DefineAttribute("columns", columns); + internal->io.DefineAttribute("boundarystr", boundstr); + internal->io.DefineAttribute("LAMMPS/dump_style", "atom"); + internal->io.DefineAttribute("LAMMPS/version", + universe->version); + internal->io.DefineAttribute("LAMMPS/num_ver", + universe->num_ver); - io.DefineAttribute("columns", columns); - io.DefineAttribute("boundarystr", boundstr); - io.DefineAttribute("LAMMPS/dump_style", "atom"); - io.DefineAttribute("LAMMPS/version", universe->version); - io.DefineAttribute("LAMMPS/num_ver", universe->num_ver); - - io.DefineVariable("nme", {adios2::LocalValueDim}); // local dimension variable - io.DefineVariable("offset", {adios2::LocalValueDim}); // local dimension variable + internal->io.DefineVariable( + "nme", {adios2::LocalValueDim}); // local dimension variable + internal->io.DefineVariable( + "offset", {adios2::LocalValueDim}); // local dimension variable // atom table size is not known at the moment // it will be correctly defined at the moment of write size_t UnknownSizeYet = 1; size_t nColumns = static_cast(size_one); - varAtoms = io.DefineVariable("atoms", - {UnknownSizeYet,nColumns}, - {UnknownSizeYet, 0}, - {UnknownSizeYet,nColumns}); + internal->varAtoms = internal->io.DefineVariable( + "atoms", {UnknownSizeYet, nColumns}, {UnknownSizeYet, 0}, + {UnknownSizeYet, nColumns}); } diff --git a/src/USER-ADIOS/dump_atom_adios.h b/src/USER-ADIOS/dump_atom_adios.h index a3999bea76..dc6bc519bb 100644 --- a/src/USER-ADIOS/dump_atom_adios.h +++ b/src/USER-ADIOS/dump_atom_adios.h @@ -12,59 +12,51 @@ ------------------------------------------------------------------------- */ #ifdef DUMP_CLASS - -DumpStyle(atom/adios,DumpAtomADIOS) - +// clang-format off +DumpStyle(atom/adios, DumpAtomADIOS) +// clang-format on #else #ifndef LMP_DUMP_ATOM_ADIOS_H #define LMP_DUMP_ATOM_ADIOS_H #include "dump_atom.h" -#include -#include -#include "adios2.h" -namespace LAMMPS_NS { +namespace LAMMPS_NS +{ -class DumpAtomADIOS : public DumpAtom { +class DumpAtomADIOSInternal; - public: - DumpAtomADIOS(class LAMMPS *, int, char **); - virtual ~DumpAtomADIOS(); +class DumpAtomADIOS : public DumpAtom +{ - protected: +public: + DumpAtomADIOS(class LAMMPS *, int, char **); + virtual ~DumpAtomADIOS(); - const std::string ioName="atom"; // name of adios group, referrable in adios2_config.xml - adios2::ADIOS *ad = nullptr; // adios object - adios2::IO io; // adios group of variables and attributes in this dump - adios2::Engine fh; // adios file/stream handle object - adios2::Variable varAtoms; // one ADIOS output variable we need to change - uint64_t groupSize; // pre-calculate # of bytes written per processor in a step before writing anything - uint64_t groupTotalSize; // ADIOS buffer size returned by adios_group_size(), valid only if size is > default 16MB ADIOS buffer - std::string filecurrent; // name of file for this round (with % and * replaced) - - virtual void openfile(); - virtual void write(); - virtual void init_style(); +protected: + virtual void openfile(); + virtual void write(); + virtual void init_style(); +private: + DumpAtomADIOSInternal *internal; }; - } #endif #endif -/* ERROR/WARNING messages: + /* ERROR/WARNING messages: -E: Cannot open dump file %s + E: Cannot open dump file %s -The output file for the dump command cannot be opened. Check that the -path and name are correct. + The output file for the dump command cannot be opened. Check that the + path and name are correct. -E: Too much per-proc info for dump + E: Too much per-proc info for dump -Number of local atoms times number of columns must fit in a 32-bit -integer for dump. + Number of local atoms times number of columns must fit in a 32-bit + integer for dump. -*/ + */ diff --git a/src/USER-ADIOS/dump_custom_adios.cpp b/src/USER-ADIOS/dump_custom_adios.cpp index 5f54b987b1..5b76688098 100644 --- a/src/USER-ADIOS/dump_custom_adios.cpp +++ b/src/USER-ADIOS/dump_custom_adios.cpp @@ -15,25 +15,25 @@ Contributing author: Paul Coffman (IBM) ------------------------------------------------------------------------- */ -#include -#include -#include #include "dump_custom_adios.h" #include "atom.h" -#include "force.h" +#include "compute.h" #include "domain.h" -#include "region.h" +#include "error.h" +#include "fix.h" +#include "force.h" #include "group.h" #include "input.h" -#include "variable.h" -#include "update.h" -#include "modify.h" -#include "compute.h" -#include "fix.h" -#include "universe.h" #include "memory.h" -#include "error.h" -#include +#include "modify.h" +#include "region.h" +#include "universe.h" +#include "update.h" +#include "variable.h" +#include +#include + +#include "adios2.h" using namespace LAMMPS_NS; @@ -41,30 +41,107 @@ using namespace LAMMPS_NS; #define DUMP_BUF_CHUNK_SIZE 16384 #define DUMP_BUF_INCREMENT_SIZE 4096 -enum{ID,MOL,TYPE,ELEMENT,MASS, - X,Y,Z,XS,YS,ZS,XSTRI,YSTRI,ZSTRI,XU,YU,ZU,XUTRI,YUTRI,ZUTRI, - XSU,YSU,ZSU,XSUTRI,YSUTRI,ZSUTRI, - IX,IY,IZ, - VX,VY,VZ,FX,FY,FZ, - Q,MUX,MUY,MUZ,MU,RADIUS,DIAMETER, - OMEGAX,OMEGAY,OMEGAZ,ANGMOMX,ANGMOMY,ANGMOMZ, - TQX,TQY,TQZ,SPIN,ERADIUS,ERVEL,ERFORCE, - COMPUTE,FIX,VARIABLE}; -enum{LT,LE,GT,GE,EQ,NEQ}; -enum{INT,DOUBLE,STRING,BIGINT}; // same as in DumpCustom +enum { + ID, + MOL, + TYPE, + ELEMENT, + MASS, + X, + Y, + Z, + XS, + YS, + ZS, + XSTRI, + YSTRI, + ZSTRI, + XU, + YU, + ZU, + XUTRI, + YUTRI, + ZUTRI, + XSU, + YSU, + ZSU, + XSUTRI, + YSUTRI, + ZSUTRI, + IX, + IY, + IZ, + VX, + VY, + VZ, + FX, + FY, + FZ, + Q, + MUX, + MUY, + MUZ, + MU, + RADIUS, + DIAMETER, + OMEGAX, + OMEGAY, + OMEGAZ, + ANGMOMX, + ANGMOMY, + ANGMOMZ, + TQX, + TQY, + TQZ, + SPIN, + ERADIUS, + ERVEL, + ERFORCE, + COMPUTE, + FIX, + VARIABLE +}; +enum { LT, LE, GT, GE, EQ, NEQ }; +enum { INT, DOUBLE, STRING, BIGINT }; // same as in DumpCustom + +namespace LAMMPS_NS +{ +class DumpCustomADIOSInternal +{ + +public: + DumpCustomADIOSInternal(){}; + ~DumpCustomADIOSInternal() = default; + + // name of adios group, referrable in adios2_config.xml + const std::string ioName = "custom"; + adios2::ADIOS *ad = nullptr; // adios object + adios2::IO io; // adios group of variables and attributes in this dump + adios2::Engine fh; // adios file/stream handle object + // one ADIOS output variable we need to change every step + adios2::Variable varAtoms; + // list of column names for the atom table + // (individual list of 'columns' string) + std::vector columnNames; +}; +} /* ---------------------------------------------------------------------- */ -DumpCustomADIOS::DumpCustomADIOS(LAMMPS *lmp, int narg, char **arg) : - DumpCustom(lmp, narg, arg) +DumpCustomADIOS::DumpCustomADIOS(LAMMPS *lmp, int narg, char **arg) +: DumpCustom(lmp, narg, arg) { - ad = new adios2::ADIOS("adios2_config.xml", world, adios2::DebugON); - groupsize = 0; - //if (screen) fprintf(screen, "DumpCustomADIOS constructor: nvariable=%d id_variable=%p, variables=%p, nfield=%d, earg=%p\n", nvariable, id_variable, variable, nfield, earg); - columnNames.reserve(nfield); + internal = new DumpCustomADIOSInternal(); + internal->ad = + new adios2::ADIOS("adios2_config.xml", world, adios2::DebugON); + + // if (screen) fprintf(screen, "DumpCustomADIOS constructor: nvariable=%d + // id_variable=%p, variables=%p, nfield=%d, earg=%p\n", nvariable, + // id_variable, variable, nfield, earg); + internal->columnNames.reserve(nfield); for (int i = 0; i < nfield; ++i) { - columnNames.push_back(earg[i]); - //if (screen) fprintf(screen, "earg[%d] = '%s'\n", i, earg[i]); + internal->columnNames.push_back(earg[i]); + // if (screen) fprintf(screen, "earg[%d] = '%s'\n", i, earg[i]); } } @@ -72,11 +149,11 @@ DumpCustomADIOS::DumpCustomADIOS(LAMMPS *lmp, int narg, char **arg) : DumpCustomADIOS::~DumpCustomADIOS() { - columnNames.clear(); - if (fh) - { - fh.Close(); + internal->columnNames.clear(); + if (internal->fh) { + internal->fh.Close(); } + delete internal->ad; } /* ---------------------------------------------------------------------- */ @@ -87,39 +164,37 @@ void DumpCustomADIOS::openfile() // if one file per timestep, replace '*' with current timestep char *filestar = strdup(filename); char *filecurrent = new char[strlen(filestar) + 16]; - char *ptr = strchr(filestar,'*'); + char *ptr = strchr(filestar, '*'); *ptr = '\0'; if (padflag == 0) - sprintf(filecurrent,"%s" BIGINT_FORMAT "%s", - filestar,update->ntimestep,ptr+1); + sprintf(filecurrent, "%s" BIGINT_FORMAT "%s", filestar, + update->ntimestep, ptr + 1); else { - char bif[8],pad[16]; - strcpy(bif,BIGINT_FORMAT); - sprintf(pad,"%%s%%0%d%s%%s",padflag,&bif[1]); - sprintf(filecurrent,pad,filestar,update->ntimestep,ptr+1); + char bif[8], pad[16]; + strcpy(bif, BIGINT_FORMAT); + sprintf(pad, "%%s%%0%d%s%%s", padflag, &bif[1]); + sprintf(filecurrent, pad, filestar, update->ntimestep, ptr + 1); } - fh = io.Open(filecurrent, adios2::Mode::Write, world); - if (!fh) { + internal->fh = + internal->io.Open(filecurrent, adios2::Mode::Write, world); + if (!internal->fh) { char str[128]; - sprintf(str,"Cannot open dump file %s",filecurrent); - error->one(FLERR,str); + sprintf(str, "Cannot open dump file %s", filecurrent); + error->one(FLERR, str); } free(filestar); - delete [] filecurrent; - } - else - { - if (!singlefile_opened) - { - fh = io.Open(filename, adios2::Mode::Write, world); - if (!fh) { + delete[] filecurrent; + } else { + if (!singlefile_opened) { + internal->fh = + internal->io.Open(filename, adios2::Mode::Write, world); + if (!internal->fh) { char str[128]; - sprintf(str,"Cannot open dump file %s",filename); - error->one(FLERR,str); + sprintf(str, "Cannot open dump file %s", filename); + error->one(FLERR, str); } singlefile_opened = 1; } - } } @@ -154,20 +229,20 @@ void DumpCustomADIOS::write() // atomOffset = sum of # of atoms up to this proc (exclusive prefix sum) bigint bnme = nme; - MPI_Allreduce(&bnme,&ntotal,1,MPI_LMP_BIGINT,MPI_SUM,world); + MPI_Allreduce(&bnme, &ntotal, 1, MPI_LMP_BIGINT, MPI_SUM, world); bigint atomOffset; // sum of all atoms on processes 0..me-1 - MPI_Scan (&bnme, &atomOffset, 1, MPI_LMP_BIGINT, MPI_SUM, world); + MPI_Scan(&bnme, &atomOffset, 1, MPI_LMP_BIGINT, MPI_SUM, world); atomOffset -= nme; // exclusive prefix sum needed // Now we know the global size and the local subset size and offset - // of the atoms table + // of the atoms table size_t nAtomsGlobal = static_cast(ntotal); size_t startRow = static_cast(atomOffset); size_t nAtomsLocal = static_cast(nme); size_t nColumns = static_cast(size_one); - varAtoms.SetShape({nAtomsGlobal,nColumns}); - varAtoms.SetSelection({{startRow, 0}, {nAtomsLocal,nColumns}}); + internal->varAtoms.SetShape({nAtomsGlobal, nColumns}); + internal->varAtoms.SetSelection({{startRow, 0}, {nAtomsLocal, nColumns}}); // insure filewriter proc can receive everyone's info // limit nmax*size_one to int since used as arg in MPI_Rsend() below @@ -176,64 +251,57 @@ void DumpCustomADIOS::write() // sort buf as needed if (nme > maxbuf) { - if ((bigint) nme * size_one > MAXSMALLINT) - error->all(FLERR,"Too much per-proc info for dump"); + if ((bigint)nme * size_one > MAXSMALLINT) + error->all(FLERR, "Too much per-proc info for dump"); maxbuf = nme; memory->destroy(buf); - memory->create(buf,(maxbuf*size_one),"dump:buf"); + memory->create(buf, (maxbuf * size_one), "dump:buf"); } if (sort_flag && sortcol == 0 && nme > maxids) { maxids = nme; memory->destroy(ids); - memory->create(ids,maxids,"dump:ids"); + memory->create(ids, maxids, "dump:ids"); } - if (sort_flag && sortcol == 0) pack(ids); - else pack(NULL); - if (sort_flag) sort(); - - // Calculate data size written by this process - groupsize = nme * size_one * sizeof(double); // size of atoms data on this process - groupsize += 3*sizeof(uint64_t) + 1*sizeof(int); // scalars written by each process - if (me == 0) { - groupsize += 1*sizeof(uint64_t) + 1*sizeof(int) + 6*sizeof(double); // scalars - if (domain->triclinic) { - groupsize += 3*sizeof(double); // boxxy, boxxz, boxyz - } - } + if (sort_flag && sortcol == 0) + pack(ids); + else + pack(NULL); + if (sort_flag) + sort(); openfile(); - fh.BeginStep(); + internal->fh.BeginStep(); // write info on data as scalars (by me==0) if (me == 0) { - fh.Put("ntimestep", update->ntimestep); - fh.Put("nprocs", nprocs); + internal->fh.Put("ntimestep", update->ntimestep); + internal->fh.Put("nprocs", nprocs); - fh.Put("boxxlo", boxxlo); - fh.Put("boxxhi", boxxhi); - fh.Put("boxylo", boxylo); - fh.Put("boxyhi", boxyhi); - fh.Put("boxzlo", boxzlo); - fh.Put("boxzhi", boxzhi); + internal->fh.Put("boxxlo", boxxlo); + internal->fh.Put("boxxhi", boxxhi); + internal->fh.Put("boxylo", boxylo); + internal->fh.Put("boxyhi", boxyhi); + internal->fh.Put("boxzlo", boxzlo); + internal->fh.Put("boxzhi", boxzhi); if (domain->triclinic) { - fh.Put("boxxy", boxxy); - fh.Put("boxxz", boxxz); - fh.Put("boxyz", boxyz); + internal->fh.Put("boxxy", boxxy); + internal->fh.Put("boxxz", boxxz); + internal->fh.Put("boxyz", boxyz); } } - // Everyone needs to write scalar variables that are used as dimensions and offsets of arrays - fh.Put("natoms", ntotal); - fh.Put("ncolumns", size_one); - fh.Put("nme", bnme); - fh.Put("offset", atomOffset); + // Everyone needs to write scalar variables that are used as dimensions and + // offsets of arrays + internal->fh.Put("natoms", ntotal); + internal->fh.Put("ncolumns", size_one); + internal->fh.Put("nme", bnme); + internal->fh.Put("offset", atomOffset); // now write the atoms - fh.Put("atoms", buf); - fh.EndStep();// I/O will happen now... + internal->fh.Put("atoms", buf); + internal->fh.EndStep(); // I/O will happen now... - if (multifile) - { - fh.Close(); + if (multifile) { + internal->fh.Close(); } } @@ -246,43 +314,49 @@ void DumpCustomADIOS::init_style() domain->boundary_string(boundstr); - // remove % from filename since ADIOS always writes a global file with data/metadata + // remove % from filename since ADIOS always writes a global file with + // data/metadata int len = strlen(filename); - char *ptr = strchr(filename,'%'); + char *ptr = strchr(filename, '%'); if (ptr) { *ptr = '\0'; - char *s = new char[len-1]; - sprintf(s,"%s%s",filename,ptr+1); - strncpy(filename,s,len); + char *s = new char[len - 1]; + sprintf(s, "%s%s", filename, ptr + 1); + strncpy(filename, s, len); } - /* The next four loops are copied from dump_custom_mpiio, but nothing is done with them. + /* The next four loops are copied from dump_custom_mpiio, but nothing is + * done with them. * It is unclear why we need them here. - * For metadata, variable[] will be written out as an ADIOS attribute if nvariable>0 + * For metadata, variable[] will be written out as an ADIOS attribute if + * nvariable>0 */ // find current ptr for each compute,fix,variable // check that fix frequency is acceptable int icompute; for (int i = 0; i < ncompute; i++) { icompute = modify->find_compute(id_compute[i]); - if (icompute < 0) error->all(FLERR,"Could not find dump custom compute ID"); + if (icompute < 0) + error->all(FLERR, "Could not find dump custom compute ID"); compute[i] = modify->compute[icompute]; } int ifix; for (int i = 0; i < nfix; i++) { ifix = modify->find_fix(id_fix[i]); - if (ifix < 0) error->all(FLERR,"Could not find dump custom fix ID"); + if (ifix < 0) + error->all(FLERR, "Could not find dump custom fix ID"); fix[i] = modify->fix[ifix]; if (nevery % modify->fix[ifix]->peratom_freq) - error->all(FLERR,"Dump custom and fix not computed at compatible times"); + error->all(FLERR, + "Dump custom and fix not computed at compatible times"); } int ivariable; for (int i = 0; i < nvariable; i++) { ivariable = input->variable->find(id_variable[i]); if (ivariable < 0) - error->all(FLERR,"Could not find dump custom variable name"); + error->all(FLERR, "Could not find dump custom variable name"); variable[i] = ivariable; } @@ -290,65 +364,71 @@ void DumpCustomADIOS::init_style() if (iregion >= 0) { iregion = domain->find_region(idregion); if (iregion == -1) - error->all(FLERR,"Region ID for dump custom does not exist"); + error->all(FLERR, "Region ID for dump custom does not exist"); } - /* Define the group of variables for the atom style here since it's a fixed set */ - io = ad->DeclareIO(ioName); - if (!io.InConfigFile()) - { + /* Define the group of variables for the atom style here since it's a fixed + * set */ + internal->io = internal->ad->DeclareIO(internal->ioName); + if (!internal->io.InConfigFile()) { // if not defined by user, we can change the default settings // BPFile is the default writer - io.SetEngine("BPFile"); + internal->io.SetEngine("BPFile"); int num_aggregators = multiproc; if (num_aggregators == 0) num_aggregators = 1; char nstreams[128]; - sprintf (nstreams, "%d", num_aggregators); - io.SetParameters({{"substreams", nstreams}}); - if (me==0 && screen) fprintf(screen, "ADIOS method for %s is n-to-m (aggregation with %s writers)\n", filename, nstreams); + sprintf(nstreams, "%d", num_aggregators); + internal->io.SetParameters({{"substreams", nstreams}}); + if (me == 0 && screen) + fprintf( + screen, + "ADIOS method for %s is n-to-m (aggregation with %s writers)\n", + filename, nstreams); } + internal->io.DefineVariable("ntimestep"); + internal->io.DefineVariable("natoms"); - io.DefineVariable("ntimestep"); - io.DefineVariable("natoms"); + internal->io.DefineVariable("nprocs"); + internal->io.DefineVariable("ncolumns"); - io.DefineVariable("nprocs"); - io.DefineVariable("ncolumns"); + internal->io.DefineVariable("boxxlo"); + internal->io.DefineVariable("boxxhi"); + internal->io.DefineVariable("boxylo"); + internal->io.DefineVariable("boxyhi"); + internal->io.DefineVariable("boxzlo"); + internal->io.DefineVariable("boxzhi"); - io.DefineVariable("boxxlo"); - io.DefineVariable("boxxhi"); - io.DefineVariable("boxylo"); - io.DefineVariable("boxyhi"); - io.DefineVariable("boxzlo"); - io.DefineVariable("boxzhi"); + internal->io.DefineVariable("boxxy"); + internal->io.DefineVariable("boxxz"); + internal->io.DefineVariable("boxyz"); - io.DefineVariable("boxxy"); - io.DefineVariable("boxxz"); - io.DefineVariable("boxyz"); + internal->io.DefineAttribute("triclinic", domain->triclinic); - io.DefineAttribute("triclinic", domain->triclinic); - - int *boundaryptr = reinterpret_cast(domain->boundary); - io.DefineAttribute("boundary", boundaryptr, 6); + int *boundaryptr = reinterpret_cast(domain->boundary); + internal->io.DefineAttribute("boundary", boundaryptr, 6); size_t nColumns = static_cast(size_one); - io.DefineAttribute("columns", columnNames.data(), nColumns); - io.DefineAttribute("columnstr", columns); - io.DefineAttribute("boundarystr", boundstr); - io.DefineAttribute("LAMMPS/dump_style", "atom"); - io.DefineAttribute("LAMMPS/version", universe->version); - io.DefineAttribute("LAMMPS/num_ver", universe->num_ver); + internal->io.DefineAttribute( + "columns", internal->columnNames.data(), nColumns); + internal->io.DefineAttribute("columnstr", columns); + internal->io.DefineAttribute("boundarystr", boundstr); + internal->io.DefineAttribute("LAMMPS/dump_style", "atom"); + internal->io.DefineAttribute("LAMMPS/version", + universe->version); + internal->io.DefineAttribute("LAMMPS/num_ver", + universe->num_ver); - io.DefineVariable("nme", {adios2::LocalValueDim}); // local dimension variable - io.DefineVariable("offset", {adios2::LocalValueDim}); // local dimension variable + internal->io.DefineVariable( + "nme", {adios2::LocalValueDim}); // local dimension variable + internal->io.DefineVariable( + "offset", {adios2::LocalValueDim}); // local dimension variable // atom table size is not known at the moment // it will be correctly defined at the moment of write size_t UnknownSizeYet = 1; - varAtoms = io.DefineVariable("atoms", - {UnknownSizeYet,nColumns}, - {UnknownSizeYet, 0}, - {UnknownSizeYet,nColumns}); - + internal->varAtoms = internal->io.DefineVariable( + "atoms", {UnknownSizeYet, nColumns}, {UnknownSizeYet, 0}, + {UnknownSizeYet, nColumns}); } diff --git a/src/USER-ADIOS/dump_custom_adios.h b/src/USER-ADIOS/dump_custom_adios.h index 2461e20b2e..d5d41eb8c7 100644 --- a/src/USER-ADIOS/dump_custom_adios.h +++ b/src/USER-ADIOS/dump_custom_adios.h @@ -12,83 +12,76 @@ ------------------------------------------------------------------------- */ #ifdef DUMP_CLASS - -DumpStyle(custom/adios,DumpCustomADIOS) - +// clang-format off +DumpStyle(custom/adios, DumpCustomADIOS) +// clang-format on #else #ifndef LMP_DUMP_CUSTOM_ADIOS_H #define LMP_DUMP_CUSTOM_ADIOS_H #include "dump_custom.h" -#include -#include -#include "adios2.h" -namespace LAMMPS_NS { +namespace LAMMPS_NS +{ -class DumpCustomADIOS : public DumpCustom { - public: - DumpCustomADIOS(class LAMMPS *, int, char **); - virtual ~DumpCustomADIOS(); +class DumpCustomADIOSInternal; - protected: +class DumpCustomADIOS : public DumpCustom +{ +public: + DumpCustomADIOS(class LAMMPS *, int, char **); + virtual ~DumpCustomADIOS(); - const std::string ioName="custom"; // name of adios group, referrable in adios2_config.xml - adios2::ADIOS *ad = nullptr; // adios object - adios2::IO io; // adios group of variables and attributes in this dump - adios2::Engine fh; // adios file/stream handle object - adios2::Variable varAtoms; // one ADIOS output variable we need to change - uint64_t groupsize; // pre-calculate # of bytes written per processor in a step before writing anything - std::vectorcolumnNames; // list of column names for the atom table (individual list of 'columns' string) - - virtual void openfile(); - virtual void write(); - virtual void init_style(); +protected: + virtual void openfile(); + virtual void write(); + virtual void init_style(); +private: + DumpCustomADIOSInternal *internal; }; - } #endif #endif -/* ERROR/WARNING messages: + /* ERROR/WARNING messages: -E: Cannot open dump file %s + E: Cannot open dump file %s -The output file for the dump command cannot be opened. Check that the -path and name are correct. + The output file for the dump command cannot be opened. Check that the + path and name are correct. -E: Too much per-proc info for dump + E: Too much per-proc info for dump -Number of local atoms times number of columns must fit in a 32-bit -integer for dump. + Number of local atoms times number of columns must fit in a 32-bit + integer for dump. -E: Dump_modify format string is too short + E: Dump_modify format string is too short -There are more fields to be dumped in a line of output than your -format string specifies. + There are more fields to be dumped in a line of output than your + format string specifies. -E: Could not find dump custom compute ID + E: Could not find dump custom compute ID -Self-explanatory. + Self-explanatory. -E: Could not find dump custom fix ID + E: Could not find dump custom fix ID -Self-explanatory. + Self-explanatory. -E: Dump custom and fix not computed at compatible times + E: Dump custom and fix not computed at compatible times -The fix must produce per-atom quantities on timesteps that dump custom -needs them. + The fix must produce per-atom quantities on timesteps that dump custom + needs them. -E: Could not find dump custom variable name + E: Could not find dump custom variable name -Self-explanatory. + Self-explanatory. -E: Region ID for dump custom does not exist + E: Region ID for dump custom does not exist -Self-explanatory. + Self-explanatory. -*/ + */ From 75fe967876cfc49538624693383cb5b8c575a469 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Sun, 10 Feb 2019 19:19:49 -0500 Subject: [PATCH 0147/1242] remove fluff about adios in CMakeLists.txt. --- cmake/CMakeLists.txt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index e5d362fe52..69f56e0216 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -2,15 +2,7 @@ # CMake build system # This file is part of LAMMPS # Created by Christoph Junghans and Richard Berger -if(PKG_USER-ADIOS) - message(STATUS "Force newer standards because of using ADIOS") - cmake_minimum_required(VERSION 3.6) - # Force C++11 and C99 - set(CMAKE_CXX_STANDARD 11) - set(CMAKE_CXX_STANDARD_REQUIRED True) -else() - cmake_minimum_required(VERSION 2.8.12) -endif() +cmake_minimum_required(VERSION 2.8.12) project(lammps CXX) set(SOVERSION 0) From 1179beb54330b061d84ecaea61e2586ae09b72e7 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Wed, 20 Feb 2019 14:42:28 -0500 Subject: [PATCH 0148/1242] Makefile build support for USER-ADIOS and build documentation --- doc/src/Build_extras.txt | 23 ++++++++++ doc/src/Build_package.txt | 1 + doc/src/Packages_details.txt | 26 +++++++++++ doc/src/Packages_user.txt | 1 + src/Makefile | 2 +- src/USER-ADIOS/Install.sh | 86 +++++++++++++++++++----------------- 6 files changed, 97 insertions(+), 42 deletions(-) diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index 09841bd9d4..4a12930304 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -37,6 +37,7 @@ This is the list of packages that may require additional steps. "POEMS"_#poems, "PYTHON"_#python, "VORONOI"_#voronoi, +"USER-ADIOS"_#user-adios, "USER-ATC"_#user-atc, "USER-AWPMD"_#user-awpmd, "USER-COLVARS"_#user-colvars, @@ -576,6 +577,28 @@ the lib/voronoi/Makefile.lammps file. :line +USER-ADIOS package :h4,link(user-adios) + +The USER-ADIOS package requires the "ADIOS I/O library"_https://github.com/ornladios/ADIOS2, version 2.3.1 or newer. +Make sure that you have ADIOS built with/without MPI if you build LAMMPS with/without MPI, respectively. + +[CMake build]: + +-D ADIOS2_DIR=path # path is where ADIOS 2.x is installed +-D PKG_USER-ADIOS=yes :pre + +[Traditional make]: + +Turn on the USER-ADIOS package before building LAMMPS. If the ADIOS 2.x software is installed in PATH, there is nothing else to do: + +make yes-user-adios :pre + +otherwise, set ADIOS2_DIR environment variable when turning on the package: + +ADIOS2_DIR=path make yes-user-adios # path is where ADIOS 2.x is installed :pre + +:line + USER-ATC package :h4,link(user-atc) The USER-ATC package requires the MANYBODY package also be installed. diff --git a/doc/src/Build_package.txt b/doc/src/Build_package.txt index 01c82d724e..c5eca96edb 100644 --- a/doc/src/Build_package.txt +++ b/doc/src/Build_package.txt @@ -48,6 +48,7 @@ packages: "POEMS"_Build_extras.html#poems, "PYTHON"_Build_extras.html#python, "VORONOI"_Build_extras.html#voronoi, +"USER-ADIOS"_Build_extras.html#user-adios, "USER-ATC"_Build_extras.html#user-atc, "USER-AWPMD"_Build_extras.html#user-awpmd, "USER-COLVARS"_Build_extras.html#user-colvars, diff --git a/doc/src/Packages_details.txt b/doc/src/Packages_details.txt index 7d3d6d13e2..4e3fd1968f 100644 --- a/doc/src/Packages_details.txt +++ b/doc/src/Packages_details.txt @@ -63,6 +63,7 @@ as contained in the file name. "SRD"_#PKG-SRD, "VORONOI"_#PKG-VORONOI :tb(c=6,ea=c) +"USER-ADIOS"_#PKG-USER-ADIOS, "USER-ATC"_#PKG-USER-ATC, "USER-AWPMD"_#PKG-USER-AWPMD, "USER-BOCS"_#PKG-USER-BOCS, @@ -975,6 +976,31 @@ examples/voronoi :ul :line +USER-ADIOS package :link(PKG-USER-ADIOS),h4 + +[Contents:] + +ADIOS is a high-performance I/O library. This package implements the +dump "atom/adios" and dump "custom/adios" commands to write data using +the ADIOS library. + +[Authors:] Norbert Podhorszki (ORNL) from the ADIOS developer team. + +[Install:] + +This package has "specific installation +instructions"_Build_extras.html#user-adios on the "Build +extras"_Build_extras.html doc page. + +[Supporting info:] + +src/USER-ADIOS: filenames -> commands +src/USER-ADIOS/README +examples/USER/adios +https://github.com/ornladios/ADIOS2 :ul + +:line + USER-ATC package :link(PKG-USER-ATC),h4 [Contents:] diff --git a/doc/src/Packages_user.txt b/doc/src/Packages_user.txt index 4a702e971f..4210f617ef 100644 --- a/doc/src/Packages_user.txt +++ b/doc/src/Packages_user.txt @@ -38,6 +38,7 @@ int = internal library: provided with LAMMPS, but you may need to build it ext = external library: you will need to download and install it on your machine :ul Package, Description, Doc page, Example, Library +"USER-ADIOS"_Packages_details.html#PKG-USER-ADIOS, dump output via ADIOS, "dump adios"_dump_adios.html, USER/adios, ext "USER-ATC"_Packages_details.html#PKG-USER-ATC, Atom-to-Continuum coupling, "fix atc"_fix_atc.html, USER/atc, int "USER-AWPMD"_Packages_details.html#PKG-USER-AWPMD, wave packet MD, "pair_style awpmd/cut"_pair_awpmd.html, USER/awpmd, int "USER-BOCS"_Packages_details.html#PKG-USER-BOCS, BOCS bottom up coarse graining, "fix bocs"_fix_bocs.html, USER/bocs, no diff --git a/src/Makefile b/src/Makefile index 1f0a294e8a..3e224cd6ab 100644 --- a/src/Makefile +++ b/src/Makefile @@ -58,7 +58,7 @@ PACKAGE = asphere body class2 colloid compress coreshell dipole gpu \ molecule mpiio mscg opt peri poems \ python qeq replica rigid shock snap spin srd voronoi -PACKUSER = user-atc user-awpmd user-bocs user-cgdna user-cgsdk user-colvars \ +PACKUSER = 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 \ diff --git a/src/USER-ADIOS/Install.sh b/src/USER-ADIOS/Install.sh index cae755406b..8ea971c233 100644 --- a/src/USER-ADIOS/Install.sh +++ b/src/USER-ADIOS/Install.sh @@ -30,60 +30,64 @@ done if (test $1 = 1) then -# if (test -z "$ADIOS_DIR") then -# if command -v adios_config; then -# ADIOS_DIR=`adios_config -d` -# else -# echo "ERROR: ADIOS_DIR environment variable needs to point to ADIOS" \ -# " installation directory or adios_config should be in PATH" -# fi -# fi -# ADIOS_INC=-I${ADIOS_DIR}/include -# ADIOS_LIB=`${ADIOS_DIR}/bin/adios_config -l` -# -# echo "adios_SYSINC=${ADIOS_INC} -#adios_SYSLIB=${ADIOS_LIB} -#adios_SYSPATH=${ADIOS_DIR} -#" > ../Makefile.adios - - - if (test -e ../Makefile.package) then - sed -i -e 's/[^ \t]*adios[^ \t]* //g' ../Makefile.package - sed -i -e 's/-DLMP_ADIOS //g' ../Makefile.package - sed -i -e '/^adios_SYS.*$/d' ../Makefile.package -# sed -i -e '4 i \ -#adios_SYSINC='"${ADIOS_INC}"' -#' ../Makefile.package -# sed -i -e '5 i \ -#adios_SYSLIB='"${ADIOS_LIB}"' -#' ../Makefile.package -# sed -i -e '6 i \ -#adios_SYSPATH='"${ADIOS_DIR}"' -#' ../Makefile.package - sed -i -e 's|^PKG_INC =[ \t]*|&-DLMP_ADIOS |' ../Makefile.package - sed -i -e 's|^PKG_SYSINC =[ \t]*|&$(adios_SYSINC) |' ../Makefile.package - sed -i -e 's|^PKG_SYSLIB =[ \t]*|&$(adios_SYSLIB) |' ../Makefile.package - sed -i -e 's|^PKG_SYSPATH =[ \t]*|&$(adios_SYSPATH) |' ../Makefile.package + CONFIGSCRIPT=none + if ( test `which adios2-config` ) then + CONFIGSCRIPT=adios2-config + elif ( ! test -z "$ADIOS2_DIR" ) then + if ( test `which $ADIOS2_DIR/bin/adios2-config` ) then + CONFIGSCRIPT=$ADIOS2_DIR/bin/adios2-config + else + echo "ERROR: ADIOS2_DIR environment variable is set but" \ + "\$ADIOS2_DIR/bin/adios2-config does not exist" + fi + elif ( ! test -z "$ADIOS_DIR" ) then + if ( test `which $ADIOS_DIR/bin/adios2-config` ) then + CONFIGSCRIPT=$ADIOS_DIR/bin/adios2-config + else + echo "ERROR: ADIOS_DIR environment variable is set but" \ + "\$ADIOS_DIR/bin/adios2-config does not exist" + fi + else + echo "ERROR: ADIOS2_DIR environment variable must point to ADIOS 2.x" \ + "installation directory or adios2-config should be in PATH" fi - if (test -e ../Makefile.package.settings) then - sed -i -e '/^include.*adios.*$/d' ../Makefile.package.settings - # multiline form needed for BSD sed on Macs - sed -i -e '4 i \ -include ..\/..\/lib\/adios\/Makefile.lammps + if [ "$CONFIGSCRIPT" != "none" ]; then + ADIOS2_INC=`$CONFIGSCRIPT --cxx-flags` + ADIOS2_LIB=`$CONFIGSCRIPT --cxx-libs` + + echo "adios_SYSINC=${ADIOS2_INC} +adios_SYSLIB=${ADIOS2_LIB} +" > Makefile.lammps + + + if (test -e ../Makefile.package) then + sed -i -e 's/[^ \t]*adios[^ \t]* //g' ../Makefile.package + sed -i -e '/^adios_SYS.*$/d' ../Makefile.package + sed -i -e 's|^PKG_SYSINC =[ \t]*|&$(adios_SYSINC) |' ../Makefile.package + sed -i -e 's|^PKG_SYSLIB =[ \t]*|&$(adios_SYSLIB) |' ../Makefile.package + fi + + if (test -e ../Makefile.package.settings) then + sed -i -e '/^include.*ADIOS.*$/d' ../Makefile.package.settings + # multiline form needed for BSD sed on Macs + sed -i -e '4 i \ +include ../USER-ADIOS/Makefile.lammps ' ../Makefile.package.settings + fi fi elif (test $1 = 0) then if (test -e ../Makefile.package) then sed -i -e 's/[^ \t]*adios[^ \t]* //g' ../Makefile.package - sed -i -e 's/-DLMP_ADIOS //g' ../Makefile.package sed -i -e '/^adios_SYS.*$/d' ../Makefile.package fi if (test -e ../Makefile.package.settings) then - sed -i -e '/^include.*adios.*$/d' ../Makefile.package.settings + sed -i -e '/^include.*ADIOS.*$/d' ../Makefile.package.settings fi + rm -f Makefile.lammps + fi From 2de01cef45519adbc57edad6dd038aaa42fecef0 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Wed, 20 Feb 2019 16:21:07 -0500 Subject: [PATCH 0149/1242] Dump atom/adios and dump custom/adios command notifications --- doc/src/Commands_all.txt | 1 + doc/src/commands_list.txt | 1 + doc/src/dump.txt | 5 +- doc/src/dump_adios.txt | 73 ++++++++++++++++++++++++++++ examples/USER/adios/in.adios_balance | 1 + 5 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 doc/src/dump_adios.txt diff --git a/doc/src/Commands_all.txt b/doc/src/Commands_all.txt index f137ccffd9..e6f364f2c9 100644 --- a/doc/src/Commands_all.txt +++ b/doc/src/Commands_all.txt @@ -48,6 +48,7 @@ An alphabetic list of all general LAMMPS commands. "dimension"_dimension.html, "displace_atoms"_displace_atoms.html, "dump"_dump.html, +"dump adios"_dump_adios.html, "dump image"_dump_image.html, "dump_modify"_dump_modify.html, "dump movie"_dump_image.html, diff --git a/doc/src/commands_list.txt b/doc/src/commands_list.txt index 78fa9fbf87..9b3185bda8 100644 --- a/doc/src/commands_list.txt +++ b/doc/src/commands_list.txt @@ -32,6 +32,7 @@ Commands :h1 dimension displace_atoms dump + dump_adios dump_cfg_uef dump_h5md dump_image diff --git a/doc/src/dump.txt b/doc/src/dump.txt index 9999f5bbff..a776ff70fc 100644 --- a/doc/src/dump.txt +++ b/doc/src/dump.txt @@ -13,6 +13,7 @@ dump command :h3 "dump netcdf"_dump_netcdf.html command :h3 "dump image"_dump_image.html command :h3 "dump movie"_dump_image.html command :h3 +"dump adios"_dump_adios.html command :h3 [Syntax:] @@ -27,10 +28,12 @@ args = list of arguments for a particular style :l {atom} args = none {atom/gz} args = none {atom/mpiio} args = none + {atom/adios} args = none, discussed on "dump adios"_dump_adios.html doc page {cfg} args = same as {custom} args, see below {cfg/gz} args = same as {custom} args, see below {cfg/mpiio} args = same as {custom} args, see below {custom}, {custom/gz}, {custom/mpiio} args = see below + {custom/adios} args = same as {custom} args, discussed on "dump adios"_dump_adios.html doc page {dcd} args = none {h5md} args = discussed on "dump h5md"_dump_h5md.html doc page {image} args = discussed on "dump image"_dump_image.html doc page @@ -653,7 +656,7 @@ package"_Build_package.html doc page for more info. [Related commands:] -"dump h5md"_dump_h5md.html, "dump image"_dump_image.html, +"dump adios"_dump_adios.html "dump h5md"_dump_h5md.html, "dump image"_dump_image.html, "dump molfile"_dump_molfile.html, "dump_modify"_dump_modify.html, "undump"_undump.html diff --git a/doc/src/dump_adios.txt b/doc/src/dump_adios.txt new file mode 100644 index 0000000000..d6424d664a --- /dev/null +++ b/doc/src/dump_adios.txt @@ -0,0 +1,73 @@ +"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 + +dump atoms/adios command :h3 +dump custom/adios command :h3 + +[Syntax:] + +dump ID group-ID atoms/adios N file.bp :pre +dump ID group-ID custom/adios N file.bp args :pre + +ID = user-assigned name for the dump :ulb,l +group-ID = ID of the group of atoms to be imaged :l +adios = style of dump command (other styles {atom} or {cfg} or {dcd} or {xtc} or {xyz} or {local} or {custom} are discussed on the "dump"_dump.html doc page) :l +N = dump every this many timesteps :l +file.bp = name of file/stream to write to :l +args = same options as in "{dump custom}"_dump.html command :l +:ule + + +[Examples:] + +dump adios1 all atom/adios 100 atoms.bp +dump 4a all custom/adios 100 dump_adios.bp id v_p x y z +dump 2 subgroup custom/adios 100 dump_adios.bp mass type xs ys zs vx vy vz :pre + +[Description:] + +Dump a snapshot of atom coordinates every N timesteps in the +"ADIOS"_adios based "BP" file format, or using different I/O solutions in ADIOS, +to a stream that can be read on-line by another program. +ADIOS-BP files are binary, portable and self-describing. + +:link(adios,https://github.com/ornladios/ADIOS2) + + +[Use from write_dump:] + +It is possible to use these dump styles with the +"write_dump"_write_dump.html command. In this case, the sub-intervals +must not be set at all. The write_dump command can be used to +create a new file at each individual dump. + +dump 4 all atom/adios 100 dump.bp +write_dump all atom/adios singledump.bp :pre + +:line + +[Restrictions:] + +The number of atoms per snapshot CAN change with the adios style. +When using the ADIOS tool 'bpls' to list the content of a .bp file, +bpls will print "__" for the size of the output table indicating that +its size is changing every step. + +The {atom/adios} and {custom/adios} dump styles are part of the USER-adios package. +They are only enabled if LAMMPS was built with that package. See the +"Build package"_Build_package.html doc page for more info. + + +:line + +[Related commands:] + +"dump"_dump.html, "dump_modify"_dump_modify.html, "undump"_undump.html + +:line + diff --git a/examples/USER/adios/in.adios_balance b/examples/USER/adios/in.adios_balance index b44870afbb..d89ae52b41 100644 --- a/examples/USER/adios/in.adios_balance +++ b/examples/USER/adios/in.adios_balance @@ -54,3 +54,4 @@ thermo_style custom step temp epair press f_10[3] f_10 thermo 100 run 200 +write_dump all atom/adios balance_atom_final.bp From a5f20305d49667d0815eed056064a55142694e96 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Wed, 20 Feb 2019 16:28:51 -0500 Subject: [PATCH 0150/1242] Add user-adios to PACKLIB and PACKEXT --- src/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Makefile b/src/Makefile index 3e224cd6ab..f954d84e5d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -68,7 +68,7 @@ PACKUSER = user-adios user-atc user-awpmd user-bocs user-cgdna user-cgsdk user-c PACKLIB = compress gpu kim kokkos latte message mpiio mscg poems \ python voronoi \ - user-atc user-awpmd user-colvars user-h5md user-lb user-molfile \ + user-adios user-atc user-awpmd user-colvars user-h5md user-lb user-molfile \ user-netcdf user-plumed user-qmmm user-quip user-scafacos \ user-smd user-vtk @@ -77,7 +77,7 @@ PACKSYS = compress mpiio python user-lb PACKINT = gpu kokkos message poems user-atc user-awpmd user-colvars PACKEXT = kim latte mscg voronoi \ - user-h5md user-molfile user-netcdf user-plumed user-qmmm user-quip \ + user-adios user-h5md user-molfile user-netcdf user-plumed user-qmmm user-quip \ user-smd user-vtk PACKALL = $(PACKAGE) $(PACKUSER) From 3ad268739b003e6168eeb89920707a0b5c0393d6 Mon Sep 17 00:00:00 2001 From: Norbert Podhorszki Date: Wed, 20 Feb 2019 17:02:48 -0500 Subject: [PATCH 0151/1242] Add dump adios to PDF build. Update example config with better documentation --- doc/src/dump_adios.txt | 2 +- doc/src/lammps.book | 1 + examples/USER/adios/adios2_config.xml | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/src/dump_adios.txt b/doc/src/dump_adios.txt index d6424d664a..3d08d6c13a 100644 --- a/doc/src/dump_adios.txt +++ b/doc/src/dump_adios.txt @@ -55,7 +55,7 @@ write_dump all atom/adios singledump.bp :pre The number of atoms per snapshot CAN change with the adios style. When using the ADIOS tool 'bpls' to list the content of a .bp file, -bpls will print "__" for the size of the output table indicating that +bpls will print {__} for the size of the output table indicating that its size is changing every step. The {atom/adios} and {custom/adios} dump styles are part of the USER-adios package. diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 02a55e3810..d15d287742 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -150,6 +150,7 @@ dielectric.html dimension.html displace_atoms.html dump.html +dump_adios.html dump_h5md.html dump_image.html dump_modify.html diff --git a/examples/USER/adios/adios2_config.xml b/examples/USER/adios/adios2_config.xml index 7462731d43..4b9cd9b9b5 100644 --- a/examples/USER/adios/adios2_config.xml +++ b/examples/USER/adios/adios2_config.xml @@ -6,8 +6,15 @@ + + + The 'substreams' parameter in BPFile controls how many + files on disk are created. This number should be proportional + to the number of servers in the parallel file system, + NOT to the number of processes. + substreams=1 is generally a very inefficient setting for large parallel runs. --> LAMMPS Users Manual - + @@ -21,7 +21,7 @@ :line LAMMPS Documentation :c,h1 -8 Feb 2019 version :c,h2 +28 Feb 2019 version :c,h2 "What is a LAMMPS version?"_Manual_version.html diff --git a/src/version.h b/src/version.h index f15fa13e02..0539f757c9 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define LAMMPS_VERSION "8 Feb 2019" +#define LAMMPS_VERSION "28 Feb 2019" From 54e5c763338e958c8da3920a11cc99b606c406e6 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Wed, 27 Feb 2019 15:50:08 -0600 Subject: [PATCH 0169/1242] Bump KIM API version to 2.0.1 --- cmake/CMakeLists.txt | 4 ++-- lib/kim/Install.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 30c8171f28..96cf6aa8b6 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -663,8 +663,8 @@ if(PKG_KIM) enable_language(Fortran) include(ExternalProject) ExternalProject_Add(kim_build - URL https://s3.openkim.org/kim-api/kim-api-v2-2.0.0.txz - URL_MD5 1ff8f563ad5991f7a2a25b35a13d7308 + URL https://s3.openkim.org/kim-api/kim-api-v2-2.0.1.txz + URL_MD5 289c57f0c3bc2a549662283cac1c4ef1 BINARY_DIR build CMAKE_ARGS -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER} diff --git a/lib/kim/Install.py b/lib/kim/Install.py index e2465eec85..7a3d9c148d 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.0" +version = "kim-api-v2-2.0.1" # help message From 6bd56c2a85aad06f1451fbdd93c51a3803054033 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Feb 2019 17:08:13 -0500 Subject: [PATCH 0170/1242] update author attribution --- src/USER-ADIOS/dump_custom_adios.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/USER-ADIOS/dump_custom_adios.cpp b/src/USER-ADIOS/dump_custom_adios.cpp index 5b76688098..cd14195d45 100644 --- a/src/USER-ADIOS/dump_custom_adios.cpp +++ b/src/USER-ADIOS/dump_custom_adios.cpp @@ -12,7 +12,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Contributing author: Paul Coffman (IBM) + Contributing author: Norbert Podhorszki (ORNL) ------------------------------------------------------------------------- */ #include "dump_custom_adios.h" From b60f0f754cc82c1353f272ad358826f80284267f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Feb 2019 17:18:08 -0500 Subject: [PATCH 0171/1242] small tweaks to USER-ADIOS docs --- doc/src/Build_extras.txt | 8 ++++++-- doc/src/dump_adios.txt | 6 +++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/doc/src/Build_extras.txt b/doc/src/Build_extras.txt index 4a12930304..0fa87f4b60 100644 --- a/doc/src/Build_extras.txt +++ b/doc/src/Build_extras.txt @@ -579,8 +579,12 @@ the lib/voronoi/Makefile.lammps file. USER-ADIOS package :h4,link(user-adios) -The USER-ADIOS package requires the "ADIOS I/O library"_https://github.com/ornladios/ADIOS2, version 2.3.1 or newer. -Make sure that you have ADIOS built with/without MPI if you build LAMMPS with/without MPI, respectively. +The USER-ADIOS package requires the "ADIOS I/O library"_https://github.com/ornladios/ADIOS2, +version 2.3.1 or newer. Make sure that you have ADIOS built either with or +without MPI to match if you build LAMMPS with or without MPI. +ADIOS compilation settings for LAMMPS are automatically detected, if the PATH +and LD_LIBRARY_PATH environment variables have been updated for the local ADIOS +installation and the instructions below are followed for the respective build systems. [CMake build]: diff --git a/doc/src/dump_adios.txt b/doc/src/dump_adios.txt index 7425264ea4..e3c919db5a 100644 --- a/doc/src/dump_adios.txt +++ b/doc/src/dump_adios.txt @@ -58,9 +58,9 @@ When using the ADIOS tool 'bpls' to list the content of a .bp file, bpls will print {__} for the size of the output table indicating that its size is changing every step. -The {atom/adios} and {custom/adios} dump styles are part of the USER-adios package. -They are only enabled if LAMMPS was built with that package. See the -"Build package"_Build_package.html doc page for more info. +The {atom/adios} and {custom/adios} dump styles are part of the USER-ADIOS +package. They are only enabled if LAMMPS was built with that package. +See the "Build package"_Build_package.html doc page for more info. :line From 286112ffbc5e3b48620957abb1508078a8326e6c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 11:00:55 -0500 Subject: [PATCH 0172/1242] count each force computation as one simulation step. this avoids accessing uninitialized data, too. --- .../phonon/dynamical_matrix_command/Manual.md | 48 ------------------- src/USER-PHONON/dynamical_matrix.cpp | 4 +- src/USER-PHONON/third_order.cpp | 4 +- 3 files changed, 6 insertions(+), 50 deletions(-) delete mode 100755 examples/USER/phonon/dynamical_matrix_command/Manual.md diff --git a/examples/USER/phonon/dynamical_matrix_command/Manual.md b/examples/USER/phonon/dynamical_matrix_command/Manual.md deleted file mode 100755 index c361f80325..0000000000 --- a/examples/USER/phonon/dynamical_matrix_command/Manual.md +++ /dev/null @@ -1,48 +0,0 @@ -# dynamical_matrix command - -## Syntax - -``` -dynamical_matrix group-ID style args keyword value ... -``` - -* group-ID = ID of group of atoms to displace -* style = *regular* or *eskm* -``` -*regular* args = gamma - gamma = finite difference displacement length -*eskm* args = gamma - gamma = finite difference displacement length -``` -* zero or more keyword/value pairs may be appended -* keyword = *file* or *binary* -``` -*file* value = output_file - output_file = name of file to dump the dynamical matrix into -*binary* values = *yes* or *no* or *gzip* -``` - -## Examples - -``` -dynamical_matrix 1 regular 0.000001 -dynamical_matrix 1 eskm 0.000001 -dynamical_matrix 3 regular 0.00004 file dynmat.dat -dynamical_matrix 5 eskm 0.00000001 file dynamical.dat binary yes -``` - -## Description - -Calculate the dynamical matrix of the selected group. - -## Restrictions - -None - -## Related commands - -None - -## Default - -The option defaults are file = "dynmat.dyn", binary = no diff --git a/src/USER-PHONON/dynamical_matrix.cpp b/src/USER-PHONON/dynamical_matrix.cpp index da98a23a7d..cef59b3a63 100644 --- a/src/USER-PHONON/dynamical_matrix.cpp +++ b/src/USER-PHONON/dynamical_matrix.cpp @@ -258,6 +258,7 @@ void DynamicalMatrix::calculateMatrix() if (comm->me == 0 && screen) fprintf(screen,"Calculating Dynamical Matrix...\n"); + update->nsteps = 0; for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); for (bigint alpha=0; alpha<3; alpha++){ @@ -390,6 +391,7 @@ void DynamicalMatrix::update_force() comm->reverse_comm(); timer->stamp(Timer::COMM); } + ++ update->nsteps; } /* ---------------------------------------------------------------------- @@ -545,4 +547,4 @@ void DynamicalMatrix::create_groupmap() delete[] displs; delete[] sub_groupmap; delete[] temp_groupmap; -} \ No newline at end of file +} diff --git a/src/USER-PHONON/third_order.cpp b/src/USER-PHONON/third_order.cpp index 41382e64cb..b4d2032a04 100644 --- a/src/USER-PHONON/third_order.cpp +++ b/src/USER-PHONON/third_order.cpp @@ -247,6 +247,7 @@ void ThirdOrder::calculateMatrix() if (comm->me == 0 && screen) fprintf(screen,"Calculating Anharmonic Dynamical Matrix...\n"); + update->nsteps = 0; for (bigint i=1; i<=natoms; i++){ local_idx = atom->map(i); for (bigint alpha=0; alpha<3; alpha++){ @@ -411,6 +412,7 @@ void ThirdOrder::update_force() comm->reverse_comm(); timer->stamp(Timer::COMM); } + ++ update->nsteps; } /* ---------------------------------------------------------------------- @@ -551,4 +553,4 @@ void ThirdOrder::create_groupmap() delete[] displs; delete[] sub_groupmap; delete[] temp_groupmap; -} \ No newline at end of file +} From 5d8e3c6cb4d054f963d9319373ab2b43116b7d82 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 28 Feb 2019 10:14:35 -0700 Subject: [PATCH 0173/1242] Optimize reneighbor for small systems --- src/KOKKOS/comm_kokkos.cpp | 27 +++++++++++++++------------ src/KOKKOS/comm_kokkos.h | 1 + src/KOKKOS/npair_kokkos.h | 4 ++-- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index c288a0e4a1..c782305ef5 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -1046,10 +1046,16 @@ void CommKokkos::borders_device() { } if (1) { - k_pbc = DAT::tdual_int_2d("comm:pbc",nswap,6); - k_pbc_flag = DAT::tdual_int_1d("comm:pbc_flag",nswap); - k_firstrecv = DAT::tdual_int_1d("comm:firstrecv",nswap); - k_sendnum_scan = DAT::tdual_int_1d("comm:sendnum_scan",nswap); + if (nswap > k_pbc.extent(0)) { + k_pbc = DAT::tdual_int_2d("comm:pbc",nswap,6); + k_swap = DAT::tdual_int_2d("comm:swap",3,nswap); + k_pbc_flag .d_view = Kokkos::subview(k_swap.d_view,0,Kokkos::ALL); + k_firstrecv .d_view = Kokkos::subview(k_swap.d_view,1,Kokkos::ALL); + k_sendnum_scan.d_view = Kokkos::subview(k_swap.d_view,2,Kokkos::ALL); + k_pbc_flag .h_view = Kokkos::subview(k_swap.h_view,0,Kokkos::ALL); + k_firstrecv .h_view = Kokkos::subview(k_swap.h_view,1,Kokkos::ALL); + k_sendnum_scan.h_view = Kokkos::subview(k_swap.h_view,2,Kokkos::ALL); + } int scan = 0; for (int iswap = 0; iswap < nswap; iswap++) { scan += sendnum[iswap]; @@ -1064,15 +1070,12 @@ void CommKokkos::borders_device() { k_pbc.h_view(iswap,5) = pbc[iswap][5]; } totalsend = scan; - k_pbc .modify(); - k_pbc_flag .modify(); - k_firstrecv .modify(); - k_sendnum_scan.modify(); - k_pbc .sync(); - k_pbc_flag .sync(); - k_firstrecv .sync(); - k_sendnum_scan.sync(); + k_swap.modify(); + k_pbc.modify(); + + k_swap.sync(); + k_pbc.sync(); } } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/comm_kokkos.h b/src/KOKKOS/comm_kokkos.h index bf2ee8822f..cab8124231 100644 --- a/src/KOKKOS/comm_kokkos.h +++ b/src/KOKKOS/comm_kokkos.h @@ -63,6 +63,7 @@ class CommKokkos : public CommBrick { //double *buf_send; // send buffer for all comm //double *buf_recv; // recv buffer for all comm + DAT::tdual_int_2d k_swap; DAT::tdual_int_2d k_pbc; DAT::tdual_int_1d k_pbc_flag; DAT::tdual_int_1d k_firstrecv; diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index 970e40c9fc..373ddf799e 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -280,7 +280,7 @@ class NeighborKokkosExecute bboxlo[0] = _bboxlo[0]; bboxlo[1] = _bboxlo[1]; bboxlo[2] = _bboxlo[2]; bboxhi[0] = _bboxhi[0]; bboxhi[1] = _bboxhi[1]; bboxhi[2] = _bboxhi[2]; - resize = typename AT::t_int_scalar("NeighborKokkosFunctor::resize"); + resize = typename AT::t_int_scalar(Kokkos::view_alloc("NeighborKokkosFunctor::resize",Kokkos::WithoutInitializing)); #ifndef KOKKOS_USE_CUDA_UVM h_resize = Kokkos::create_mirror_view(resize); #else @@ -288,7 +288,7 @@ class NeighborKokkosExecute #endif h_resize() = 1; new_maxneighs = typename AT:: - t_int_scalar("NeighborKokkosFunctor::new_maxneighs"); + t_int_scalar(Kokkos::view_alloc("NeighborKokkosFunctor::new_maxneighs",Kokkos::WithoutInitializing)); #ifndef KOKKOS_USE_CUDA_UVM h_new_maxneighs = Kokkos::create_mirror_view(new_maxneighs); #else From 16946d8c6d02adc64b7f608610a4de616e23225c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 14:45:07 -0500 Subject: [PATCH 0174/1242] integrate dynamical_matrix command into LAMMPS manual --- doc/src/Commands_all.txt | 1 + doc/src/commands_list.txt | 1 + doc/src/dynamical_matrix.txt | 52 +++++++++++++++++++++ doc/src/lammps.book | 1 + doc/utils/sphinx-config/false_positives.txt | 2 + src/USER-PHONON/README | 22 ++++++--- 6 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 doc/src/dynamical_matrix.txt diff --git a/doc/src/Commands_all.txt b/doc/src/Commands_all.txt index f137ccffd9..ff86cd842a 100644 --- a/doc/src/Commands_all.txt +++ b/doc/src/Commands_all.txt @@ -54,6 +54,7 @@ An alphabetic list of all general LAMMPS commands. "dump netcdf"_dump_netcdf.html, "dump netcdf/mpiio"_dump_netcdf.html, "dump vtk"_dump_vtk.html, +"dynamical_matrix"_dynamical_matrix.html, "echo"_echo.html, "fix"_fix.html, "fix_modify"_fix_modify.html, diff --git a/doc/src/commands_list.txt b/doc/src/commands_list.txt index 78fa9fbf87..81f088d3d3 100644 --- a/doc/src/commands_list.txt +++ b/doc/src/commands_list.txt @@ -39,6 +39,7 @@ Commands :h1 dump_molfile dump_netcdf dump_vtk + dynamical_matrix echo fix fix_modify diff --git a/doc/src/dynamical_matrix.txt b/doc/src/dynamical_matrix.txt new file mode 100644 index 0000000000..a7dc4e442e --- /dev/null +++ b/doc/src/dynamical_matrix.txt @@ -0,0 +1,52 @@ +"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 + +dynamical_matrix command :h3 + +[Syntax:] + +dynamical_matrix group-ID style gamma args keyword value ... :pre + +group-ID = ID of group of atoms to displace :ulb,l +style = {regular} or {eskm} :l +gamma = finite different displacement length (distance units) :l +one or more keyword/arg pairs may be appended :l + keyword = {file} or {binary} + {file} name = name of output file for the dynamical matrix + {binary} arg = {yes} or {no} or {gzip} :pre +:ule + +[Examples:] + +dynamical_matrix 1 regular 0.000001 +dynamical_matrix 1 eskm 0.000001 +dynamical_matrix 3 regular 0.00004 file dynmat.dat +dynamical_matrix 5 eskm 0.00000001 file dynamical.dat binary yes :pre + +[Description:] + +Calculate the dynamical matrix of the selected group. + +[Restrictions:] + +The command collects the entire dynamical matrix a single MPI rank, +so the memory requirements can be very significant for large systems. + +This command assumes a periodic system. + +This command is part of the USER-PHONON package. It is only enabled if +LAMMPS was built with that package. See the "Build +package"_Build_package.html doc page for more info. + +[Related commands:] + +"fix phonon"_fix_phonon.html + +[Default:] + +The default settings are file = "dynmat.dyn", binary = no diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 5ae3456ad4..827cafed75 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -157,6 +157,7 @@ dump_molfile.html dump_netcdf.html dump_vtk.html dump_cfg_uef.html +dynamical_matrix.html echo.html group.html group2ndx.html diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 8807b2d680..bbfdf946f4 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -625,8 +625,10 @@ dVx dW dx dy +dyn dyne dynes +dynmat Dyre Dzyaloshinskii Eaa diff --git a/src/USER-PHONON/README b/src/USER-PHONON/README index 2212eaaebd..b1ffcb9b09 100644 --- a/src/USER-PHONON/README +++ b/src/USER-PHONON/README @@ -1,19 +1,24 @@ This package contains a fix phonon command that calculates dynamical -matrices, which can then be used to compute phonon dispersion -relations, directly from molecular dynamics simulations. +matrices from finite temperature MD simulations, which can then be +used to compute phonon dispersion relations, directly from molecular +dynamics simulations. -See the doc page for the fix phonon command for detailed usage -instructions. +It also contains two commands to compute the dynamical matrix and +the corresponding third order matrix at pre-optimized positions +through finite differences. + +See the doc page for the fix phonon command or the dynamical_matrix +third_order commands for detailed usage instructions. Use of this package requires building LAMMPS with FFT suppport, as described in doc/Section_start.html. -There are example scripts for using this package in +There are example scripts for using commands in this package in examples/USER/phonon. There is an auxiliary post-processing tool in tools/phonon that will compute phonon frequencies and dispersion relations from the dynamical -matrices output by this command. +matrices output by the fix phonon command. There is also an alternative code, dump2phonon, available which enables one to use the functions of fix-phonon by reading in atom-style dump @@ -21,6 +26,9 @@ files of lammps (which can be converted from the trajectories of any other MD code): https://github.com/lingtikong/dump2phonon -The person who created this package is Ling-Ti Kong (konglt at +The person who created fix phonon is Ling-Ti Kong (konglt at sjtu.edu.cn) at Shanghai Jiao Tong University. Contact him directly if you have questions. + +The person who created dynamical_matrix and third_order is +Charlie Sievers at UC Davis. From 9298fe7868c293a5b6fbca1753c9f07747913e2b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 14:45:42 -0500 Subject: [PATCH 0175/1242] fix segfault and copy-n-modify issues with third order command --- src/USER-PHONON/third_order.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/USER-PHONON/third_order.cpp b/src/USER-PHONON/third_order.cpp index b4d2032a04..f7d72687c6 100644 --- a/src/USER-PHONON/third_order.cpp +++ b/src/USER-PHONON/third_order.cpp @@ -13,6 +13,7 @@ #include "group.h" #include "force.h" #include "math_extra.h" +#include "memory.h" #include "bond.h" #include "angle.h" #include "dihedral.h" @@ -40,7 +41,8 @@ ThirdOrder::ThirdOrder(LAMMPS *lmp) : Pointers(lmp), fp(NULL) ThirdOrder::~ThirdOrder() { - if (fp) fclose(fp); + if (fp && me == 0) fclose(fp); + memory->destroy(groupmap); fp = NULL; } @@ -73,10 +75,11 @@ void ThirdOrder::setup() neighbor->ndanger = 0; // compute all forces - update_force(); + external_force_clear = 0; eflag=0; vflag=0; + update_force(); if (gcount == atom->natoms) for (bigint i=0; inatoms; i++) @@ -92,8 +95,8 @@ void ThirdOrder::command(int narg, char **arg) MPI_Comm_rank(world,&me); if (domain->box_exist == 0) - error->all(FLERR,"Dynamical_matrix command before simulation box is defined"); - if (narg < 2) error->all(FLERR,"Illegal dynamical_matrix command"); + error->all(FLERR,"Third_order command before simulation box is defined"); + if (narg < 2) error->all(FLERR,"Illegal third_oreder command"); lmp->init(); @@ -109,10 +112,11 @@ void ThirdOrder::command(int narg, char **arg) // group and style igroup = group->find(arg[0]); - if (igroup == -1) error->all(FLERR,"Could not find dynamical matrix group ID"); + if (igroup == -1) error->all(FLERR,"Could not find third_order group ID"); groupbit = group->bitmask[igroup]; gcount = group->count(igroup); dynlen = (gcount)*3; + memory->create(groupmap,atom->natoms,"total_group_map:totalgm"); update->setupflag = 1; int style = -1; From 7062bc862eea91a173bec63e4d6a14c0d496d7a7 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 15:21:48 -0500 Subject: [PATCH 0176/1242] remove third_order command and ASE based examples to be added in a new pull request --- .../dynamical_matrix_command/GaAs/GaAs.py | 39 - .../dynamical_matrix_command/GaN/GaN.py | 39 - .../dynamical_matrix_command/Quartz/quartz.py | 57 - .../third_order_command/silicon/Manual.md | 48 - .../third_order_command/silicon/README.md | 25 - .../silicon/Si.opt.tersoff | 66 - .../third_order_command/silicon/combine.sh | 17 - .../silicon/ff-silicon.lmp | 19 - .../third_order_command/silicon/in.silicon | 84 - .../silicon/lmp_bank/silicon_216.lmp | 238 - .../silicon/lmp_bank/silicon_512.lmp | 534 -- .../silicon/lmp_bank/silicon_8.lmp | 29 - .../silicon/results/out.silicon | 58 - .../silicon/results/third_order | 4608 ----------------- .../silicon/silicon_input_file.lmp | 29 - src/USER-PHONON/README | 11 +- src/USER-PHONON/third_order.cpp | 560 -- src/USER-PHONON/third_order.h | 76 - 18 files changed, 5 insertions(+), 6532 deletions(-) delete mode 100644 examples/USER/phonon/dynamical_matrix_command/GaAs/GaAs.py delete mode 100644 examples/USER/phonon/dynamical_matrix_command/GaN/GaN.py delete mode 100644 examples/USER/phonon/dynamical_matrix_command/Quartz/quartz.py delete mode 100755 examples/USER/phonon/third_order_command/silicon/Manual.md delete mode 100755 examples/USER/phonon/third_order_command/silicon/README.md delete mode 100755 examples/USER/phonon/third_order_command/silicon/Si.opt.tersoff delete mode 100755 examples/USER/phonon/third_order_command/silicon/combine.sh delete mode 100755 examples/USER/phonon/third_order_command/silicon/ff-silicon.lmp delete mode 100755 examples/USER/phonon/third_order_command/silicon/in.silicon delete mode 100755 examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_216.lmp delete mode 100755 examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_512.lmp delete mode 100755 examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_8.lmp delete mode 100755 examples/USER/phonon/third_order_command/silicon/results/out.silicon delete mode 100755 examples/USER/phonon/third_order_command/silicon/results/third_order delete mode 100755 examples/USER/phonon/third_order_command/silicon/silicon_input_file.lmp delete mode 100644 src/USER-PHONON/third_order.cpp delete mode 100644 src/USER-PHONON/third_order.h diff --git a/examples/USER/phonon/dynamical_matrix_command/GaAs/GaAs.py b/examples/USER/phonon/dynamical_matrix_command/GaAs/GaAs.py deleted file mode 100644 index 1e9d58a71b..0000000000 --- a/examples/USER/phonon/dynamical_matrix_command/GaAs/GaAs.py +++ /dev/null @@ -1,39 +0,0 @@ -from ase import Atoms, Atom -from ase.calculators.lammpslib import LAMMPSlib -import numpy as np -import matplotlib.pyplot as plt -from mpi4py import MPI - -comm = MPI.COMM_WORLD -rank = comm.Get_rank() - -GaAs = Atoms([Atom('Ga', (0.0, 0.0, 0.0)), - Atom('As', (1.413425, 1.413425, 1.413425))], - cell=[(0.0, 2.82685, 2.82685), (2.82685, 0.0, 2.82685), (2.82685, 2.82685, 0.0)], - pbc=True,) - -cmds = ["pair_style bop", "pair_coeff * * ../../../../../potentials/GaAs.bop.table Ga As", - "comm_modify cutoff 12"] - -mends = ["info system", - "dynamical_matrix all eskm 0.000001 file dynmat.dat binary no", - "neigh_modify delay 0"] - -N = 5 -GaAs = GaAs.repeat([N, N, N]) - -lammps = LAMMPSlib(lmpcmds=cmds, atom_types={'Ga': 1, 'As': 2}, amendments=mends, log_file='lammps.log') - -GaAs.set_calculator(lammps) -GaAs.get_potential_energy() - -if rank == 0: - dynmat = np.loadtxt("dynmat.dat") - dynmat = dynmat.reshape(([int(3*(len(dynmat)/3)**0.5), int(3*(len(dynmat)/3)**0.5)])) - eigv = np.linalg.eigvals(dynmat) - eigv.sort() - eigv = np.sqrt(np.abs(eigv))/(2*np.pi) - plt.hist(eigv, 80) - plt.xlabel('Frequency (THz)') - plt.show() - diff --git a/examples/USER/phonon/dynamical_matrix_command/GaN/GaN.py b/examples/USER/phonon/dynamical_matrix_command/GaN/GaN.py deleted file mode 100644 index 52e14ca47d..0000000000 --- a/examples/USER/phonon/dynamical_matrix_command/GaN/GaN.py +++ /dev/null @@ -1,39 +0,0 @@ -from ase import Atoms, Atom -from ase.calculators.lammpslib import LAMMPSlib -import numpy as np -import matplotlib.pyplot as plt -from mpi4py import MPI - -comm = MPI.COMM_WORLD -rank = comm.Get_rank() - -GaN = Atoms([Atom('Ga', (1.59, 0.917986928012, 0.0)), - Atom('Ga', (1.59, -0.917986928012, 2.583)), - Atom('N', (1.59, 0.917986928012, 1.98891)), - Atom('N', (1.59, -0.917986928012, 4.57191))], - cell=[(1.59, -2.75396078403, 0.0), (1.59, 2.75396078403, 0.0), (0.0, 0.0, 5.166)], - pbc=True) - -cmds = ["pair_style tersoff", "pair_coeff * * ../../../../../potentials/GaN.tersoff Ga N"] - -mends = ["info system", - "dynamical_matrix all eskm 0.000001 file dynmat.dat binary no", - "neigh_modify delay 0"] - -N = 6 -GaN = GaN.repeat([N, N, N]) - -lammps = LAMMPSlib(lmpcmds=cmds, atom_types={'Ga': 1, 'N': 2}, amendments=mends, log_file='lammps.log') - -GaN.set_calculator(lammps) -GaN.get_potential_energy() - -if rank == 0: - dynmat = np.loadtxt("dynmat.dat") - dynmat = dynmat.reshape(([int(3*(len(dynmat)/3)**0.5), int(3*(len(dynmat)/3)**0.5)])) - eigv = np.linalg.eigvals(dynmat) - eigv.sort() - eigv = np.sqrt(np.abs(eigv))/(2*np.pi) - plt.hist(eigv, 80) - plt.xlabel('Frequency (THz)') - plt.show() diff --git a/examples/USER/phonon/dynamical_matrix_command/Quartz/quartz.py b/examples/USER/phonon/dynamical_matrix_command/Quartz/quartz.py deleted file mode 100644 index 79a81aa95c..0000000000 --- a/examples/USER/phonon/dynamical_matrix_command/Quartz/quartz.py +++ /dev/null @@ -1,57 +0,0 @@ -from ase import Atoms, Atom -from ase.calculators.lammpslib import LAMMPSlib -import numpy as np -import matplotlib.pyplot as plt -from mpi4py import MPI - -comm = MPI.COMM_WORLD -rank = comm.Get_rank() - -quartz = Atoms( - [Atom('Si', (1.1545226, -1.99969180169, 0.0)), - Atom('Si', (1.1545226, 1.99969180169, 3.6036)), - Atom('Si', (2.6069548, 2.15247249027e-16, 1.8018)), - Atom('O', (1.6724232, -0.624132037742, 0.64378314)), - Atom('O', (1.6724232, 0.624132037742, 2.9598186618)), - Atom('O', (2.1623026, -2.49695388906, 4.2473849418)), - Atom('O', (3.5392742, 1.13629495821, 1.1580150582)), - Atom('O', (3.5392742, -1.13629495821, 2.4455813382)), - Atom('O', (2.1623026, 2.49695388906, 4.76161686))], - cell=[(2.458, -4.257380885, 0.0), (2.458, 4.257380885, 0.0), (0.0, 0.0, 5.4054)], - pbc=True, - ) - -# number of repeats -N = 3 -quartz = quartz.repeat([N, N, N]) - -header = ['units metal', - 'atom_style charge', - 'atom_modify map array sort 0 0'] - -cmds = ["pair_style buck/coul/long 10.0 8.0", - "pair_coeff 1 1 0 1 0", - "pair_coeff 1 2 18003.7572 0.20520 133.5381", - "pair_coeff 2 2 1388.7730 0.36232 175.0000", - "kspace_style ewald 1.0e-12", - "set type 1 charge 2.4", - "set type 2 charge -1.2"] - -mends = ["dynamical_matrix all eskm 0.000001 file dynmat.dat binary no", - "neigh_modify delay 0"] - - -lammps = LAMMPSlib(lmpcmds=cmds, lammps_header=header, amendments=mends, log_file='lammps.log') - -quartz.set_calculator(lammps) -quartz.get_potential_energy() - -if rank == 0: - dynmat = np.loadtxt("dynmat.dat") - dynmat = dynmat.reshape(([int(3*(len(dynmat)/3)**0.5), int(3*(len(dynmat)/3)**0.5)])) - eigv = np.linalg.eigvals(dynmat) - eigv.sort() - plt.hist(33*np.sqrt(np.abs(eigv))/(2*np.pi), 80) - plt.xlabel('Frequency (cm-1)') - plt.show() - diff --git a/examples/USER/phonon/third_order_command/silicon/Manual.md b/examples/USER/phonon/third_order_command/silicon/Manual.md deleted file mode 100755 index 49340cb54d..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/Manual.md +++ /dev/null @@ -1,48 +0,0 @@ -# third_order command - -## Syntax - -``` -third_order group-ID style args keyword value ... -``` - -* group-ID = ID of group of atoms to displace -* style = *regular* or *ballistico* -``` -*regular* args = gamma - gamma = finite difference displacement length -*ballistico* args = gamma - gamma = finite difference displacement length -``` -* zero or more keyword/value pairs may be appended -* keyword = *file* or *binary* -``` -*file* value = output_file - output_file = name of file to dump the dynamical matrix into -*binary* values = *no* or *gzip* -``` - -## Examples - -``` -third_order 1 regular 0.000001 -third_order 1 ballistico 0.000001 -third_order 3 regular 0.00004 file third_order.dat -third_order 5 ballistico 0.00000001 file third_order.dat binary gzip -``` - -## Description - -Calculate the finite difference third order tensor of the selected group. - -## Restrictions - -None - -## Related commands - -None - -## Default - -The option defaults are file = "third_order.dat", binary = no diff --git a/examples/USER/phonon/third_order_command/silicon/README.md b/examples/USER/phonon/third_order_command/silicon/README.md deleted file mode 100755 index c938734393..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# LAMMPS LATTICE DYNAMICS COMMANDS - -## THIRD ORDER TENSOR CALCULATOR - -This directory contains the ingredients to calculate a third order tensor. - -Example: -``` -$THIRD_ORDER=third_order #tensor output file -NP=4 #number of processors -mpirun -np $NP lmp_mpi -in in.silicon -out out.silicon -combine.sh third_order -``` - -To test out a different silicon example: -``` -$THIRD_ORDER=third_order -$LMP_FILE=amorphous_silicon.lmp -cp lmp_bank/$LMP_FILE ./silicon_input_file.lmp -NP=4 #number of processors -mpirun -np $NP lmp_mpi -in in.silicon -out out.silicon -bash combine.sh $THIRD_ORDER -``` - -## Requires: MANYBODY and MOLECULE packages diff --git a/examples/USER/phonon/third_order_command/silicon/Si.opt.tersoff b/examples/USER/phonon/third_order_command/silicon/Si.opt.tersoff deleted file mode 100755 index 3bc19f0581..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/Si.opt.tersoff +++ /dev/null @@ -1,66 +0,0 @@ -# Tersoff parameters for various elements and mixtures -# multiple entries can be added to this file, LAMMPS reads the ones it needs -# these entries are in LAMMPS "metal" units: -# A,B = eV; lambda1,lambda2,lambda3 = 1/Angstroms; R,D = Angstroms -# other quantities are unitless - -# Aidan Thompson (athomps at sandia.gov) takes full blame for this -# file. It specifies various potentials published by J. Tersoff for -# silicon, carbon and germanium. Since Tersoff published several -# different silicon potentials, I refer to them using atom types -# Si(B), Si(C) and Si(D). The last two are almost almost identical but -# refer to two different publications. These names should be used in -# the LAMMPS command when the file is invoked. For example: -# pair_coeff * * SiCGe.tersoff Si(B). The Si(D), C and Ge potentials -# can be used pure silicon, pure carbon, pure germanium, binary SiC, -# and binary SiGe, but not binary GeC or ternary SiGeC. LAMMPS will -# generate an error if this file is used with any combination -# involving C and Ge, since there are no entries for the GeC -# interactions (Tersoff did not publish parameters for this -# cross-interaction.) - -# format of a single entry (one or more lines): -# element 1, element 2, element 3, -# m, gamma, lambda3, c, d, costheta0, n, beta, lambda2, B, R, D, lambda1, A - -# The original Tersoff potential for Silicon, Si(B) -# J. Tersoff, PRB, 37, 6991 (1988) - -Si(B) Si(B) Si(B) 3.0 1.0 1.3258 4.8381 2.0417 0.0000 22.956 - 0.33675 1.3258 95.373 3.0 0.2 3.2394 3264.7 - -# The later Tersoff potential for Silicon, Si(C) -# J. Tersoff, PRB, 38, 9902 (1988) - -Si(C) Si(C) Si(C) 3.0 1.0 1.7322 1.0039e5 16.218 -0.59826 0.78734 - 1.0999e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8 - -# The later Tersoff potential for Carbon, Silicon, and Germanium -# J. Tersoff, PRB, 39, 5566 (1989) + errata (PRB 41, 3248) -# The Si and C parameters are very close to those in SiC.tersoff - -C C C 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 1.5724e-7 2.2119 346.74 1.95 0.15 3.4879 1393.6 -Si(D) Si(D) Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.7322 471.18 2.85 0.15 2.4799 1830.8 -Ge Ge Ge 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 9.0166e-7 1.7047 419.23 2.95 0.15 2.4451 1769.0 - -C Si(D) Si(D) 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 1.5724e-7 1.97205 395.1451 2.3573 0.1527 2.9839 1597.3111 -C Si(D) C 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 0.0 0.0 0.0 1.95 0.15 0.0 0.0 -C C Si(D) 3.0 1.0 0.0 3.8049e4 4.3484 -0.57058 0.72751 0.0 0.0 0.0 2.3573 0.1527 0.0 0.0 - -Si(D) C C 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.97205 395.1451 2.3573 0.1527 2.9839 1597.3111 -Si(D) Si(D) C 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.3573 0.1527 0.0 0.0 -Si(D) C Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.85 0.15 0.0 0.0 - -Si(D) Ge Ge 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 1.1000e-6 1.71845 444.7177 2.8996 0.1500 2.4625 1799.6347 -Si(D) Si(D) Ge 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.8996 0.1500 0.0 0.0 -Si(D) Ge Si(D) 3.0 1.0 0.0 1.0039e5 16.217 -0.59825 0.78734 0.0 0.0 0.0 2.85 0.15 0.0 0.0 - -Ge Si(D) Si(D) 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 9.0166e-7 1.71845 444.7177 2.8996 0.1500 2.4625 1799.6347 -Ge Si(D) Ge 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 0.0 0.0 0.0 2.95 0.15 0.0 0.0 -Ge Ge Si(D) 3.0 1.0 0.0 1.0643e5 15.652 -0.43884 0.75627 0.0 0.0 0.0 2.8996 0.1500 0.0 0.0 - -# Optimized Tersoff for Carbon: Lindsay and Broido PRB 81, 205441 (2010) -# element 1, element 2, element 3, -# m, gamma, lambda3, c, d, costheta0, n, beta, lambda2, B, R, D, lambda1, A -C(O) C(O) C(O) 3.0 1.0 0.0 3.8049e4 4.3484 -0.930 0.72751 1.5724e-7 2.2119 430.0 1.95 0.15 3.4879 1393.6 - diff --git a/examples/USER/phonon/third_order_command/silicon/combine.sh b/examples/USER/phonon/third_order_command/silicon/combine.sh deleted file mode 100755 index 3eca2537be..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/combine.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -#This script takes one argument -#The argument is the base name for the split up tensor -#The script then combines and sorts the tensor -#$1 file name - -echo "$1" -[ -f $1 ] && rm $1 - -for i in $(ls ./$1*); do - cat $i >> temp - rm $i -done - -sort temp | sort -s -n -k 3 | sort -s -n -k 1 > $1 -rm temp diff --git a/examples/USER/phonon/third_order_command/silicon/ff-silicon.lmp b/examples/USER/phonon/third_order_command/silicon/ff-silicon.lmp deleted file mode 100755 index f3b895f168..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/ff-silicon.lmp +++ /dev/null @@ -1,19 +0,0 @@ -############################# -#Atoms types - mass - charge# -############################# -#@ 1 atom types #!THIS LINE IS NECESSARY DON'T SPEND HOURS FINDING THAT OUT!# - -variable Si equal 1 - -############# -#Atom Masses# -############# - -mass ${Si} 28.08550 - -########################### -#Pair Potentials - Tersoff# -########################### - -pair_style tersoff -pair_coeff * * Si.opt.tersoff Si(D) diff --git a/examples/USER/phonon/third_order_command/silicon/in.silicon b/examples/USER/phonon/third_order_command/silicon/in.silicon deleted file mode 100755 index b8a9e214c4..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/in.silicon +++ /dev/null @@ -1,84 +0,0 @@ -###############################mm -# Atom style - charge/vdw/bonded# -################################# -atom_style full - -############################################## -#Units Metal : eV - ps - angstrom - bar# -# Real : kcal/mol - fs - angstrom - atm# -############################################## -units metal - -############ -#Run number# -############ -variable run_no equal 0 # is it a restart? -variable res_no equal ${run_no}-1 # restart file number - -####################################### -#Random Seeds and Domain Decomposition# -####################################### -variable iseed0 equal 2357 -variable iseed1 equal 26488 -variable iseed2 equal 10669 -processors * * 1 - -########### -#Data File# -########### -variable inpfile string silicon_input_file.lmp -variable resfile string final_restart.${res_no} -variable ff_file string ff-silicon.lmp - -########## -#Run Type# -########## -variable minimise equal 0 #Energy Minimization - -############################### -#Molecular Dynamics Parameters# -############################### -neighbor 1 bin - -################################ -#Energy Minimization Parameters# -################################ -variable mtraj equal 1 # trajectory output frequency - all system -variable etol equal 1e-5 # % change in energy -variable ftol equal 1e-5 # max force threshold (force units) -variable maxiter equal 10000 # max # of iterations - -######################## -#3D Periodic Simulation# -######################## -boundary p p p - -############################# -#Reading the input structure# -############################# -if "${run_no} == 0" then "read_data ${inpfile}" else "read_restart ${resfile}" - -############# -#Force Field# -############# -include ${ff_file} - -##################### -#Energy Minimization# -##################### -if "${minimise} <= 0 || ${run_no} > 0" then "jump SELF end_minimise" - print "Doing CG minimisation" - dump mdcd all dcd ${mtraj} min.dcd - dump_modify mdcd unwrap yes - min_style cg - min_modify line quadratic - minimize ${etol} ${ftol} ${maxiter} ${maxiter} - reset_timestep 0 - undump mdcd -label end_minimise - -################## -#Dynamical Matrix# -################## -third_order all ballistico 0.00001 file third_order binary no - diff --git a/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_216.lmp b/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_216.lmp deleted file mode 100755 index 893d75e69b..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_216.lmp +++ /dev/null @@ -1,238 +0,0 @@ -LAMMPS description - - 216 atoms - 0 bonds - 0 angles - 0 dihedrals - 0 impropers - - 1 atom types - 0 bond types - 0 angle types - 0 dihedral types - 0 improper types - - - 0.0000000 16.293000 xlo xhi - 0.0000000 16.293000 ylo yhi - 0.0000000 16.293000 zlo zhi - - Atoms - - 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 - 2 2 1 0.0000000 0.0000000 2.7160000 2.7160000 - 3 3 1 0.0000000 2.7160000 2.7160000 0.0000000 - 4 4 1 0.0000000 2.7160000 0.0000000 2.7160000 - 5 5 1 0.0000000 4.0730000 1.3580000 4.0730000 - 6 6 1 0.0000000 1.3580000 1.3580000 1.3580000 - 7 7 1 0.0000000 1.3580000 4.0730000 4.0730000 - 8 8 1 0.0000000 4.0730000 4.0730000 1.3580000 - 9 9 1 0.0000000 0.0000000 0.0000000 5.4310000 - 10 10 1 0.0000000 0.0000000 2.7160000 8.1460000 - 11 11 1 0.0000000 2.7160000 2.7160000 5.4310000 - 12 12 1 0.0000000 2.7160000 0.0000000 8.1460000 - 13 13 1 0.0000000 4.0730000 1.3580000 9.5040000 - 14 14 1 0.0000000 1.3580000 1.3580000 6.7890000 - 15 15 1 0.0000000 1.3580000 4.0730000 9.5040000 - 16 16 1 0.0000000 4.0730000 4.0730000 6.7890000 - 17 17 1 0.0000000 0.0000000 0.0000000 10.8620000 - 18 18 1 0.0000000 0.0000000 2.7160000 13.5780000 - 19 19 1 0.0000000 2.7160000 2.7160000 10.8620000 - 20 20 1 0.0000000 2.7160000 0.0000000 13.5780000 - 21 21 1 0.0000000 4.0730000 1.3580000 14.9350000 - 22 22 1 0.0000000 1.3580000 1.3580000 12.2200000 - 23 23 1 0.0000000 1.3580000 4.0730000 14.9350000 - 24 24 1 0.0000000 4.0730000 4.0730000 12.2200000 - 25 25 1 0.0000000 0.0000000 5.4310000 0.0000000 - 26 26 1 0.0000000 0.0000000 8.1460000 2.7160000 - 27 27 1 0.0000000 2.7160000 8.1460000 0.0000000 - 28 28 1 0.0000000 2.7160000 5.4310000 2.7160000 - 29 29 1 0.0000000 4.0730000 6.7890000 4.0730000 - 30 30 1 0.0000000 1.3580000 6.7890000 1.3580000 - 31 31 1 0.0000000 1.3580000 9.5040000 4.0730000 - 32 32 1 0.0000000 4.0730000 9.5040000 1.3580000 - 33 33 1 0.0000000 0.0000000 5.4310000 5.4310000 - 34 34 1 0.0000000 0.0000000 8.1460000 8.1460000 - 35 35 1 0.0000000 2.7160000 8.1460000 5.4310000 - 36 36 1 0.0000000 2.7160000 5.4310000 8.1460000 - 37 37 1 0.0000000 4.0730000 6.7890000 9.5040000 - 38 38 1 0.0000000 1.3580000 6.7890000 6.7890000 - 39 39 1 0.0000000 1.3580000 9.5040000 9.5040000 - 40 40 1 0.0000000 4.0730000 9.5040000 6.7890000 - 41 41 1 0.0000000 0.0000000 5.4310000 10.8620000 - 42 42 1 0.0000000 0.0000000 8.1460000 13.5780000 - 43 43 1 0.0000000 2.7160000 8.1460000 10.8620000 - 44 44 1 0.0000000 2.7160000 5.4310000 13.5780000 - 45 45 1 0.0000000 4.0730000 6.7890000 14.9350000 - 46 46 1 0.0000000 1.3580000 6.7890000 12.2200000 - 47 47 1 0.0000000 1.3580000 9.5040000 14.9350000 - 48 48 1 0.0000000 4.0730000 9.5040000 12.2200000 - 49 49 1 0.0000000 0.0000000 10.8620000 0.0000000 - 50 50 1 0.0000000 0.0000000 13.5780000 2.7160000 - 51 51 1 0.0000000 2.7160000 13.5780000 0.0000000 - 52 52 1 0.0000000 2.7160000 10.8620000 2.7160000 - 53 53 1 0.0000000 4.0730000 12.2200000 4.0730000 - 54 54 1 0.0000000 1.3580000 12.2200000 1.3580000 - 55 55 1 0.0000000 1.3580000 14.9350000 4.0730000 - 56 56 1 0.0000000 4.0730000 14.9350000 1.3580000 - 57 57 1 0.0000000 0.0000000 10.8620000 5.4310000 - 58 58 1 0.0000000 0.0000000 13.5780000 8.1460000 - 59 59 1 0.0000000 2.7160000 13.5780000 5.4310000 - 60 60 1 0.0000000 2.7160000 10.8620000 8.1460000 - 61 61 1 0.0000000 4.0730000 12.2200000 9.5040000 - 62 62 1 0.0000000 1.3580000 12.2200000 6.7890000 - 63 63 1 0.0000000 1.3580000 14.9350000 9.5040000 - 64 64 1 0.0000000 4.0730000 14.9350000 6.7890000 - 65 65 1 0.0000000 0.0000000 10.8620000 10.8620000 - 66 66 1 0.0000000 0.0000000 13.5780000 13.5780000 - 67 67 1 0.0000000 2.7160000 13.5780000 10.8620000 - 68 68 1 0.0000000 2.7160000 10.8620000 13.5780000 - 69 69 1 0.0000000 4.0730000 12.2200000 14.9350000 - 70 70 1 0.0000000 1.3580000 12.2200000 12.2200000 - 71 71 1 0.0000000 1.3580000 14.9350000 14.9350000 - 72 72 1 0.0000000 4.0730000 14.9350000 12.2200000 - 73 73 1 0.0000000 5.4310000 0.0000000 0.0000000 - 74 74 1 0.0000000 5.4310000 2.7160000 2.7160000 - 75 75 1 0.0000000 8.1460000 2.7160000 0.0000000 - 76 76 1 0.0000000 8.1460000 0.0000000 2.7160000 - 77 77 1 0.0000000 9.5040000 1.3580000 4.0730000 - 78 78 1 0.0000000 6.7890000 1.3580000 1.3580000 - 79 79 1 0.0000000 6.7890000 4.0730000 4.0730000 - 80 80 1 0.0000000 9.5040000 4.0730000 1.3580000 - 81 81 1 0.0000000 5.4310000 0.0000000 5.4310000 - 82 82 1 0.0000000 5.4310000 2.7160000 8.1460000 - 83 83 1 0.0000000 8.1460000 2.7160000 5.4310000 - 84 84 1 0.0000000 8.1460000 0.0000000 8.1460000 - 85 85 1 0.0000000 9.5040000 1.3580000 9.5040000 - 86 86 1 0.0000000 6.7890000 1.3580000 6.7890000 - 87 87 1 0.0000000 6.7890000 4.0730000 9.5040000 - 88 88 1 0.0000000 9.5040000 4.0730000 6.7890000 - 89 89 1 0.0000000 5.4310000 0.0000000 10.8620000 - 90 90 1 0.0000000 5.4310000 2.7160000 13.5780000 - 91 91 1 0.0000000 8.1460000 2.7160000 10.8620000 - 92 92 1 0.0000000 8.1460000 0.0000000 13.5780000 - 93 93 1 0.0000000 9.5040000 1.3580000 14.9350000 - 94 94 1 0.0000000 6.7890000 1.3580000 12.2200000 - 95 95 1 0.0000000 6.7890000 4.0730000 14.9350000 - 96 96 1 0.0000000 9.5040000 4.0730000 12.2200000 - 97 97 1 0.0000000 5.4310000 5.4310000 0.0000000 - 98 98 1 0.0000000 5.4310000 8.1460000 2.7160000 - 99 99 1 0.0000000 8.1460000 8.1460000 0.0000000 - 100 100 1 0.0000000 8.1460000 5.4310000 2.7160000 - 101 101 1 0.0000000 9.5040000 6.7890000 4.0730000 - 102 102 1 0.0000000 6.7890000 6.7890000 1.3580000 - 103 103 1 0.0000000 6.7890000 9.5040000 4.0730000 - 104 104 1 0.0000000 9.5040000 9.5040000 1.3580000 - 105 105 1 0.0000000 5.4310000 5.4310000 5.4310000 - 106 106 1 0.0000000 5.4310000 8.1460000 8.1460000 - 107 107 1 0.0000000 8.1460000 8.1460000 5.4310000 - 108 108 1 0.0000000 8.1460000 5.4310000 8.1460000 - 109 109 1 0.0000000 9.5040000 6.7890000 9.5040000 - 110 110 1 0.0000000 6.7890000 6.7890000 6.7890000 - 111 111 1 0.0000000 6.7890000 9.5040000 9.5040000 - 112 112 1 0.0000000 9.5040000 9.5040000 6.7890000 - 113 113 1 0.0000000 5.4310000 5.4310000 10.8620000 - 114 114 1 0.0000000 5.4310000 8.1460000 13.5780000 - 115 115 1 0.0000000 8.1460000 8.1460000 10.8620000 - 116 116 1 0.0000000 8.1460000 5.4310000 13.5780000 - 117 117 1 0.0000000 9.5040000 6.7890000 14.9350000 - 118 118 1 0.0000000 6.7890000 6.7890000 12.2200000 - 119 119 1 0.0000000 6.7890000 9.5040000 14.9350000 - 120 120 1 0.0000000 9.5040000 9.5040000 12.2200000 - 121 121 1 0.0000000 5.4310000 10.8620000 0.0000000 - 122 122 1 0.0000000 5.4310000 13.5780000 2.7160000 - 123 123 1 0.0000000 8.1460000 13.5780000 0.0000000 - 124 124 1 0.0000000 8.1460000 10.8620000 2.7160000 - 125 125 1 0.0000000 9.5040000 12.2200000 4.0730000 - 126 126 1 0.0000000 6.7890000 12.2200000 1.3580000 - 127 127 1 0.0000000 6.7890000 14.9350000 4.0730000 - 128 128 1 0.0000000 9.5040000 14.9350000 1.3580000 - 129 129 1 0.0000000 5.4310000 10.8620000 5.4310000 - 130 130 1 0.0000000 5.4310000 13.5780000 8.1460000 - 131 131 1 0.0000000 8.1460000 13.5780000 5.4310000 - 132 132 1 0.0000000 8.1460000 10.8620000 8.1460000 - 133 133 1 0.0000000 9.5040000 12.2200000 9.5040000 - 134 134 1 0.0000000 6.7890000 12.2200000 6.7890000 - 135 135 1 0.0000000 6.7890000 14.9350000 9.5040000 - 136 136 1 0.0000000 9.5040000 14.9350000 6.7890000 - 137 137 1 0.0000000 5.4310000 10.8620000 10.8620000 - 138 138 1 0.0000000 5.4310000 13.5780000 13.5780000 - 139 139 1 0.0000000 8.1460000 13.5780000 10.8620000 - 140 140 1 0.0000000 8.1460000 10.8620000 13.5780000 - 141 141 1 0.0000000 9.5040000 12.2200000 14.9350000 - 142 142 1 0.0000000 6.7890000 12.2200000 12.2200000 - 143 143 1 0.0000000 6.7890000 14.9350000 14.9350000 - 144 144 1 0.0000000 9.5040000 14.9350000 12.2200000 - 145 145 1 0.0000000 10.8620000 0.0000000 0.0000000 - 146 146 1 0.0000000 10.8620000 2.7160000 2.7160000 - 147 147 1 0.0000000 13.5780000 2.7160000 0.0000000 - 148 148 1 0.0000000 13.5780000 0.0000000 2.7160000 - 149 149 1 0.0000000 14.9350000 1.3580000 4.0730000 - 150 150 1 0.0000000 12.2200000 1.3580000 1.3580000 - 151 151 1 0.0000000 12.2200000 4.0730000 4.0730000 - 152 152 1 0.0000000 14.9350000 4.0730000 1.3580000 - 153 153 1 0.0000000 10.8620000 0.0000000 5.4310000 - 154 154 1 0.0000000 10.8620000 2.7160000 8.1460000 - 155 155 1 0.0000000 13.5780000 2.7160000 5.4310000 - 156 156 1 0.0000000 13.5780000 0.0000000 8.1460000 - 157 157 1 0.0000000 14.9350000 1.3580000 9.5040000 - 158 158 1 0.0000000 12.2200000 1.3580000 6.7890000 - 159 159 1 0.0000000 12.2200000 4.0730000 9.5040000 - 160 160 1 0.0000000 14.9350000 4.0730000 6.7890000 - 161 161 1 0.0000000 10.8620000 0.0000000 10.8620000 - 162 162 1 0.0000000 10.8620000 2.7160000 13.5780000 - 163 163 1 0.0000000 13.5780000 2.7160000 10.8620000 - 164 164 1 0.0000000 13.5780000 0.0000000 13.5780000 - 165 165 1 0.0000000 14.9350000 1.3580000 14.9350000 - 166 166 1 0.0000000 12.2200000 1.3580000 12.2200000 - 167 167 1 0.0000000 12.2200000 4.0730000 14.9350000 - 168 168 1 0.0000000 14.9350000 4.0730000 12.2200000 - 169 169 1 0.0000000 10.8620000 5.4310000 0.0000000 - 170 170 1 0.0000000 10.8620000 8.1460000 2.7160000 - 171 171 1 0.0000000 13.5780000 8.1460000 0.0000000 - 172 172 1 0.0000000 13.5780000 5.4310000 2.7160000 - 173 173 1 0.0000000 14.9350000 6.7890000 4.0730000 - 174 174 1 0.0000000 12.2200000 6.7890000 1.3580000 - 175 175 1 0.0000000 12.2200000 9.5040000 4.0730000 - 176 176 1 0.0000000 14.9350000 9.5040000 1.3580000 - 177 177 1 0.0000000 10.8620000 5.4310000 5.4310000 - 178 178 1 0.0000000 10.8620000 8.1460000 8.1460000 - 179 179 1 0.0000000 13.5780000 8.1460000 5.4310000 - 180 180 1 0.0000000 13.5780000 5.4310000 8.1460000 - 181 181 1 0.0000000 14.9350000 6.7890000 9.5040000 - 182 182 1 0.0000000 12.2200000 6.7890000 6.7890000 - 183 183 1 0.0000000 12.2200000 9.5040000 9.5040000 - 184 184 1 0.0000000 14.9350000 9.5040000 6.7890000 - 185 185 1 0.0000000 10.8620000 5.4310000 10.8620000 - 186 186 1 0.0000000 10.8620000 8.1460000 13.5780000 - 187 187 1 0.0000000 13.5780000 8.1460000 10.8620000 - 188 188 1 0.0000000 13.5780000 5.4310000 13.5780000 - 189 189 1 0.0000000 14.9350000 6.7890000 14.9350000 - 190 190 1 0.0000000 12.2200000 6.7890000 12.2200000 - 191 191 1 0.0000000 12.2200000 9.5040000 14.9350000 - 192 192 1 0.0000000 14.9350000 9.5040000 12.2200000 - 193 193 1 0.0000000 10.8620000 10.8620000 0.0000000 - 194 194 1 0.0000000 10.8620000 13.5780000 2.7160000 - 195 195 1 0.0000000 13.5780000 13.5780000 0.0000000 - 196 196 1 0.0000000 13.5780000 10.8620000 2.7160000 - 197 197 1 0.0000000 14.9350000 12.2200000 4.0730000 - 198 198 1 0.0000000 12.2200000 12.2200000 1.3580000 - 199 199 1 0.0000000 12.2200000 14.9350000 4.0730000 - 200 200 1 0.0000000 14.9350000 14.9350000 1.3580000 - 201 201 1 0.0000000 10.8620000 10.8620000 5.4310000 - 202 202 1 0.0000000 10.8620000 13.5780000 8.1460000 - 203 203 1 0.0000000 13.5780000 13.5780000 5.4310000 - 204 204 1 0.0000000 13.5780000 10.8620000 8.1460000 - 205 205 1 0.0000000 14.9350000 12.2200000 9.5040000 - 206 206 1 0.0000000 12.2200000 12.2200000 6.7890000 - 207 207 1 0.0000000 12.2200000 14.9350000 9.5040000 - 208 208 1 0.0000000 14.9350000 14.9350000 6.7890000 - 209 209 1 0.0000000 10.8620000 10.8620000 10.8620000 - 210 210 1 0.0000000 10.8620000 13.5780000 13.5780000 - 211 211 1 0.0000000 13.5780000 13.5780000 10.8620000 - 212 212 1 0.0000000 13.5780000 10.8620000 13.5780000 - 213 213 1 0.0000000 14.9350000 12.2200000 14.9350000 - 214 214 1 0.0000000 12.2200000 12.2200000 12.2200000 - 215 215 1 0.0000000 12.2200000 14.9350000 14.9350000 - 216 216 1 0.0000000 14.9350000 14.9350000 12.2200000 - diff --git a/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_512.lmp b/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_512.lmp deleted file mode 100755 index 8c1ecd30bd..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_512.lmp +++ /dev/null @@ -1,534 +0,0 @@ -LAMMPS description - - 512 atoms - 0 bonds - 0 angles - 0 dihedrals - 0 impropers - - 1 atom types - 0 bond types - 0 angle types - 0 dihedral types - 0 improper types - - - 0.0000000 21.724000 xlo xhi - 0.0000000 21.724000 ylo yhi - 0.0000000 21.724000 zlo zhi - - Atoms - - 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 - 2 2 1 0.0000000 0.0000000 2.7150000 2.7150000 - 3 3 1 0.0000000 2.7150000 2.7150000 0.0000000 - 4 4 1 0.0000000 2.7150000 0.0000000 2.7150000 - 5 5 1 0.0000000 4.0730000 1.3580000 4.0730000 - 6 6 1 0.0000000 1.3580000 1.3580000 1.3580000 - 7 7 1 0.0000000 1.3580000 4.0730000 4.0730000 - 8 8 1 0.0000000 4.0730000 4.0730000 1.3580000 - 9 9 1 0.0000000 0.0000000 0.0000000 5.4310000 - 10 10 1 0.0000000 0.0000000 2.7150000 8.1460000 - 11 11 1 0.0000000 2.7150000 2.7150000 5.4310000 - 12 12 1 0.0000000 2.7150000 0.0000000 8.1460000 - 13 13 1 0.0000000 4.0730000 1.3580000 9.5040000 - 14 14 1 0.0000000 1.3580000 1.3580000 6.7890000 - 15 15 1 0.0000000 1.3580000 4.0730000 9.5040000 - 16 16 1 0.0000000 4.0730000 4.0730000 6.7890000 - 17 17 1 0.0000000 0.0000000 0.0000000 10.8620000 - 18 18 1 0.0000000 0.0000000 2.7150000 13.5770000 - 19 19 1 0.0000000 2.7150000 2.7150000 10.8620000 - 20 20 1 0.0000000 2.7150000 0.0000000 13.5770000 - 21 21 1 0.0000000 4.0730000 1.3580000 14.9350000 - 22 22 1 0.0000000 1.3580000 1.3580000 12.2200000 - 23 23 1 0.0000000 1.3580000 4.0730000 14.9350000 - 24 24 1 0.0000000 4.0730000 4.0730000 12.2200000 - 25 25 1 0.0000000 0.0000000 0.0000000 16.2930000 - 26 26 1 0.0000000 0.0000000 2.7150000 19.0080000 - 27 27 1 0.0000000 2.7150000 2.7150000 16.2930000 - 28 28 1 0.0000000 2.7150000 0.0000000 19.0080000 - 29 29 1 0.0000000 4.0730000 1.3580000 20.3660000 - 30 30 1 0.0000000 1.3580000 1.3580000 17.6510000 - 31 31 1 0.0000000 1.3580000 4.0730000 20.3660000 - 32 32 1 0.0000000 4.0730000 4.0730000 17.6510000 - 33 33 1 0.0000000 0.0000000 5.4310000 0.0000000 - 34 34 1 0.0000000 0.0000000 8.1460000 2.7150000 - 35 35 1 0.0000000 2.7150000 8.1460000 0.0000000 - 36 36 1 0.0000000 2.7150000 5.4310000 2.7150000 - 37 37 1 0.0000000 4.0730000 6.7890000 4.0730000 - 38 38 1 0.0000000 1.3580000 6.7890000 1.3580000 - 39 39 1 0.0000000 1.3580000 9.5040000 4.0730000 - 40 40 1 0.0000000 4.0730000 9.5040000 1.3580000 - 41 41 1 0.0000000 0.0000000 5.4310000 5.4310000 - 42 42 1 0.0000000 0.0000000 8.1460000 8.1460000 - 43 43 1 0.0000000 2.7150000 8.1460000 5.4310000 - 44 44 1 0.0000000 2.7150000 5.4310000 8.1460000 - 45 45 1 0.0000000 4.0730000 6.7890000 9.5040000 - 46 46 1 0.0000000 1.3580000 6.7890000 6.7890000 - 47 47 1 0.0000000 1.3580000 9.5040000 9.5040000 - 48 48 1 0.0000000 4.0730000 9.5040000 6.7890000 - 49 49 1 0.0000000 0.0000000 5.4310000 10.8620000 - 50 50 1 0.0000000 0.0000000 8.1460000 13.5770000 - 51 51 1 0.0000000 2.7150000 8.1460000 10.8620000 - 52 52 1 0.0000000 2.7150000 5.4310000 13.5770000 - 53 53 1 0.0000000 4.0730000 6.7890000 14.9350000 - 54 54 1 0.0000000 1.3580000 6.7890000 12.2200000 - 55 55 1 0.0000000 1.3580000 9.5040000 14.9350000 - 56 56 1 0.0000000 4.0730000 9.5040000 12.2200000 - 57 57 1 0.0000000 0.0000000 5.4310000 16.2930000 - 58 58 1 0.0000000 0.0000000 8.1460000 19.0080000 - 59 59 1 0.0000000 2.7150000 8.1460000 16.2930000 - 60 60 1 0.0000000 2.7150000 5.4310000 19.0080000 - 61 61 1 0.0000000 4.0730000 6.7890000 20.3660000 - 62 62 1 0.0000000 1.3580000 6.7890000 17.6510000 - 63 63 1 0.0000000 1.3580000 9.5040000 20.3660000 - 64 64 1 0.0000000 4.0730000 9.5040000 17.6510000 - 65 65 1 0.0000000 0.0000000 10.8620000 0.0000000 - 66 66 1 0.0000000 0.0000000 13.5770000 2.7150000 - 67 67 1 0.0000000 2.7150000 13.5770000 0.0000000 - 68 68 1 0.0000000 2.7150000 10.8620000 2.7150000 - 69 69 1 0.0000000 4.0730000 12.2200000 4.0730000 - 70 70 1 0.0000000 1.3580000 12.2200000 1.3580000 - 71 71 1 0.0000000 1.3580000 14.9350000 4.0730000 - 72 72 1 0.0000000 4.0730000 14.9350000 1.3580000 - 73 73 1 0.0000000 0.0000000 10.8620000 5.4310000 - 74 74 1 0.0000000 0.0000000 13.5770000 8.1460000 - 75 75 1 0.0000000 2.7150000 13.5770000 5.4310000 - 76 76 1 0.0000000 2.7150000 10.8620000 8.1460000 - 77 77 1 0.0000000 4.0730000 12.2200000 9.5040000 - 78 78 1 0.0000000 1.3580000 12.2200000 6.7890000 - 79 79 1 0.0000000 1.3580000 14.9350000 9.5040000 - 80 80 1 0.0000000 4.0730000 14.9350000 6.7890000 - 81 81 1 0.0000000 0.0000000 10.8620000 10.8620000 - 82 82 1 0.0000000 0.0000000 13.5770000 13.5770000 - 83 83 1 0.0000000 2.7150000 13.5770000 10.8620000 - 84 84 1 0.0000000 2.7150000 10.8620000 13.5770000 - 85 85 1 0.0000000 4.0730000 12.2200000 14.9350000 - 86 86 1 0.0000000 1.3580000 12.2200000 12.2200000 - 87 87 1 0.0000000 1.3580000 14.9350000 14.9350000 - 88 88 1 0.0000000 4.0730000 14.9350000 12.2200000 - 89 89 1 0.0000000 0.0000000 10.8620000 16.2930000 - 90 90 1 0.0000000 0.0000000 13.5770000 19.0080000 - 91 91 1 0.0000000 2.7150000 13.5770000 16.2930000 - 92 92 1 0.0000000 2.7150000 10.8620000 19.0080000 - 93 93 1 0.0000000 4.0730000 12.2200000 20.3660000 - 94 94 1 0.0000000 1.3580000 12.2200000 17.6510000 - 95 95 1 0.0000000 1.3580000 14.9350000 20.3660000 - 96 96 1 0.0000000 4.0730000 14.9350000 17.6510000 - 97 97 1 0.0000000 0.0000000 16.2930000 0.0000000 - 98 98 1 0.0000000 0.0000000 19.0080000 2.7150000 - 99 99 1 0.0000000 2.7150000 19.0080000 0.0000000 - 100 100 1 0.0000000 2.7150000 16.2930000 2.7150000 - 101 101 1 0.0000000 4.0730000 17.6510000 4.0730000 - 102 102 1 0.0000000 1.3580000 17.6510000 1.3580000 - 103 103 1 0.0000000 1.3580000 20.3660000 4.0730000 - 104 104 1 0.0000000 4.0730000 20.3660000 1.3580000 - 105 105 1 0.0000000 0.0000000 16.2930000 5.4310000 - 106 106 1 0.0000000 0.0000000 19.0080000 8.1460000 - 107 107 1 0.0000000 2.7150000 19.0080000 5.4310000 - 108 108 1 0.0000000 2.7150000 16.2930000 8.1460000 - 109 109 1 0.0000000 4.0730000 17.6510000 9.5040000 - 110 110 1 0.0000000 1.3580000 17.6510000 6.7890000 - 111 111 1 0.0000000 1.3580000 20.3660000 9.5040000 - 112 112 1 0.0000000 4.0730000 20.3660000 6.7890000 - 113 113 1 0.0000000 0.0000000 16.2930000 10.8620000 - 114 114 1 0.0000000 0.0000000 19.0080000 13.5770000 - 115 115 1 0.0000000 2.7150000 19.0080000 10.8620000 - 116 116 1 0.0000000 2.7150000 16.2930000 13.5770000 - 117 117 1 0.0000000 4.0730000 17.6510000 14.9350000 - 118 118 1 0.0000000 1.3580000 17.6510000 12.2200000 - 119 119 1 0.0000000 1.3580000 20.3660000 14.9350000 - 120 120 1 0.0000000 4.0730000 20.3660000 12.2200000 - 121 121 1 0.0000000 0.0000000 16.2930000 16.2930000 - 122 122 1 0.0000000 0.0000000 19.0080000 19.0080000 - 123 123 1 0.0000000 2.7150000 19.0080000 16.2930000 - 124 124 1 0.0000000 2.7150000 16.2930000 19.0080000 - 125 125 1 0.0000000 4.0730000 17.6510000 20.3660000 - 126 126 1 0.0000000 1.3580000 17.6510000 17.6510000 - 127 127 1 0.0000000 1.3580000 20.3660000 20.3660000 - 128 128 1 0.0000000 4.0730000 20.3660000 17.6510000 - 129 129 1 0.0000000 5.4310000 0.0000000 0.0000000 - 130 130 1 0.0000000 5.4310000 2.7150000 2.7150000 - 131 131 1 0.0000000 8.1460000 2.7150000 0.0000000 - 132 132 1 0.0000000 8.1460000 0.0000000 2.7150000 - 133 133 1 0.0000000 9.5040000 1.3580000 4.0730000 - 134 134 1 0.0000000 6.7890000 1.3580000 1.3580000 - 135 135 1 0.0000000 6.7890000 4.0730000 4.0730000 - 136 136 1 0.0000000 9.5040000 4.0730000 1.3580000 - 137 137 1 0.0000000 5.4310000 0.0000000 5.4310000 - 138 138 1 0.0000000 5.4310000 2.7150000 8.1460000 - 139 139 1 0.0000000 8.1460000 2.7150000 5.4310000 - 140 140 1 0.0000000 8.1460000 0.0000000 8.1460000 - 141 141 1 0.0000000 9.5040000 1.3580000 9.5040000 - 142 142 1 0.0000000 6.7890000 1.3580000 6.7890000 - 143 143 1 0.0000000 6.7890000 4.0730000 9.5040000 - 144 144 1 0.0000000 9.5040000 4.0730000 6.7890000 - 145 145 1 0.0000000 5.4310000 0.0000000 10.8620000 - 146 146 1 0.0000000 5.4310000 2.7150000 13.5770000 - 147 147 1 0.0000000 8.1460000 2.7150000 10.8620000 - 148 148 1 0.0000000 8.1460000 0.0000000 13.5770000 - 149 149 1 0.0000000 9.5040000 1.3580000 14.9350000 - 150 150 1 0.0000000 6.7890000 1.3580000 12.2200000 - 151 151 1 0.0000000 6.7890000 4.0730000 14.9350000 - 152 152 1 0.0000000 9.5040000 4.0730000 12.2200000 - 153 153 1 0.0000000 5.4310000 0.0000000 16.2930000 - 154 154 1 0.0000000 5.4310000 2.7150000 19.0080000 - 155 155 1 0.0000000 8.1460000 2.7150000 16.2930000 - 156 156 1 0.0000000 8.1460000 0.0000000 19.0080000 - 157 157 1 0.0000000 9.5040000 1.3580000 20.3660000 - 158 158 1 0.0000000 6.7890000 1.3580000 17.6510000 - 159 159 1 0.0000000 6.7890000 4.0730000 20.3660000 - 160 160 1 0.0000000 9.5040000 4.0730000 17.6510000 - 161 161 1 0.0000000 5.4310000 5.4310000 0.0000000 - 162 162 1 0.0000000 5.4310000 8.1460000 2.7150000 - 163 163 1 0.0000000 8.1460000 8.1460000 0.0000000 - 164 164 1 0.0000000 8.1460000 5.4310000 2.7150000 - 165 165 1 0.0000000 9.5040000 6.7890000 4.0730000 - 166 166 1 0.0000000 6.7890000 6.7890000 1.3580000 - 167 167 1 0.0000000 6.7890000 9.5040000 4.0730000 - 168 168 1 0.0000000 9.5040000 9.5040000 1.3580000 - 169 169 1 0.0000000 5.4310000 5.4310000 5.4310000 - 170 170 1 0.0000000 5.4310000 8.1460000 8.1460000 - 171 171 1 0.0000000 8.1460000 8.1460000 5.4310000 - 172 172 1 0.0000000 8.1460000 5.4310000 8.1460000 - 173 173 1 0.0000000 9.5040000 6.7890000 9.5040000 - 174 174 1 0.0000000 6.7890000 6.7890000 6.7890000 - 175 175 1 0.0000000 6.7890000 9.5040000 9.5040000 - 176 176 1 0.0000000 9.5040000 9.5040000 6.7890000 - 177 177 1 0.0000000 5.4310000 5.4310000 10.8620000 - 178 178 1 0.0000000 5.4310000 8.1460000 13.5770000 - 179 179 1 0.0000000 8.1460000 8.1460000 10.8620000 - 180 180 1 0.0000000 8.1460000 5.4310000 13.5770000 - 181 181 1 0.0000000 9.5040000 6.7890000 14.9350000 - 182 182 1 0.0000000 6.7890000 6.7890000 12.2200000 - 183 183 1 0.0000000 6.7890000 9.5040000 14.9350000 - 184 184 1 0.0000000 9.5040000 9.5040000 12.2200000 - 185 185 1 0.0000000 5.4310000 5.4310000 16.2930000 - 186 186 1 0.0000000 5.4310000 8.1460000 19.0080000 - 187 187 1 0.0000000 8.1460000 8.1460000 16.2930000 - 188 188 1 0.0000000 8.1460000 5.4310000 19.0080000 - 189 189 1 0.0000000 9.5040000 6.7890000 20.3660000 - 190 190 1 0.0000000 6.7890000 6.7890000 17.6510000 - 191 191 1 0.0000000 6.7890000 9.5040000 20.3660000 - 192 192 1 0.0000000 9.5040000 9.5040000 17.6510000 - 193 193 1 0.0000000 5.4310000 10.8620000 0.0000000 - 194 194 1 0.0000000 5.4310000 13.5770000 2.7150000 - 195 195 1 0.0000000 8.1460000 13.5770000 0.0000000 - 196 196 1 0.0000000 8.1460000 10.8620000 2.7150000 - 197 197 1 0.0000000 9.5040000 12.2200000 4.0730000 - 198 198 1 0.0000000 6.7890000 12.2200000 1.3580000 - 199 199 1 0.0000000 6.7890000 14.9350000 4.0730000 - 200 200 1 0.0000000 9.5040000 14.9350000 1.3580000 - 201 201 1 0.0000000 5.4310000 10.8620000 5.4310000 - 202 202 1 0.0000000 5.4310000 13.5770000 8.1460000 - 203 203 1 0.0000000 8.1460000 13.5770000 5.4310000 - 204 204 1 0.0000000 8.1460000 10.8620000 8.1460000 - 205 205 1 0.0000000 9.5040000 12.2200000 9.5040000 - 206 206 1 0.0000000 6.7890000 12.2200000 6.7890000 - 207 207 1 0.0000000 6.7890000 14.9350000 9.5040000 - 208 208 1 0.0000000 9.5040000 14.9350000 6.7890000 - 209 209 1 0.0000000 5.4310000 10.8620000 10.8620000 - 210 210 1 0.0000000 5.4310000 13.5770000 13.5770000 - 211 211 1 0.0000000 8.1460000 13.5770000 10.8620000 - 212 212 1 0.0000000 8.1460000 10.8620000 13.5770000 - 213 213 1 0.0000000 9.5040000 12.2200000 14.9350000 - 214 214 1 0.0000000 6.7890000 12.2200000 12.2200000 - 215 215 1 0.0000000 6.7890000 14.9350000 14.9350000 - 216 216 1 0.0000000 9.5040000 14.9350000 12.2200000 - 217 217 1 0.0000000 5.4310000 10.8620000 16.2930000 - 218 218 1 0.0000000 5.4310000 13.5770000 19.0080000 - 219 219 1 0.0000000 8.1460000 13.5770000 16.2930000 - 220 220 1 0.0000000 8.1460000 10.8620000 19.0080000 - 221 221 1 0.0000000 9.5040000 12.2200000 20.3660000 - 222 222 1 0.0000000 6.7890000 12.2200000 17.6510000 - 223 223 1 0.0000000 6.7890000 14.9350000 20.3660000 - 224 224 1 0.0000000 9.5040000 14.9350000 17.6510000 - 225 225 1 0.0000000 5.4310000 16.2930000 0.0000000 - 226 226 1 0.0000000 5.4310000 19.0080000 2.7150000 - 227 227 1 0.0000000 8.1460000 19.0080000 0.0000000 - 228 228 1 0.0000000 8.1460000 16.2930000 2.7150000 - 229 229 1 0.0000000 9.5040000 17.6510000 4.0730000 - 230 230 1 0.0000000 6.7890000 17.6510000 1.3580000 - 231 231 1 0.0000000 6.7890000 20.3660000 4.0730000 - 232 232 1 0.0000000 9.5040000 20.3660000 1.3580000 - 233 233 1 0.0000000 5.4310000 16.2930000 5.4310000 - 234 234 1 0.0000000 5.4310000 19.0080000 8.1460000 - 235 235 1 0.0000000 8.1460000 19.0080000 5.4310000 - 236 236 1 0.0000000 8.1460000 16.2930000 8.1460000 - 237 237 1 0.0000000 9.5040000 17.6510000 9.5040000 - 238 238 1 0.0000000 6.7890000 17.6510000 6.7890000 - 239 239 1 0.0000000 6.7890000 20.3660000 9.5040000 - 240 240 1 0.0000000 9.5040000 20.3660000 6.7890000 - 241 241 1 0.0000000 5.4310000 16.2930000 10.8620000 - 242 242 1 0.0000000 5.4310000 19.0080000 13.5770000 - 243 243 1 0.0000000 8.1460000 19.0080000 10.8620000 - 244 244 1 0.0000000 8.1460000 16.2930000 13.5770000 - 245 245 1 0.0000000 9.5040000 17.6510000 14.9350000 - 246 246 1 0.0000000 6.7890000 17.6510000 12.2200000 - 247 247 1 0.0000000 6.7890000 20.3660000 14.9350000 - 248 248 1 0.0000000 9.5040000 20.3660000 12.2200000 - 249 249 1 0.0000000 5.4310000 16.2930000 16.2930000 - 250 250 1 0.0000000 5.4310000 19.0080000 19.0080000 - 251 251 1 0.0000000 8.1460000 19.0080000 16.2930000 - 252 252 1 0.0000000 8.1460000 16.2930000 19.0080000 - 253 253 1 0.0000000 9.5040000 17.6510000 20.3660000 - 254 254 1 0.0000000 6.7890000 17.6510000 17.6510000 - 255 255 1 0.0000000 6.7890000 20.3660000 20.3660000 - 256 256 1 0.0000000 9.5040000 20.3660000 17.6510000 - 257 257 1 0.0000000 10.8620000 0.0000000 0.0000000 - 258 258 1 0.0000000 10.8620000 2.7150000 2.7150000 - 259 259 1 0.0000000 13.5770000 2.7150000 0.0000000 - 260 260 1 0.0000000 13.5770000 0.0000000 2.7150000 - 261 261 1 0.0000000 14.9350000 1.3580000 4.0730000 - 262 262 1 0.0000000 12.2200000 1.3580000 1.3580000 - 263 263 1 0.0000000 12.2200000 4.0730000 4.0730000 - 264 264 1 0.0000000 14.9350000 4.0730000 1.3580000 - 265 265 1 0.0000000 10.8620000 0.0000000 5.4310000 - 266 266 1 0.0000000 10.8620000 2.7150000 8.1460000 - 267 267 1 0.0000000 13.5770000 2.7150000 5.4310000 - 268 268 1 0.0000000 13.5770000 0.0000000 8.1460000 - 269 269 1 0.0000000 14.9350000 1.3580000 9.5040000 - 270 270 1 0.0000000 12.2200000 1.3580000 6.7890000 - 271 271 1 0.0000000 12.2200000 4.0730000 9.5040000 - 272 272 1 0.0000000 14.9350000 4.0730000 6.7890000 - 273 273 1 0.0000000 10.8620000 0.0000000 10.8620000 - 274 274 1 0.0000000 10.8620000 2.7150000 13.5770000 - 275 275 1 0.0000000 13.5770000 2.7150000 10.8620000 - 276 276 1 0.0000000 13.5770000 0.0000000 13.5770000 - 277 277 1 0.0000000 14.9350000 1.3580000 14.9350000 - 278 278 1 0.0000000 12.2200000 1.3580000 12.2200000 - 279 279 1 0.0000000 12.2200000 4.0730000 14.9350000 - 280 280 1 0.0000000 14.9350000 4.0730000 12.2200000 - 281 281 1 0.0000000 10.8620000 0.0000000 16.2930000 - 282 282 1 0.0000000 10.8620000 2.7150000 19.0080000 - 283 283 1 0.0000000 13.5770000 2.7150000 16.2930000 - 284 284 1 0.0000000 13.5770000 0.0000000 19.0080000 - 285 285 1 0.0000000 14.9350000 1.3580000 20.3660000 - 286 286 1 0.0000000 12.2200000 1.3580000 17.6510000 - 287 287 1 0.0000000 12.2200000 4.0730000 20.3660000 - 288 288 1 0.0000000 14.9350000 4.0730000 17.6510000 - 289 289 1 0.0000000 10.8620000 5.4310000 0.0000000 - 290 290 1 0.0000000 10.8620000 8.1460000 2.7150000 - 291 291 1 0.0000000 13.5770000 8.1460000 0.0000000 - 292 292 1 0.0000000 13.5770000 5.4310000 2.7150000 - 293 293 1 0.0000000 14.9350000 6.7890000 4.0730000 - 294 294 1 0.0000000 12.2200000 6.7890000 1.3580000 - 295 295 1 0.0000000 12.2200000 9.5040000 4.0730000 - 296 296 1 0.0000000 14.9350000 9.5040000 1.3580000 - 297 297 1 0.0000000 10.8620000 5.4310000 5.4310000 - 298 298 1 0.0000000 10.8620000 8.1460000 8.1460000 - 299 299 1 0.0000000 13.5770000 8.1460000 5.4310000 - 300 300 1 0.0000000 13.5770000 5.4310000 8.1460000 - 301 301 1 0.0000000 14.9350000 6.7890000 9.5040000 - 302 302 1 0.0000000 12.2200000 6.7890000 6.7890000 - 303 303 1 0.0000000 12.2200000 9.5040000 9.5040000 - 304 304 1 0.0000000 14.9350000 9.5040000 6.7890000 - 305 305 1 0.0000000 10.8620000 5.4310000 10.8620000 - 306 306 1 0.0000000 10.8620000 8.1460000 13.5770000 - 307 307 1 0.0000000 13.5770000 8.1460000 10.8620000 - 308 308 1 0.0000000 13.5770000 5.4310000 13.5770000 - 309 309 1 0.0000000 14.9350000 6.7890000 14.9350000 - 310 310 1 0.0000000 12.2200000 6.7890000 12.2200000 - 311 311 1 0.0000000 12.2200000 9.5040000 14.9350000 - 312 312 1 0.0000000 14.9350000 9.5040000 12.2200000 - 313 313 1 0.0000000 10.8620000 5.4310000 16.2930000 - 314 314 1 0.0000000 10.8620000 8.1460000 19.0080000 - 315 315 1 0.0000000 13.5770000 8.1460000 16.2930000 - 316 316 1 0.0000000 13.5770000 5.4310000 19.0080000 - 317 317 1 0.0000000 14.9350000 6.7890000 20.3660000 - 318 318 1 0.0000000 12.2200000 6.7890000 17.6510000 - 319 319 1 0.0000000 12.2200000 9.5040000 20.3660000 - 320 320 1 0.0000000 14.9350000 9.5040000 17.6510000 - 321 321 1 0.0000000 10.8620000 10.8620000 0.0000000 - 322 322 1 0.0000000 10.8620000 13.5770000 2.7150000 - 323 323 1 0.0000000 13.5770000 13.5770000 0.0000000 - 324 324 1 0.0000000 13.5770000 10.8620000 2.7150000 - 325 325 1 0.0000000 14.9350000 12.2200000 4.0730000 - 326 326 1 0.0000000 12.2200000 12.2200000 1.3580000 - 327 327 1 0.0000000 12.2200000 14.9350000 4.0730000 - 328 328 1 0.0000000 14.9350000 14.9350000 1.3580000 - 329 329 1 0.0000000 10.8620000 10.8620000 5.4310000 - 330 330 1 0.0000000 10.8620000 13.5770000 8.1460000 - 331 331 1 0.0000000 13.5770000 13.5770000 5.4310000 - 332 332 1 0.0000000 13.5770000 10.8620000 8.1460000 - 333 333 1 0.0000000 14.9350000 12.2200000 9.5040000 - 334 334 1 0.0000000 12.2200000 12.2200000 6.7890000 - 335 335 1 0.0000000 12.2200000 14.9350000 9.5040000 - 336 336 1 0.0000000 14.9350000 14.9350000 6.7890000 - 337 337 1 0.0000000 10.8620000 10.8620000 10.8620000 - 338 338 1 0.0000000 10.8620000 13.5770000 13.5770000 - 339 339 1 0.0000000 13.5770000 13.5770000 10.8620000 - 340 340 1 0.0000000 13.5770000 10.8620000 13.5770000 - 341 341 1 0.0000000 14.9350000 12.2200000 14.9350000 - 342 342 1 0.0000000 12.2200000 12.2200000 12.2200000 - 343 343 1 0.0000000 12.2200000 14.9350000 14.9350000 - 344 344 1 0.0000000 14.9350000 14.9350000 12.2200000 - 345 345 1 0.0000000 10.8620000 10.8620000 16.2930000 - 346 346 1 0.0000000 10.8620000 13.5770000 19.0080000 - 347 347 1 0.0000000 13.5770000 13.5770000 16.2930000 - 348 348 1 0.0000000 13.5770000 10.8620000 19.0080000 - 349 349 1 0.0000000 14.9350000 12.2200000 20.3660000 - 350 350 1 0.0000000 12.2200000 12.2200000 17.6510000 - 351 351 1 0.0000000 12.2200000 14.9350000 20.3660000 - 352 352 1 0.0000000 14.9350000 14.9350000 17.6510000 - 353 353 1 0.0000000 10.8620000 16.2930000 0.0000000 - 354 354 1 0.0000000 10.8620000 19.0080000 2.7150000 - 355 355 1 0.0000000 13.5770000 19.0080000 0.0000000 - 356 356 1 0.0000000 13.5770000 16.2930000 2.7150000 - 357 357 1 0.0000000 14.9350000 17.6510000 4.0730000 - 358 358 1 0.0000000 12.2200000 17.6510000 1.3580000 - 359 359 1 0.0000000 12.2200000 20.3660000 4.0730000 - 360 360 1 0.0000000 14.9350000 20.3660000 1.3580000 - 361 361 1 0.0000000 10.8620000 16.2930000 5.4310000 - 362 362 1 0.0000000 10.8620000 19.0080000 8.1460000 - 363 363 1 0.0000000 13.5770000 19.0080000 5.4310000 - 364 364 1 0.0000000 13.5770000 16.2930000 8.1460000 - 365 365 1 0.0000000 14.9350000 17.6510000 9.5040000 - 366 366 1 0.0000000 12.2200000 17.6510000 6.7890000 - 367 367 1 0.0000000 12.2200000 20.3660000 9.5040000 - 368 368 1 0.0000000 14.9350000 20.3660000 6.7890000 - 369 369 1 0.0000000 10.8620000 16.2930000 10.8620000 - 370 370 1 0.0000000 10.8620000 19.0080000 13.5770000 - 371 371 1 0.0000000 13.5770000 19.0080000 10.8620000 - 372 372 1 0.0000000 13.5770000 16.2930000 13.5770000 - 373 373 1 0.0000000 14.9350000 17.6510000 14.9350000 - 374 374 1 0.0000000 12.2200000 17.6510000 12.2200000 - 375 375 1 0.0000000 12.2200000 20.3660000 14.9350000 - 376 376 1 0.0000000 14.9350000 20.3660000 12.2200000 - 377 377 1 0.0000000 10.8620000 16.2930000 16.2930000 - 378 378 1 0.0000000 10.8620000 19.0080000 19.0080000 - 379 379 1 0.0000000 13.5770000 19.0080000 16.2930000 - 380 380 1 0.0000000 13.5770000 16.2930000 19.0080000 - 381 381 1 0.0000000 14.9350000 17.6510000 20.3660000 - 382 382 1 0.0000000 12.2200000 17.6510000 17.6510000 - 383 383 1 0.0000000 12.2200000 20.3660000 20.3660000 - 384 384 1 0.0000000 14.9350000 20.3660000 17.6510000 - 385 385 1 0.0000000 16.2930000 0.0000000 0.0000000 - 386 386 1 0.0000000 16.2930000 2.7150000 2.7150000 - 387 387 1 0.0000000 19.0080000 2.7150000 0.0000000 - 388 388 1 0.0000000 19.0080000 0.0000000 2.7150000 - 389 389 1 0.0000000 20.3660000 1.3580000 4.0730000 - 390 390 1 0.0000000 17.6510000 1.3580000 1.3580000 - 391 391 1 0.0000000 17.6510000 4.0730000 4.0730000 - 392 392 1 0.0000000 20.3660000 4.0730000 1.3580000 - 393 393 1 0.0000000 16.2930000 0.0000000 5.4310000 - 394 394 1 0.0000000 16.2930000 2.7150000 8.1460000 - 395 395 1 0.0000000 19.0080000 2.7150000 5.4310000 - 396 396 1 0.0000000 19.0080000 0.0000000 8.1460000 - 397 397 1 0.0000000 20.3660000 1.3580000 9.5040000 - 398 398 1 0.0000000 17.6510000 1.3580000 6.7890000 - 399 399 1 0.0000000 17.6510000 4.0730000 9.5040000 - 400 400 1 0.0000000 20.3660000 4.0730000 6.7890000 - 401 401 1 0.0000000 16.2930000 0.0000000 10.8620000 - 402 402 1 0.0000000 16.2930000 2.7150000 13.5770000 - 403 403 1 0.0000000 19.0080000 2.7150000 10.8620000 - 404 404 1 0.0000000 19.0080000 0.0000000 13.5770000 - 405 405 1 0.0000000 20.3660000 1.3580000 14.9350000 - 406 406 1 0.0000000 17.6510000 1.3580000 12.2200000 - 407 407 1 0.0000000 17.6510000 4.0730000 14.9350000 - 408 408 1 0.0000000 20.3660000 4.0730000 12.2200000 - 409 409 1 0.0000000 16.2930000 0.0000000 16.2930000 - 410 410 1 0.0000000 16.2930000 2.7150000 19.0080000 - 411 411 1 0.0000000 19.0080000 2.7150000 16.2930000 - 412 412 1 0.0000000 19.0080000 0.0000000 19.0080000 - 413 413 1 0.0000000 20.3660000 1.3580000 20.3660000 - 414 414 1 0.0000000 17.6510000 1.3580000 17.6510000 - 415 415 1 0.0000000 17.6510000 4.0730000 20.3660000 - 416 416 1 0.0000000 20.3660000 4.0730000 17.6510000 - 417 417 1 0.0000000 16.2930000 5.4310000 0.0000000 - 418 418 1 0.0000000 16.2930000 8.1460000 2.7150000 - 419 419 1 0.0000000 19.0080000 8.1460000 0.0000000 - 420 420 1 0.0000000 19.0080000 5.4310000 2.7150000 - 421 421 1 0.0000000 20.3660000 6.7890000 4.0730000 - 422 422 1 0.0000000 17.6510000 6.7890000 1.3580000 - 423 423 1 0.0000000 17.6510000 9.5040000 4.0730000 - 424 424 1 0.0000000 20.3660000 9.5040000 1.3580000 - 425 425 1 0.0000000 16.2930000 5.4310000 5.4310000 - 426 426 1 0.0000000 16.2930000 8.1460000 8.1460000 - 427 427 1 0.0000000 19.0080000 8.1460000 5.4310000 - 428 428 1 0.0000000 19.0080000 5.4310000 8.1460000 - 429 429 1 0.0000000 20.3660000 6.7890000 9.5040000 - 430 430 1 0.0000000 17.6510000 6.7890000 6.7890000 - 431 431 1 0.0000000 17.6510000 9.5040000 9.5040000 - 432 432 1 0.0000000 20.3660000 9.5040000 6.7890000 - 433 433 1 0.0000000 16.2930000 5.4310000 10.8620000 - 434 434 1 0.0000000 16.2930000 8.1460000 13.5770000 - 435 435 1 0.0000000 19.0080000 8.1460000 10.8620000 - 436 436 1 0.0000000 19.0080000 5.4310000 13.5770000 - 437 437 1 0.0000000 20.3660000 6.7890000 14.9350000 - 438 438 1 0.0000000 17.6510000 6.7890000 12.2200000 - 439 439 1 0.0000000 17.6510000 9.5040000 14.9350000 - 440 440 1 0.0000000 20.3660000 9.5040000 12.2200000 - 441 441 1 0.0000000 16.2930000 5.4310000 16.2930000 - 442 442 1 0.0000000 16.2930000 8.1460000 19.0080000 - 443 443 1 0.0000000 19.0080000 8.1460000 16.2930000 - 444 444 1 0.0000000 19.0080000 5.4310000 19.0080000 - 445 445 1 0.0000000 20.3660000 6.7890000 20.3660000 - 446 446 1 0.0000000 17.6510000 6.7890000 17.6510000 - 447 447 1 0.0000000 17.6510000 9.5040000 20.3660000 - 448 448 1 0.0000000 20.3660000 9.5040000 17.6510000 - 449 449 1 0.0000000 16.2930000 10.8620000 0.0000000 - 450 450 1 0.0000000 16.2930000 13.5770000 2.7150000 - 451 451 1 0.0000000 19.0080000 13.5770000 0.0000000 - 452 452 1 0.0000000 19.0080000 10.8620000 2.7150000 - 453 453 1 0.0000000 20.3660000 12.2200000 4.0730000 - 454 454 1 0.0000000 17.6510000 12.2200000 1.3580000 - 455 455 1 0.0000000 17.6510000 14.9350000 4.0730000 - 456 456 1 0.0000000 20.3660000 14.9350000 1.3580000 - 457 457 1 0.0000000 16.2930000 10.8620000 5.4310000 - 458 458 1 0.0000000 16.2930000 13.5770000 8.1460000 - 459 459 1 0.0000000 19.0080000 13.5770000 5.4310000 - 460 460 1 0.0000000 19.0080000 10.8620000 8.1460000 - 461 461 1 0.0000000 20.3660000 12.2200000 9.5040000 - 462 462 1 0.0000000 17.6510000 12.2200000 6.7890000 - 463 463 1 0.0000000 17.6510000 14.9350000 9.5040000 - 464 464 1 0.0000000 20.3660000 14.9350000 6.7890000 - 465 465 1 0.0000000 16.2930000 10.8620000 10.8620000 - 466 466 1 0.0000000 16.2930000 13.5770000 13.5770000 - 467 467 1 0.0000000 19.0080000 13.5770000 10.8620000 - 468 468 1 0.0000000 19.0080000 10.8620000 13.5770000 - 469 469 1 0.0000000 20.3660000 12.2200000 14.9350000 - 470 470 1 0.0000000 17.6510000 12.2200000 12.2200000 - 471 471 1 0.0000000 17.6510000 14.9350000 14.9350000 - 472 472 1 0.0000000 20.3660000 14.9350000 12.2200000 - 473 473 1 0.0000000 16.2930000 10.8620000 16.2930000 - 474 474 1 0.0000000 16.2930000 13.5770000 19.0080000 - 475 475 1 0.0000000 19.0080000 13.5770000 16.2930000 - 476 476 1 0.0000000 19.0080000 10.8620000 19.0080000 - 477 477 1 0.0000000 20.3660000 12.2200000 20.3660000 - 478 478 1 0.0000000 17.6510000 12.2200000 17.6510000 - 479 479 1 0.0000000 17.6510000 14.9350000 20.3660000 - 480 480 1 0.0000000 20.3660000 14.9350000 17.6510000 - 481 481 1 0.0000000 16.2930000 16.2930000 0.0000000 - 482 482 1 0.0000000 16.2930000 19.0080000 2.7150000 - 483 483 1 0.0000000 19.0080000 19.0080000 0.0000000 - 484 484 1 0.0000000 19.0080000 16.2930000 2.7150000 - 485 485 1 0.0000000 20.3660000 17.6510000 4.0730000 - 486 486 1 0.0000000 17.6510000 17.6510000 1.3580000 - 487 487 1 0.0000000 17.6510000 20.3660000 4.0730000 - 488 488 1 0.0000000 20.3660000 20.3660000 1.3580000 - 489 489 1 0.0000000 16.2930000 16.2930000 5.4310000 - 490 490 1 0.0000000 16.2930000 19.0080000 8.1460000 - 491 491 1 0.0000000 19.0080000 19.0080000 5.4310000 - 492 492 1 0.0000000 19.0080000 16.2930000 8.1460000 - 493 493 1 0.0000000 20.3660000 17.6510000 9.5040000 - 494 494 1 0.0000000 17.6510000 17.6510000 6.7890000 - 495 495 1 0.0000000 17.6510000 20.3660000 9.5040000 - 496 496 1 0.0000000 20.3660000 20.3660000 6.7890000 - 497 497 1 0.0000000 16.2930000 16.2930000 10.8620000 - 498 498 1 0.0000000 16.2930000 19.0080000 13.5770000 - 499 499 1 0.0000000 19.0080000 19.0080000 10.8620000 - 500 500 1 0.0000000 19.0080000 16.2930000 13.5770000 - 501 501 1 0.0000000 20.3660000 17.6510000 14.9350000 - 502 502 1 0.0000000 17.6510000 17.6510000 12.2200000 - 503 503 1 0.0000000 17.6510000 20.3660000 14.9350000 - 504 504 1 0.0000000 20.3660000 20.3660000 12.2200000 - 505 505 1 0.0000000 16.2930000 16.2930000 16.2930000 - 506 506 1 0.0000000 16.2930000 19.0080000 19.0080000 - 507 507 1 0.0000000 19.0080000 19.0080000 16.2930000 - 508 508 1 0.0000000 19.0080000 16.2930000 19.0080000 - 509 509 1 0.0000000 20.3660000 17.6510000 20.3660000 - 510 510 1 0.0000000 17.6510000 17.6510000 17.6510000 - 511 511 1 0.0000000 17.6510000 20.3660000 20.3660000 - 512 512 1 0.0000000 20.3660000 20.3660000 17.6510000 - diff --git a/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_8.lmp b/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_8.lmp deleted file mode 100755 index 5066049895..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/lmp_bank/silicon_8.lmp +++ /dev/null @@ -1,29 +0,0 @@ -LAMMPS description - - 8 atoms - 0 bonds - 0 angles - 0 dihedrals - 0 impropers - - 1 atom types - 0 bond types - 0 angle types - 0 dihedral types - 0 improper types - - - 0.0000000 5.4310000 xlo xhi - 0.0000000 5.4310000 ylo yhi - 0.0000000 5.4310000 zlo zhi - - Atoms - - 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 - 2 2 1 0.0000000 1.3577500 1.3577500 1.3572000 - 3 3 1 0.0000000 2.7155000 2.7155000 0.0000000 - 4 4 1 0.0000000 4.0732500 4.0732500 1.3572000 - 5 5 1 0.0000000 2.7155000 0.0000000 2.7144000 - 6 6 1 0.0000000 4.0732500 1.3577500 4.0732500 - 7 7 1 0.0000000 0.0000000 2.7155000 2.7155000 - 8 8 1 0.0000000 1.3577500 4.0732500 4.0732500 diff --git a/examples/USER/phonon/third_order_command/silicon/results/out.silicon b/examples/USER/phonon/third_order_command/silicon/results/out.silicon deleted file mode 100755 index 0729dc549c..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/results/out.silicon +++ /dev/null @@ -1,58 +0,0 @@ -LAMMPS (16 Jul 2018) -Reading data file ... - orthogonal box = (0 0 0) to (5.431 5.431 5.431) - 2 by 2 by 1 MPI processor grid - reading atoms ... - 8 atoms -Finding 1-2 1-3 1-4 neighbors ... - special bond factors lj: 0 0 0 - special bond factors coul: 0 0 0 - 0 = max # of 1-2 neighbors - 0 = max # of 1-3 neighbors - 0 = max # of 1-4 neighbors - 1 = max # of special neighbors -Neighbor list info ... - update every 1 steps, delay 10 steps, check yes - max neighbors/atom: 2000, page size: 100000 - master list distance cutoff = 4 - ghost atom cutoff = 4 - binsize = 2, bins = 3 3 3 - 1 neighbor lists, perpetual/occasional/extra = 1 0 0 - (1) pair tersoff, perpetual - attributes: full, newton on - pair build: full/bin - stencil: full/bin/3d - bin: standard -Calculating Anharmonic Dynamical Matrix... -Third Order calculation took 0.043923 seconds -Finished Calculating Third Order Tensor -Loop time of 1.22619e+06 on 4 procs for 0 steps with 8 atoms - -0.0% 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.013707 | 0.016582 | 0.019588 | 2.2 | 0.00 -Bond | 8.1341e-05 | 8.7207e-05 | 9.3228e-05 | 0.0 | 0.00 -Neigh | 0 | 0 | 0 | 0.0 | 0.00 -Comm | 0.019285 | 0.022435 | 0.025684 | 2.0 | 0.00 -Output | 0 | 0 | 0 | 0.0 | 0.00 -Modify | 0 | 0 | 0 | 0.0 | 0.00 -Other | | 1.226e+06 | | |100.00 - -Nlocal: 2 ave 2 max 2 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Nghost: 56 ave 56 max 56 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -Neighs: 0 ave 0 max 0 min -Histogram: 4 0 0 0 0 0 0 0 0 0 -FullNghs: 32 ave 32 max 32 min -Histogram: 4 0 0 0 0 0 0 0 0 0 - -Total # of neighbors = 128 -Ave neighs/atom = 16 -Ave special neighs/atom = 0 -Neighbor list builds = 0 -Dangerous builds = 0 -Total wall time: 0:00:00 diff --git a/examples/USER/phonon/third_order_command/silicon/results/third_order b/examples/USER/phonon/third_order_command/silicon/results/third_order deleted file mode 100755 index 276896aa1f..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/results/third_order +++ /dev/null @@ -1,4608 +0,0 @@ -1 1 1 1 1 -0.08569589 0.16067980 137.35980742 -1 1 1 1 2 -74170.35399415 -67130.60762609 -67084.85673024 -1 1 1 1 3 -0.10711987 -0.00000000 -5.61308111 -1 1 1 1 4 74170.34328216 67130.75759390 -67084.54608262 -1 1 1 1 5 -0.00000000 -0.00000000 -15.01820557 -1 1 1 1 6 74116.35486843 -67012.24017136 67025.88724261 -1 1 1 1 7 -0.00000000 -0.00000000 1.11404663 -1 1 1 1 8 -74116.23703657 67011.98308368 67025.60873095 -1 1 1 2 1 -0.23566371 -0.27851166 329269.69018077 -1 1 1 2 2 -72106.38979127 -72095.95631608 -80899.99905481 -1 1 1 2 3 -0.05355993 -0.00000000 -11783.78540967 -1 1 1 2 4 72106.62545498 72096.21340376 -80900.41682229 -1 1 1 2 5 -0.03213596 -0.00000000 2960.49323056 -1 1 1 2 6 -71998.20943604 72010.66747675 -80803.98751664 -1 1 1 2 7 0.02142397 -0.00000000 2961.59656521 -1 1 1 2 8 71998.19872405 -72010.69961271 -80803.91253273 -1 1 1 3 1 141.59104222 329281.45194233 0.41776749 -1 1 1 3 2 -72074.53234237 -80911.53586465 -72064.09886718 -1 1 1 3 3 3.98485911 2969.85550707 0.02142397 -1 1 1 3 4 -72074.54305436 -80911.38589683 72064.09886718 -1 1 1 3 5 -9.64078817 -11781.34307667 0.02142397 -1 1 1 3 6 72006.30769810 -80801.86654325 72002.14073522 -1 1 1 3 7 0.14996782 2957.19393861 0.04284795 -1 1 1 3 8 72006.66119367 -80802.35929464 -72002.55850270 -1 2 1 1 1 -0.40705550 -0.47132742 329270.04367633 -1 2 1 1 2 -72106.28267140 -72095.84919621 -80899.90264692 -1 2 1 1 3 -0.01071199 0.02142397 -11783.93537749 -1 2 1 1 4 72106.66830293 72096.21340376 -80900.26685448 -1 2 1 1 5 0.02142397 -0.04284795 2960.53607851 -1 2 1 1 6 -71998.40225180 72010.90314046 -80804.15890843 -1 2 1 1 7 0.02142397 -0.00000000 2961.59656521 -1 2 1 1 8 71998.34869187 -72010.95670040 -80804.09463651 -1 2 1 2 1 -0.04284795 0.67485517 115.02531483 -1 2 1 2 2 -67122.33797224 -74173.02127888 -67083.27135618 -1 2 1 2 3 -0.02142397 -0.00000000 -9.94072380 -1 2 1 2 4 67121.93091674 74172.77490318 -67083.11067638 -1 2 1 2 5 0.05355993 0.06427192 9.89787585 -1 2 1 2 6 67020.89545674 -74109.38136498 67027.62258448 -1 2 1 2 7 0.02142397 0.05355993 -3.84560328 -1 2 1 2 8 -67020.63836905 74109.15641326 67027.31193686 -1 2 1 3 1 329282.72666877 112.65796573 -0.08569589 -1 2 1 3 2 -80915.37075594 -72065.54498540 -72064.36666685 -1 2 1 3 3 2970.09117078 3.04220427 0.14996782 -1 2 1 3 4 -80913.63541407 -72065.98417686 72064.89155420 -1 2 1 3 5 2958.71504075 -9.59794022 -0.14996782 -1 2 1 3 6 -80800.75249661 72013.73110499 -72002.46209482 -1 2 1 3 7 -11780.59323759 -2.52802890 -0.67485517 -1 2 1 3 8 -80801.13812814 72014.00961665 72002.82630238 -1 3 1 1 1 140.26275585 329282.54456499 0.53559934 -1 3 1 1 2 -72074.61803826 -80911.60013657 -72064.25954698 -1 3 1 1 3 3.90987520 2969.74838720 -0.02142397 -1 3 1 1 4 -72074.26454270 -80911.32162491 72063.88462744 -1 3 1 1 5 -9.58722823 -11781.32165269 0.04284795 -1 3 1 1 6 72007.00397725 -80802.53068643 72002.74060648 -1 3 1 1 7 0.06427192 2957.16180265 -0.00000000 -1 3 1 1 8 72007.17536904 -80802.77706213 -72002.90128628 -1 3 1 2 1 329282.94090850 111.04045572 0.63200722 -1 3 1 2 2 -80915.52072376 -72065.59854533 -72064.48449870 -1 3 1 2 3 2969.99476290 2.93508440 -0.04284795 -1 3 1 2 4 -80913.01411883 -72065.17006586 72064.14171512 -1 3 1 2 5 2958.13659346 -10.43347519 0.42847947 -1 3 1 2 6 -80801.11670417 72014.05246460 -72002.80487840 -1 3 1 2 7 -11780.50754169 -2.72084466 -0.54631133 -1 3 1 2 8 -80800.85961648 72016.01275819 72002.63348661 -1 3 1 3 1 0.29993563 0.22495172 -12.59729654 -1 3 1 3 2 -67096.11502842 -67094.33683860 -74102.86847698 -1 3 1 3 3 -0.02142397 -0.04284795 1.13547061 -1 3 1 3 4 67095.81509279 67094.12259887 -74102.69708519 -1 3 1 3 5 -0.01071199 0.02142397 6.64143185 -1 3 1 3 6 67033.98550467 -67031.45747577 74105.22511409 -1 3 1 3 7 0.06427192 0.04284795 -0.27851166 -1 3 1 3 8 -67033.98550467 67031.28608399 74105.19297812 -1 1 2 1 1 -74175.17438824 -72109.17490785 -72075.08936569 -1 1 2 1 2 74174.06034160 72107.35387009 72071.88648162 -1 1 2 1 3 -0.43919146 538.62012295 1558.31557547 -1 1 2 1 4 -0.35349557 -538.98433050 -1559.15111044 -1 1 2 1 5 -0.36420755 1559.70813376 538.94148255 -1 1 2 1 6 -0.12854384 -1560.65078860 -539.26284216 -1 1 2 1 7 -9470.57469669 -3063.11406462 -3059.55768498 -1 1 2 1 8 9472.97418175 3066.31694869 3063.78891979 -1 1 2 2 1 -67136.04931541 -72094.55304580 -80912.33926366 -1 1 2 2 2 72108.78927633 67119.37075188 80912.66062327 -1 1 2 2 3 0.12854384 -537.80601195 3074.38307479 -1 1 2 2 4 538.66297089 -0.51417537 -3074.31880286 -1 1 2 2 5 -888.64500536 3068.44863407 94.71538776 -1 1 2 2 6 -1558.04777580 -0.68556716 -3077.83233455 -1 1 2 2 7 -1.34971034 1557.43719255 3075.86132897 -1 1 2 2 8 -3063.41400025 888.27008582 -93.10858973 -1 1 2 3 1 -67090.58764320 -80900.65248600 -72062.44922120 -1 1 2 3 2 72070.46178737 80911.33233690 67094.67962218 -1 1 2 3 3 -893.59394329 83.29640977 3055.78706561 -1 1 2 3 4 -1559.26894230 -3074.61873850 -0.59987126 -1 1 2 3 5 0.09640788 3080.91738677 -536.26348584 -1 1 2 3 6 535.97426219 -3081.11020253 0.40705550 -1 1 2 3 7 2.59230082 3075.91488891 1559.82596561 -1 1 2 3 8 -3065.72778941 -94.97247544 888.65571735 -1 2 2 1 1 -72106.94681459 -67126.03360770 -80913.12123870 -1 2 2 1 2 67141.76951639 72094.19955023 80912.06075200 -1 2 2 1 3 -539.33782607 0.81411100 3074.21168300 -1 2 2 1 4 -0.52488736 538.66297089 -3074.36165081 -1 2 2 1 5 1559.22609435 1.82103777 3080.51033127 -1 2 2 1 6 888.24866185 -3063.37115230 -93.06574178 -1 2 2 1 7 3058.20797464 -887.99157416 91.65175952 -1 2 2 1 8 -0.68556716 -1558.01563984 -3077.80019859 -1 2 2 2 1 -72096.51333939 -74176.32057083 -72068.06230231 -1 2 2 2 2 72097.11321066 74179.99478232 72069.75479623 -1 2 2 2 3 539.58420176 0.83553497 1559.92237350 -1 2 2 2 4 -539.03789043 -0.38563153 -1559.19395839 -1 2 2 2 5 -3068.12727446 -9477.28040046 -3066.73471617 -1 2 2 2 6 3066.27410074 9473.03845367 3063.79963178 -1 2 2 2 7 1561.40062768 0.28922365 539.62704971 -1 2 2 2 8 -1560.62936463 -0.13925583 -539.18785825 -1 2 2 3 1 -80898.98141606 -67086.42068032 -72061.12093483 -1 2 2 3 2 80909.30777138 72063.89533942 67096.43638803 -1 2 2 3 3 82.96433818 -893.33685560 3055.82991356 -1 2 2 3 4 -3074.65087446 -1559.32250223 -0.51417537 -1 2 2 3 5 3079.44984457 2.18524532 1557.22295281 -1 2 2 3 6 -94.92962749 -3065.77063736 888.60215741 -1 2 2 3 7 3077.91803045 2.61372479 -536.88478108 -1 2 2 3 8 -3081.11020253 535.98497418 0.33207159 -1 3 2 1 1 -72074.61803826 -80912.03932803 -67095.49373318 -1 3 2 1 2 67095.17237358 80902.98769914 72062.60990100 -1 3 2 1 3 1560.09376528 3074.55446658 0.55702332 -1 3 2 1 4 893.75462309 -83.27498580 -3055.65852177 -1 3 2 1 5 -535.98497418 3081.32444227 0.36420755 -1 3 2 1 6 -1.04977471 -3079.24631682 536.43487763 -1 3 2 1 7 3063.56396806 94.23334835 -889.21274066 -1 3 2 1 8 -1.07119869 -3078.63573357 -1559.47247005 -1 3 2 2 1 -80910.85029749 -72067.94447046 -67097.26121101 -1 3 2 2 2 80903.20193888 67084.63177851 72063.35974008 -1 3 2 2 3 3074.38307479 1558.70120699 0.29993563 -1 3 2 2 4 -83.26427381 893.74391110 -3055.63709779 -1 3 2 2 5 95.32597101 3067.67737102 -887.93801423 -1 3 2 2 6 -3078.63573357 -1.07119869 -1559.49389402 -1 3 2 2 7 3079.13919695 -534.68882377 0.25708768 -1 3 2 2 8 -3079.24631682 -1.03906272 536.42416564 -1 3 2 3 1 -72064.05601923 -72064.52734665 -74113.78399158 -1 3 2 3 2 72063.22048425 72066.00560083 74113.03415250 -1 3 2 3 3 -3055.10149845 -3055.55140190 -9478.75865465 -1 3 2 3 4 3055.31573819 3055.31573819 9478.65153478 -1 3 2 3 5 539.07002640 1555.42333902 -1.69249392 -1 3 2 3 6 -538.30947533 -1556.36599386 2.82796453 -1 3 2 3 7 1556.32314591 538.11665957 -3.12790016 -1 3 2 3 8 -1556.38741783 -538.30947533 2.82796453 -1 1 3 1 1 -0.04284795 -0.11783186 8.28036584 -1 1 3 1 2 -0.59987126 -0.00000000 -897.62165034 -1 1 3 1 3 0.01071199 0.02142397 8.03399014 -1 1 3 1 4 0.71770312 -0.08569589 -897.27886676 -1 1 3 1 5 0.05355993 0.04284795 2.27094121 -1 1 3 1 6 -0.68556716 -0.10711987 887.72377449 -1 1 3 1 7 -0.02142397 -0.00000000 1.26401445 -1 1 3 1 8 0.66414318 0.06427192 887.68092654 -1 1 3 2 1 -0.02142397 0.08569589 2968.58078064 -1 1 3 2 2 538.32018732 -538.32018732 85.43880714 -1 1 3 2 3 0.01071199 0.02142397 2968.54864468 -1 1 3 2 4 -538.30947533 538.32018732 85.52450304 -1 1 3 2 5 -0.06427192 -0.06427192 -3372.04776546 -1 1 3 2 6 538.38445924 538.25591539 89.29512241 -1 1 3 2 7 0.02142397 0.02142397 -2914.08890352 -1 1 3 2 8 -538.27733937 -538.30947533 89.25227446 -1 1 3 3 1 -6.23437635 -11785.64929538 -0.03213596 -1 1 3 3 2 1558.93687070 3074.91867413 3058.37936643 -1 1 3 3 3 5.55952118 2970.56249821 -0.04284795 -1 1 3 3 4 1559.02256660 3074.85440221 -3058.22939861 -1 1 3 3 5 0.74983908 -2915.35291796 -0.00000000 -1 1 3 3 6 -1559.30107826 3076.86825574 -3062.21425772 -1 1 3 3 7 0.62129524 -573.29482439 -0.01071199 -1 1 3 3 8 -1559.38677415 3076.90039170 3062.23568169 -1 2 3 1 1 -0.04284795 0.05355993 2968.54864468 -1 2 3 1 2 -539.11287434 538.98433050 85.03175164 -1 2 3 1 3 0.03213596 -0.02142397 2968.54864468 -1 2 3 1 4 539.09145037 -539.02717845 85.09602356 -1 2 3 1 5 0.01071199 0.02142397 -2914.00320762 -1 2 3 1 6 -537.57034824 -537.63462016 89.59505804 -1 2 3 1 7 0.02142397 -0.00000000 -3372.06918943 -1 2 3 1 8 537.61319618 537.57034824 89.45580221 -1 2 3 2 1 -0.02142397 -0.08569589 8.09826206 -1 2 3 2 2 0.04284795 0.68556716 -897.55737842 -1 2 3 2 3 0.04284795 -0.00000000 8.29107782 -1 2 3 2 4 -0.04284795 -0.66414318 -897.45025855 -1 2 3 2 5 -0.09640788 0.06427192 2.22809327 -1 2 3 2 6 -0.12854384 -0.66414318 887.76662244 -1 2 3 2 7 -0.00000000 -0.04284795 1.24259047 -1 2 3 2 8 0.12854384 0.57844729 887.45597482 -1 2 3 3 1 -11785.58502346 -11.39755401 0.05355993 -1 2 3 3 2 3074.81155426 1560.56509271 3058.33651848 -1 2 3 3 3 2970.42324238 5.74162495 -0.02142397 -1 2 3 3 4 3074.92938612 1560.54366873 -3058.18655066 -1 2 3 3 5 -573.21984048 -0.64271921 -0.04284795 -1 2 3 3 6 3076.93252766 -1557.95136791 3062.29995362 -1 2 3 3 7 -2915.35291796 0.93194286 0.03213596 -1 2 3 3 8 3076.99679958 -1557.88709599 -3062.38564951 -1 3 3 1 1 5.84874482 2970.57321019 -0.05355993 -1 3 3 1 2 1560.52224476 3074.89725015 -3058.31509451 -1 3 3 1 3 -11.38684202 -11785.64929538 0.02142397 -1 3 3 1 4 1560.46868482 3074.89725015 3058.22939861 -1 3 3 1 5 -0.64271921 -573.24126446 -0.04284795 -1 3 3 1 6 -1557.92994394 3076.95395163 3062.29995362 -1 3 3 1 7 0.87838292 -2915.31007002 0.01071199 -1 3 3 1 8 -1557.84424805 3077.00751156 -3062.35351355 -1 3 3 2 1 2970.51965026 5.62379310 0.02142397 -1 3 3 2 2 3075.02579400 1559.04399057 -3058.50791027 -1 3 3 2 3 -11785.63858339 -6.36292019 -0.02142397 -1 3 3 2 4 3074.98294605 1559.00114263 3058.40079040 -1 3 3 2 5 -2915.36362995 0.68556716 0.02142397 -1 3 3 2 6 3076.86825574 -1559.45104607 -3062.29995362 -1 3 3 2 7 -573.30553638 0.65343120 0.07498391 -1 3 3 2 8 3076.82540779 -1559.41891011 3062.05357792 -1 3 3 3 1 0.02142397 -0.02142397 3.99557110 -1 3 3 3 2 0.12854384 -0.14996782 -9480.12978896 -1 3 3 3 3 0.01071199 -0.04284795 4.11340295 -1 3 3 3 4 -0.11783186 0.21423974 -9480.02266909 -1 3 3 3 5 -0.03213596 -0.04284795 2.63514877 -1 3 3 3 6 0.17139179 0.17139179 9473.93826056 -1 3 3 3 7 -0.04284795 -0.01071199 1.81032578 -1 3 3 3 8 -0.12854384 -0.18210378 9473.88470063 -1 1 4 1 1 74175.53859579 72109.64623527 -72075.37858933 -1 1 4 1 2 0.38563153 539.01646646 -1559.19395839 -1 1 4 1 3 0.43919146 -538.55585103 1558.25130355 -1 1 4 1 4 -74174.42454916 -72107.78234956 72072.32567308 -1 1 4 1 5 0.35349557 -1559.70813376 538.96290653 -1 1 4 1 6 -9473.02774168 -3066.32766067 3063.77820780 -1 1 4 1 7 9470.57469669 3063.09264064 -3059.56839697 -1 1 4 1 8 0.12854384 1560.64007661 -539.19857024 -1 1 4 2 1 67136.69203462 72095.08864514 -80912.77845512 -1 1 4 2 2 -538.66297089 0.54631133 -3074.35093883 -1 1 4 2 3 -0.11783186 537.82743592 3074.51161863 -1 1 4 2 4 -72109.31416368 -67119.98133513 80913.20693460 -1 1 4 2 5 888.67714132 -3068.49148202 94.73681173 -1 1 4 2 6 3063.40328826 -888.25937383 -93.10858973 -1 1 4 2 7 1.32828637 -1557.45861652 3075.82919301 -1 1 4 2 8 1558.01563984 0.65343120 -3077.82162257 -1 1 4 3 1 -67090.65191512 -80900.84530177 72062.58847703 -1 1 4 3 2 -1559.32250223 -3074.66158644 0.51417537 -1 1 4 3 3 -893.62607925 83.29640977 -3055.78706561 -1 1 4 3 4 72070.57961922 80911.49301670 -67094.76531808 -1 1 4 3 5 0.07498391 3080.85311485 536.26348584 -1 1 4 3 6 -3065.74921338 -94.95105147 -888.66642933 -1 1 4 3 7 2.59230082 3075.91488891 -1559.81525363 -1 1 4 3 8 535.96355021 -3081.13162650 -0.33207159 -1 2 4 1 1 72107.56810982 67126.64419095 -80913.82822983 -1 2 4 1 2 0.53559934 -538.63083493 -3074.35093883 -1 2 4 1 3 539.32711408 -0.79268703 3074.16883505 -1 2 4 1 4 -67142.43365957 -72094.82084547 80912.58563936 -1 2 4 1 5 -1559.23680634 -1.79961379 3080.44605934 -1 2 4 1 6 0.68556716 1558.03706381 -3077.81091058 -1 2 4 1 7 -3058.22939861 888.00228615 91.66247150 -1 2 4 1 8 -888.25937383 3063.38186429 -93.10858973 -1 2 4 2 1 72096.32052363 74176.06348314 -72067.88019853 -1 2 4 2 2 539.00575447 0.38563153 -1559.21538236 -1 2 4 2 3 -539.56277779 -0.83553497 1560.00806939 -1 2 4 2 4 -72096.73829112 -74179.71627066 72069.56198047 -1 2 4 2 5 3068.15941042 9477.28040046 -3066.62759630 -1 2 4 2 6 1560.67221257 0.08569589 -539.17714626 -1 2 4 2 7 -1561.46489960 -0.25708768 539.63776170 -1 2 4 2 8 -3066.32766067 -9473.00631771 3063.81034376 -1 2 4 3 1 -80898.55293658 -67086.00291283 72060.77815125 -1 2 4 3 2 -3074.66158644 -1559.30107826 0.52488736 -1 2 4 3 3 82.97505016 -893.35827957 -3055.91560945 -1 2 4 3 4 80908.90071588 72063.49899591 -67096.11502842 -1 2 4 3 5 3079.44984457 2.18524532 -1557.20152883 -1 2 4 3 6 -3081.11020253 535.98497418 -0.29993563 -1 2 4 3 7 3077.91803045 2.60301281 536.90620505 -1 2 4 3 8 -94.95105147 -3065.73850140 -888.68785331 -1 3 4 1 1 -72074.72515813 -80912.17858386 67095.54729312 -1 3 4 1 2 893.78675905 -83.20000189 3055.80848958 -1 3 4 1 3 1560.10447727 3074.55446658 -0.51417537 -1 3 4 1 4 67095.30091742 80903.13766695 -72062.59918902 -1 3 4 1 5 -535.98497418 3081.32444227 -0.29993563 -1 3 4 1 6 -1.08191067 -3078.64644555 1559.45104607 -1 3 4 1 7 3063.58539204 94.23334835 889.22345265 -1 3 4 1 8 -1.09262266 -3079.24631682 -536.45630160 -1 3 4 2 1 -80910.78602557 -72067.71951873 67097.07910724 -1 3 4 2 2 -83.18928990 893.78675905 3055.80848958 -1 3 4 2 3 3074.40449876 1558.70120699 -0.34278358 -1 3 4 2 4 80903.01983510 67084.28899493 -72063.26333220 -1 3 4 2 5 95.28312306 3067.72021896 887.87374231 -1 3 4 2 6 -3079.25702880 -1.09262266 -536.43487763 -1 3 4 2 7 3079.16062092 -534.65668781 -0.28922365 -1 3 4 2 8 -3078.60359761 -1.07119869 1559.44033409 -1 3 4 3 1 72063.67038770 72064.06673121 -74113.23768025 -1 3 4 3 2 -3055.27289024 -3055.28360223 9478.69438273 -1 3 4 3 3 3055.10149845 3055.52997792 -9478.73723067 -1 3 4 3 4 -72062.68488491 -72065.59854533 74112.61638501 -1 3 4 3 5 -539.04860242 -1555.38049107 -1.75676584 -1 3 4 3 6 1556.38741783 538.34161129 2.87081248 -1 3 4 3 7 -1556.32314591 -538.12737155 -3.14932413 -1 3 4 3 8 538.36303526 1556.38741783 2.82796453 -1 1 5 1 1 -0.04284795 0.12854384 -9.14803677 -1 1 5 1 2 -0.85695895 -890.25180339 -0.25708768 -1 1 5 1 3 -0.04284795 -0.04284795 0.94265484 -1 1 5 1 4 0.83553497 890.23037941 -0.08569589 -1 1 5 1 5 -0.01071199 -0.02142397 13.26143972 -1 1 5 1 6 -0.55702332 -889.58766020 -2.52802890 -1 1 5 1 7 0.02142397 0.02142397 0.41776749 -1 1 5 1 8 0.53559934 889.57694822 -2.50660492 -1 1 5 2 1 -0.04284795 -0.02142397 -11786.34557453 -1 1 5 2 2 1560.77933244 3069.28416904 3081.34586624 -1 1 5 2 3 0.01071199 -0.06427192 -2915.33149399 -1 1 5 2 4 -1560.81146840 -3069.32701699 3081.62437790 -1 1 5 2 5 -0.05355993 0.02142397 2966.14915962 -1 1 5 2 6 1558.05848778 -3056.34408893 3073.69750763 -1 1 5 2 7 0.10711987 -0.04284795 -574.38744705 -1 1 5 2 8 -1558.07991176 3056.32266495 3073.71893160 -1 1 5 3 1 -12.89723217 2960.13973500 -0.01071199 -1 1 5 3 2 538.34161129 94.00839662 -536.54199750 -1 1 5 3 3 1.45683021 -3372.02634149 0.12854384 -1 1 5 3 4 538.25591539 93.98697265 536.71338929 -1 1 5 3 5 14.45047026 2963.40689099 -0.02142397 -1 1 5 3 6 -539.51992984 87.23842093 536.11351802 -1 1 5 3 7 -0.47132742 -2914.42097511 0.07498391 -1 1 5 3 8 -539.51992984 87.42052471 -536.00639816 -1 2 5 1 1 -0.00000000 0.07498391 2959.63627162 -1 2 5 1 2 1560.45797284 -3069.54125673 3080.44605934 -1 2 5 1 3 0.06427192 -0.00000000 -573.09129664 -1 2 5 1 4 -1560.52224476 3069.45556083 3080.29609153 -1 2 5 1 5 0.01071199 -0.02142397 -11776.30844285 -1 2 5 1 6 1553.10954986 3059.40771717 3071.89789384 -1 2 5 1 7 -0.02142397 -0.00000000 -2914.77447067 -1 2 5 1 8 -1553.08812588 -3059.43985313 3071.76934999 -1 2 5 2 1 -0.00000000 -0.04284795 -8.79454121 -1 2 5 2 2 0.89980690 -9474.64525169 0.83553497 -1 2 5 2 3 0.02142397 -0.04284795 -0.25708768 -1 2 5 2 4 -0.86767094 9474.60240375 0.98550279 -1 2 5 2 5 0.08569589 0.02142397 13.41140754 -1 2 5 2 6 -0.06427192 -9456.17778636 -3.12790016 -1 2 5 2 7 0.04284795 0.03213596 -0.11783186 -1 2 5 2 8 -0.06427192 9456.22063431 -2.93508440 -1 2 5 3 1 2960.70747030 14.27907848 0.02142397 -1 2 5 3 2 3081.15305048 -3068.66287381 1558.33699944 -1 2 5 3 3 -2913.87466378 2.05670148 0.02142397 -1 2 5 3 4 3081.18518644 -3068.62002586 -1558.12275970 -1 2 5 3 5 -11774.21960541 16.62500360 0.02142397 -1 2 5 3 6 3069.88404031 3053.00194903 1560.52224476 -1 2 5 3 7 -574.69809467 -1.49967816 0.01071199 -1 2 5 3 8 3069.88404031 3053.05550896 -1560.61865264 -1 3 5 1 1 -12.49017667 2960.33255076 -0.07498391 -1 3 5 1 2 -536.09209405 94.73681173 538.32018732 -1 3 5 1 3 -0.23566371 -2914.62450286 -0.02142397 -1 3 5 1 4 -536.08138206 94.86535557 -538.42730718 -1 3 5 1 5 16.60357962 2963.59970675 -0.10711987 -1 3 5 1 6 534.72095973 87.49550862 -537.61319618 -1 3 5 1 7 -1.15689458 -3373.67598746 -0.03213596 -1 3 5 1 8 534.69953576 87.46337266 537.66675612 -1 3 5 2 1 -11787.12754957 -8.03399014 0.01071199 -1 3 5 2 2 3081.77434571 3069.28416904 1556.34456989 -1 3 5 2 3 -572.91990485 0.87838292 -0.02142397 -1 3 5 2 4 3081.74220975 3069.32701699 -1556.32314591 -1 3 5 2 5 2963.80323450 -7.96971822 0.10711987 -1 3 5 2 6 3074.42592273 -3061.35729877 1557.22295281 -1 3 5 2 7 -2916.01706115 -0.79268703 0.03213596 -1 3 5 2 8 3074.34022684 -3061.43228268 -1557.42648056 -1 3 5 3 1 -0.02142397 0.06427192 8.23751789 -1 3 5 3 2 -0.12854384 -886.35264017 -2.12097340 -1 3 5 3 3 -0.03213596 -0.06427192 2.54945287 -1 3 5 3 4 0.13925583 886.43833607 -2.22809327 -1 3 5 3 5 0.03213596 0.02142397 -10.17638751 -1 3 5 3 6 0.14996782 -891.38727399 3.04220427 -1 3 5 3 7 -0.00000000 -0.01071199 -2.17453333 -1 3 5 3 8 -0.14996782 891.26944214 2.83867652 -1 1 6 1 1 74116.23703657 -72002.14073522 72008.75003111 -1 1 6 1 2 0.40705550 -1558.13347169 535.67432656 -1 1 6 1 3 -1.28543842 538.64154692 -1558.85117481 -1 1 6 1 4 -9473.03845367 3064.52804688 -3066.00630107 -1 1 6 1 5 -1.07119869 1557.56573639 -539.66989766 -1 1 6 1 6 -74108.24589438 71998.04875624 -71998.13445213 -1 1 6 1 7 9466.48271771 -3061.73221831 3061.35729877 -1 1 6 1 8 0.44990345 -536.77766121 1556.92301718 -1 1 6 2 1 -67015.21810371 72015.84136640 -80796.89618135 -1 1 6 2 2 -1561.93622702 -1.75676584 -3081.76363373 -1 1 6 2 3 -0.53559934 538.51300308 3077.36100713 -1 1 6 2 4 -3066.00630107 -889.33057252 -95.12244326 -1 1 6 2 5 -891.70863360 -3053.55897234 86.12437430 -1 1 6 2 6 71998.32726790 -67051.53173914 80811.14312386 -1 1 6 2 7 0.42847947 -1557.60858433 3076.37550434 -1 1 6 2 8 536.67054134 -0.59987126 -3076.98608759 -1 1 6 3 1 67029.42219827 -80800.94531238 72003.74753324 -1 1 6 3 2 -540.03410521 -3079.38557265 -0.87838292 -1 1 6 3 3 888.95565298 90.49486493 -3062.77128104 -1 1 6 3 4 3063.40328826 -93.02289383 -888.83782112 -1 1 6 3 5 -1.48896617 3074.85440221 536.71338929 -1 1 6 3 6 -71997.32034113 80808.37943125 -67028.09391190 -1 1 6 3 7 -0.62129524 3076.85754375 -1559.46175806 -1 1 6 3 8 1557.69428023 -3077.28602322 -0.32135961 -1 2 6 1 1 -72004.24028464 67024.60180419 -80796.21061419 -1 2 6 1 2 889.39484444 3065.98487709 -95.07959531 -1 2 6 1 3 -537.82743592 0.36420755 3077.46812700 -1 2 6 1 4 1.75676584 1561.87195510 -3081.75292174 -1 2 6 1 5 1553.38806151 0.21423974 3070.18397594 -1 2 6 1 6 67035.54945475 -72006.46837791 80811.48590744 -1 2 6 1 7 3061.37872275 889.96257974 90.79480057 -1 2 6 1 8 0.59987126 -536.63840538 -3077.00751156 -1 2 6 2 1 72013.43116936 -74113.97680734 72014.96298348 -1 2 6 2 2 -3064.50662291 9473.03845367 -3065.95274113 -1 2 6 2 3 -537.93455579 -0.02142397 -1557.37292062 -1 2 6 2 4 1558.11204772 -0.40705550 535.68503855 -1 2 6 2 5 3057.04036807 -9458.66296731 3055.05865050 -1 2 6 2 6 -72005.10795558 74101.32595087 -72001.66940780 -1 2 6 2 7 -1557.77997612 -0.73912709 -537.59177221 -1 2 6 2 8 536.77766121 -0.43919146 1556.92301718 -1 2 6 3 1 -80801.90939119 67032.57152241 -72004.34740451 -1 2 6 3 2 -93.04431781 3063.43542422 888.84853311 -1 2 6 3 3 90.76266461 889.07348483 3062.79270501 -1 2 6 3 4 -3079.39628463 -540.05552919 0.87838292 -1 2 6 3 5 3072.65844490 -1.92815763 1561.37920371 -1 2 6 3 6 80810.32901286 -72001.45516806 67026.44426593 -1 2 6 3 7 3077.85375853 0.82482299 -536.22063789 -1 2 6 3 8 -3077.29673521 1557.70499222 0.35349557 -1 3 6 1 1 72007.60384851 -80795.10727954 67033.68556904 -1 3 6 1 2 -1.41398226 -3078.11084621 -538.18093149 -1 3 6 1 3 -1558.01563984 3077.59667084 0.34278358 -1 3 6 1 4 -2.82796453 -3080.16754769 1557.11583294 -1 3 6 1 5 536.20992591 3076.73971189 1.84246174 -1 3 6 1 6 -67028.08319992 80799.85268972 -72006.44695393 -1 3 6 1 7 -3061.97859401 91.86599925 890.54102703 -1 3 6 1 8 -891.51581784 -92.62655032 3061.14305904 -1 3 6 2 1 -80797.28181287 72014.55592798 -67032.51796247 -1 3 6 2 2 -3080.16754769 -2.82796453 -1557.07298499 -1 3 6 2 3 3077.28602322 -1559.83667760 -0.21423974 -1 3 6 2 4 -3078.13227018 -1.45683021 538.25591539 -1 3 6 2 5 89.83072175 -3058.57218219 -892.13711307 -1 3 6 2 6 80803.91253273 -67036.53495754 72005.35433127 -1 3 6 2 7 3077.12534342 536.01711014 -0.62129524 -1 3 6 2 8 -92.61583833 -891.49439386 -3061.14305904 -1 3 6 3 1 72000.76960090 -72000.16972964 74100.53326384 -1 3 6 3 2 536.32775776 -1559.33321422 2.37806108 -1 3 6 3 3 3063.01765673 -3062.57846527 9469.52492198 -1 3 6 3 4 1559.33321422 -536.32775776 2.35663711 -1 3 6 3 5 -536.91691704 1558.61551110 3.59922758 -1 3 6 3 6 -72003.52258152 72000.74817693 -74115.18726186 -1 3 6 3 7 -1557.73712818 537.81672393 2.24951724 -1 3 6 3 8 -3061.31445083 3061.36801076 -9465.42223101 -1 1 7 1 1 -0.10711987 -0.01071199 -5.12032972 -1 1 7 1 2 -9468.71081098 0.10711987 2.99935632 -1 1 7 1 3 -0.00000000 -0.00000000 0.53559934 -1 1 7 1 4 9468.73223495 -0.00000000 2.99935632 -1 1 7 1 5 0.05355993 -0.02142397 -0.19281576 -1 1 7 1 6 9470.91748027 0.92123087 -0.85695895 -1 1 7 1 7 -0.02142397 0.03213596 0.44990345 -1 1 7 1 8 -9470.85320835 -0.80339901 -0.84624696 -1 1 7 2 1 -0.00000000 -0.04284795 2957.22607457 -1 1 7 2 2 -3063.56396806 1556.47311373 3075.77563308 -1 1 7 2 3 0.01071199 -0.06427192 -573.32696035 -1 1 7 2 4 3063.56396806 -1556.53738565 3075.68993718 -1 1 7 2 5 -0.00000000 -0.06427192 -2914.26029531 -1 1 7 2 6 -3061.01451519 -1557.18010486 3076.39692831 -1 1 7 2 7 -0.00000000 0.07498391 -11773.68400607 -1 1 7 2 8 3061.03593917 1557.23366480 3076.37550434 -1 1 7 3 1 -1.04977471 2959.47559181 0.04284795 -1 1 7 3 2 -3058.85069385 3075.02579400 1559.60101389 -1 1 7 3 3 0.29993563 -2913.63900007 0.02142397 -1 1 7 3 4 -3058.91496577 3075.04721797 -1559.49389402 -1 1 7 3 5 0.48203941 -574.78379056 -0.00000000 -1 1 7 3 6 3060.60745969 3075.98987281 -1559.06541455 -1 1 7 3 7 -3.06362824 -11773.01986288 0.02142397 -1 1 7 3 8 3060.58603572 3075.97916083 1559.27965428 -1 2 7 1 1 -0.10711987 -0.03213596 -11783.72113775 -1 2 7 1 2 3060.50033982 1561.37920371 3077.55382289 -1 2 7 1 3 0.04284795 0.04284795 -2915.07440631 -1 2 7 1 4 -3060.44677989 -1561.40062768 3077.46812700 -1 2 7 1 5 0.03213596 -0.00000000 -574.65524672 -1 2 7 1 6 3060.82169943 -1557.45861652 3077.57524687 -1 2 7 1 7 0.04284795 -0.09640788 2963.47116291 -1 2 7 1 8 -3060.84312340 1557.54431241 3077.50026296 -1 2 7 2 1 -0.00000000 0.01071199 -2.18524532 -1 2 7 2 2 -888.96636496 0.55702332 2.37806108 -1 2 7 2 3 0.03213596 0.08569589 0.83553497 -1 2 7 2 4 888.97707695 -0.55702332 2.52802890 -1 2 7 2 5 -0.00000000 0.04284795 -1.97100558 -1 2 7 2 6 888.60215741 -0.89980690 0.21423974 -1 2 7 2 7 -0.08569589 -0.00000000 -1.89602167 -1 2 7 2 8 -888.62358139 0.88909491 0.26779967 -1 2 7 3 1 2962.01433270 -2.46375698 -0.12854384 -1 2 7 3 2 89.68075393 539.79844150 -536.49914955 -1 2 7 3 3 -3371.56572605 0.44990345 -0.00000000 -1 2 7 3 4 89.60577003 539.69132163 536.62769339 -1 2 7 3 5 -2914.09961550 0.04284795 -0.00000000 -1 2 7 3 6 89.63790599 -537.97740374 -536.15636597 -1 2 7 3 7 2965.29220067 -1.54252611 0.04284795 -1 2 7 3 8 89.55221009 -538.00953970 536.02782213 -1 3 7 1 1 -1.77818982 -11783.09984251 -0.00000000 -1 3 7 1 2 3062.98552077 3079.58910040 1556.38741783 -1 3 7 1 3 0.77126305 -573.54120009 0.08569589 -1 3 7 1 4 3062.95338481 3079.65337232 -1556.38741783 -1 3 7 1 5 -0.80339901 -2915.58858168 0.14996782 -1 3 7 1 6 -3061.20733096 3076.65401600 -1557.30864870 -1 3 7 1 7 -1.71391790 2959.94691923 0.02142397 -1 3 7 1 8 -3061.16448301 3076.60045606 1557.14796890 -1 3 7 2 1 2960.34326275 -1.67106995 -0.01071199 -1 3 7 2 2 91.99454309 -534.93519947 538.25591539 -1 3 7 2 3 -2914.64592683 0.72841511 -0.00000000 -1 3 7 2 4 91.96240713 -534.91377550 -538.06309963 -1 3 7 2 5 -3373.75097137 -1.11404663 0.08569589 -1 3 7 2 6 90.36632109 535.96355021 537.76316400 -1 3 7 2 7 2963.53543483 -0.08569589 0.02142397 -1 3 7 2 8 90.36632109 535.98497418 -537.92384380 -1 3 7 3 1 -0.02142397 -0.00000000 4.86324203 -1 3 7 3 2 -890.89452260 -0.10711987 -2.91366042 -1 3 7 3 3 -0.03213596 -0.04284795 2.18524532 -1 3 7 3 4 890.90523459 0.17139179 -2.82796453 -1 3 7 3 5 0.02142397 0.04284795 -2.48518095 -1 3 7 3 6 889.00921291 -0.14996782 1.97100558 -1 3 7 3 7 0.02142397 -0.04284795 -2.76369261 -1 3 7 3 8 -888.96636496 0.13925583 1.91744565 -1 1 8 1 1 -74116.62266810 72002.53707873 72009.10352667 -1 1 8 1 2 9473.05987764 -3064.52804688 -3065.97416511 -1 1 8 1 3 1.28543842 -538.62012295 -1558.87259878 -1 1 8 1 4 -0.41776749 1558.14418368 535.68503855 -1 1 8 1 5 1.00692676 -1557.63000831 -539.62704971 -1 1 8 1 6 -0.41776749 536.77766121 1556.98728910 -1 1 8 1 7 -9466.52556566 3061.68937036 3061.34658679 -1 1 8 1 8 74108.63152590 -71998.39153982 -71998.71289942 -1 1 8 2 1 67015.38949550 -72015.88421435 -80797.08899711 -1 1 8 2 2 3066.00630107 889.36270848 -95.13315524 -1 1 8 2 3 0.56773530 -538.55585103 3077.31815918 -1 1 8 2 4 1561.91480305 1.67106995 -3081.79576969 -1 1 8 2 5 891.70863360 3053.51612440 86.14579827 -1 1 8 2 6 -536.63840538 0.57844729 -3076.95395163 -1 1 8 2 7 -0.44990345 1557.65143228 3076.38621633 -1 1 8 2 8 -71998.52008366 67051.57458708 80811.05742797 -1 1 8 3 1 67029.10083867 -80800.48469694 -72003.19050993 -1 1 8 3 2 3063.39257627 -93.01218185 888.82710914 -1 1 8 3 3 888.99850093 90.55913686 3062.74985706 -1 1 8 3 4 -540.04481720 -3079.41770861 0.81411100 -1 1 8 3 5 -1.53181412 3074.76870631 -536.79908518 -1 1 8 3 6 1557.69428023 -3077.27531124 0.32135961 -1 1 8 3 7 -0.64271921 3076.84683176 1559.45104607 -1 1 8 3 8 -71997.02040550 80807.99379973 67027.80468826 -1 2 8 1 1 72004.28313259 -67024.49468432 -80796.04993438 -1 2 8 1 2 -1.73534187 -1561.94693901 -3081.76363373 -1 2 8 1 3 537.80601195 -0.38563153 3077.48955097 -1 2 8 1 4 -889.36270848 -3066.02772504 -95.10101928 -1 2 8 1 5 -1553.37734953 -0.27851166 3070.09828004 -1 2 8 1 6 -0.62129524 536.64911737 -3076.95395163 -1 2 8 1 7 -3061.31445083 -889.93044378 90.81622454 -1 2 8 1 8 -67035.54945475 72006.25413817 80811.43234751 -1 2 8 2 1 -72014.20243241 74114.51240669 72015.47715885 -1 2 8 2 2 -1558.14418368 0.41776749 535.66361458 -1 2 8 2 3 537.76316400 -0.06427192 -1557.28722473 -1 2 8 2 4 3064.53875887 -9473.01702969 -3065.98487709 -1 2 8 2 5 -3057.19033589 9458.79151115 3054.95153063 -1 2 8 2 6 -536.78837320 0.42847947 1557.00871307 -1 2 8 2 7 1556.85874526 0.08569589 -538.25591539 -1 2 8 2 8 72007.26106493 -74101.13313511 -72001.42303210 -1 2 8 3 1 -80801.50233569 67032.10019499 72003.81180517 -1 2 8 3 2 -3079.43913258 -540.07695316 -0.84624696 -1 2 8 3 3 90.75195262 889.07348483 -3062.79270501 -1 2 8 3 4 -93.02289383 3063.43542422 -888.81639715 -1 2 8 3 5 3072.60488497 -1.92815763 -1561.42205165 -1 2 8 3 6 -3077.27531124 1557.69428023 -0.29993563 -1 2 8 3 7 3077.81091058 0.83553497 536.22063789 -1 2 8 3 8 80809.98622928 -72001.19808037 -67025.84439466 -1 3 8 1 1 72007.94663209 -80795.42863915 -67033.99621666 -1 3 8 1 2 -2.82796453 -3080.16754769 -1557.09440897 -1 3 8 1 3 -1558.07991176 3077.55382289 -0.34278358 -1 3 8 1 4 -1.44611823 -3078.15369416 538.32018732 -1 3 8 1 5 536.27419783 3076.69686395 -1.90673366 -1 3 8 1 6 -891.52652982 -92.55156641 -3061.16448301 -1 3 8 1 7 -3061.93574606 91.88742323 -890.49817908 -1 3 8 1 8 -67028.43669548 80800.18476131 72006.76831354 -1 3 8 2 1 -80797.49605261 72014.83443964 67032.65721830 -1 3 8 2 2 -3078.11084621 -1.41398226 -538.19164347 -1 3 8 2 3 3077.30744720 -1559.79382965 0.17139179 -1 3 8 2 4 -3080.12469974 -2.82796453 1557.11583294 -1 3 8 2 5 89.78787380 -3058.57218219 892.22280897 -1 3 8 2 6 -92.57299038 -891.53724181 3061.20733096 -1 3 8 2 7 3077.12534342 536.01711014 0.65343120 -1 3 8 2 8 80804.13748446 -67036.68492536 -72005.84708267 -1 3 8 3 1 -72001.69083177 72000.93028070 74101.21883100 -1 3 8 3 2 -1559.32250223 536.32775776 2.39948506 -1 3 8 3 3 -3063.21047250 3062.49276938 9469.61061787 -1 3 8 3 4 -536.31704577 1559.34392621 2.33521313 -1 3 8 3 5 536.70267730 -1558.55123918 3.51353169 -1 3 8 3 6 3061.33587480 -3061.31445083 -9465.39009505 -1 3 8 3 7 1556.79447333 -538.44873116 1.58537405 -1 3 8 3 8 72005.69711485 -72000.76960090 -74115.17654987 -2 1 1 1 1 -74175.43147592 -72109.42128355 -72075.29289344 -2 1 1 1 2 74174.16746147 72107.66451771 72072.25068917 -2 1 1 1 3 -0.44990345 538.62012295 1558.31557547 -2 1 1 1 4 -0.38563153 -538.98433050 -1559.19395839 -2 1 1 1 5 -0.36420755 1559.72955773 539.00575447 -2 1 1 1 6 -0.13925583 -1560.62936463 -539.24141818 -2 1 1 1 7 -9470.57469669 -3063.15691256 -3059.60053293 -2 1 1 1 8 9472.99560572 3066.29552471 3063.75678383 -2 1 1 2 1 -72107.50383790 -67126.57991903 -80913.63541407 -2 1 1 2 2 67142.32653970 72094.79942150 80912.69275923 -2 1 1 2 3 -539.35925004 0.79268703 3074.21168300 -2 1 1 2 4 -0.52488736 538.66297089 -3074.38307479 -2 1 1 2 5 1559.23680634 1.79961379 3080.44605934 -2 1 1 2 6 888.25937383 -3063.39257627 -93.13001370 -2 1 1 2 7 3058.18655066 -887.94872621 91.65175952 -2 1 1 2 8 -0.68556716 -1557.99421586 -3077.84304654 -2 1 1 3 1 -72074.51091840 -80912.05004002 -67095.51515716 -2 1 1 3 2 67095.21522152 80902.98769914 72062.55634107 -2 1 1 3 3 1560.06162932 3074.55446658 0.53559934 -2 1 1 3 4 893.72248713 -83.25356182 -3055.63709779 -2 1 1 3 5 -536.00639816 3081.32444227 0.25708768 -2 1 1 3 6 -1.09262266 -3079.24631682 536.52057352 -2 1 1 3 7 3063.60681601 94.22263636 -889.20202868 -2 1 1 3 8 -1.11404663 -3078.61430959 -1559.44033409 -2 2 1 1 1 -67136.54206680 -72095.02437322 -80912.89628698 -2 2 1 1 2 72109.26060375 67119.83136731 80913.26049453 -2 2 1 1 3 0.13925583 -537.76316400 3074.46877068 -2 2 1 1 4 538.63083493 -0.51417537 -3074.34022684 -2 2 1 1 5 -888.67714132 3068.44863407 94.67253981 -2 2 1 1 6 -1558.04777580 -0.70699113 -3077.81091058 -2 2 1 1 7 -1.32828637 1557.44790453 3075.85061698 -2 2 1 1 8 -3063.41400025 888.24866185 -93.06574178 -2 2 1 2 1 -72096.40621952 -74176.12775507 -72067.75165469 -2 2 1 2 2 72096.74900310 74179.82339053 72069.50842054 -2 2 1 2 3 539.56277779 0.83553497 1560.05091734 -2 2 1 2 4 -538.98433050 -0.36420755 -1559.23680634 -2 2 1 2 5 -3068.15941042 -9477.25897649 -3066.69186823 -2 2 1 2 6 3066.30623670 9473.01702969 3063.77820780 -2 2 1 2 7 1561.42205165 0.23566371 539.62704971 -2 2 1 2 8 -1560.67221257 -0.13925583 -539.17714626 -2 2 1 3 1 -80910.72175365 -72067.80521463 -67097.01483532 -2 2 1 3 2 80903.07339503 67084.37469083 72063.07051644 -2 2 1 3 3 3074.41521075 1558.65835905 0.38563153 -2 2 1 3 4 -83.23213785 893.78675905 -3055.76564164 -2 2 1 3 5 95.28312306 3067.72021896 -887.89516628 -2 2 1 3 6 -3078.63573357 -1.09262266 -1559.47247005 -2 2 1 3 7 3079.16062092 -534.67811179 0.29993563 -2 2 1 3 8 -3079.22489284 -1.09262266 536.44558962 -2 3 1 1 1 -67090.71618705 -80900.89886170 -72062.63132498 -2 3 1 1 2 72070.67602710 80911.55728862 67094.80816602 -2 3 1 1 3 -893.60465527 83.31783374 3055.82991356 -2 3 1 1 4 -1559.30107826 -3074.68301042 -0.51417537 -2 3 1 1 5 0.05355993 3080.78884292 -536.26348584 -2 3 1 1 6 535.98497418 -3081.15305048 0.38563153 -2 3 1 1 7 2.59230082 3075.90417692 1559.79382965 -2 3 1 1 8 -3065.68494146 -94.96176345 888.66642933 -2 3 1 2 1 -80900.00976679 -67087.20265536 -72062.08501365 -2 3 1 2 2 80911.66440849 72064.10957916 67096.63991578 -2 3 1 2 3 82.79294639 -893.25115971 3055.78706561 -2 3 1 2 4 -3074.65087446 -1559.34392621 -0.51417537 -2 3 1 2 5 3079.28916476 2.07812545 1557.43719255 -2 3 1 2 6 -94.96176345 -3065.72778941 888.64500536 -2 3 1 2 7 3076.95395163 3.31000394 -536.24206187 -2 3 1 2 8 -3081.13162650 535.98497418 0.33207159 -2 3 1 3 1 -72064.22741102 -72064.68802645 -74113.93395940 -2 3 1 3 2 72063.41330002 72066.18770461 74113.30195217 -2 3 1 3 3 -3055.08007448 -3055.48712998 -9478.78007862 -2 3 1 3 4 3055.25146627 3055.23004229 9478.69438273 -2 3 1 3 5 539.02717845 1555.42333902 -1.73534187 -2 3 1 3 6 -538.32018732 -1556.40884181 2.84938850 -2 3 1 3 7 1556.32314591 538.10594758 -3.12790016 -2 3 1 3 8 -1556.36599386 -538.32018732 2.84938850 -2 1 2 1 1 74168.12590089 67132.22513610 67087.80252662 -2 1 2 1 2 112.32589414 -216.86417384 -124.98746260 -2 1 2 1 3 -74173.55687822 -67116.61777126 67078.07604256 -2 1 2 1 4 -1.77818982 5.63450508 6.59858390 -2 1 2 1 5 -74164.99800073 67112.22585665 -67087.88822252 -2 1 2 1 6 0.67485517 7.73405451 8.56958948 -2 1 2 1 7 74056.16421430 -66920.70624370 -66963.33995138 -2 1 2 1 8 2.95650837 -3.65278752 -4.61686633 -2 1 2 2 1 72106.96823856 72098.22725729 80899.65627123 -2 1 2 2 2 -223.10926218 223.90194920 -329274.64983068 -2 1 2 2 3 -72098.58075286 -72107.33244611 80900.26685448 -2 1 2 2 4 0.94265484 -0.83553497 11785.47790359 -2 1 2 2 5 72111.43513708 -72111.33872920 80901.83080456 -2 1 2 2 6 2.34592512 0.06427192 -2959.91478327 -2 1 2 2 7 -71899.86268474 71899.95909263 80707.23685139 -2 1 2 2 8 -0.08569589 -2.36734909 -2959.85051135 -2 1 2 3 1 72073.58968753 80913.77466990 72065.05223400 -2 1 2 3 2 -129.25083337 -329284.87977812 109.93712107 -2 1 2 3 3 72069.91547604 80913.33547844 -72064.80585831 -2 1 2 3 4 -4.45618653 -2968.84858031 8.54816551 -2 1 2 3 5 -72080.29539130 80898.51008863 -72064.18456307 -2 1 2 3 6 6.60929589 11783.18553841 1.22116650 -2 1 2 3 7 -71939.00428470 80702.24506551 71944.24244628 -2 1 2 3 8 2.91366042 -2957.46173828 -0.27851166 -2 2 2 1 1 72107.07535843 72098.53790491 80899.89193494 -2 2 2 1 2 -221.71670389 221.02042474 -329275.43180572 -2 2 2 1 3 -72098.35580113 -72107.09678240 80899.68840719 -2 2 2 1 4 0.74983908 -1.32828637 11785.19939193 -2 2 2 1 5 72110.97452164 -72110.84597780 80901.35947714 -2 2 2 1 6 1.10333465 -1.79961379 -2958.58649690 -2 2 2 1 7 -71900.09834845 71904.34029525 80707.24756337 -2 2 2 1 8 0.14996782 -2.78511658 -2959.80766341 -2 2 2 2 1 67116.29641165 74173.12839875 67077.72254699 -2 2 2 2 2 217.71042080 -112.00453454 -125.21241433 -2 2 2 2 3 -67132.45008783 -74168.27586870 67088.12388623 -2 2 2 2 4 -5.64521707 1.84246174 6.72712774 -2 2 2 2 5 -67112.09731280 74164.95515278 -67087.80252662 -2 2 2 2 6 3.51353169 -3.04220427 -4.62757832 -2 2 2 2 7 66920.43844403 -74055.76787078 -66963.14713561 -2 2 2 2 8 -7.81975040 -0.80339901 8.59101346 -2 2 2 3 1 80913.27120652 72067.65524681 72064.59161857 -2 2 2 3 2 -329283.26226811 -127.06558805 -110.50485638 -2 2 2 3 3 80914.07460553 72073.86819919 -72060.86384715 -2 2 2 3 4 -2970.25185059 -5.52738522 -10.28350738 -2 2 2 3 5 80898.42439274 -72080.25254335 72063.94889936 -2 2 2 3 6 -2958.29727326 4.04913103 -0.66414318 -2 2 2 3 7 80702.52357717 -71939.23994842 -71944.44597403 -2 2 2 3 8 11783.42120212 6.55573595 -1.66035796 -2 3 2 1 1 72073.86819919 80913.86036579 72065.34145765 -2 3 2 1 2 -125.65160579 -329281.95540571 105.93083799 -2 3 2 1 3 72066.89469574 80912.24285578 -72059.55698475 -2 3 2 1 4 -5.29172151 -2970.13401873 6.57715993 -2 3 2 1 5 -72080.32752726 80898.31727287 -72064.14171512 -2 3 2 1 6 6.70570377 11783.33550622 1.04977471 -2 3 2 1 7 -71941.01813823 80701.88085796 71944.09247846 -2 3 2 1 8 4.82039408 -2957.61170610 0.61058325 -2 3 2 2 1 80913.22835857 72069.79764418 72064.60233056 -2 3 2 2 2 -329283.45508387 -126.72280447 -111.57605506 -2 3 2 2 3 80914.07460553 72071.57583400 -72060.90669509 -2 3 2 2 4 -2970.28398655 -5.46311330 -10.45489917 -2 3 2 2 5 80898.46724069 -72080.12399951 72063.75608360 -2 3 2 2 6 -2958.27584929 3.96343514 0.59987126 -2 3 2 2 7 80702.69496896 -71939.53988405 -71944.78875761 -2 3 2 2 8 11783.37835417 6.53431198 -1.54252611 -2 3 2 3 1 67092.85858442 67093.52272760 74101.72229438 -2 3 2 3 2 105.49164653 -104.55970367 5.58094515 -2 3 2 3 3 -67093.96191906 -67093.15852005 74102.09721392 -2 3 2 3 4 -2.28165320 2.35663711 -4.45618653 -2 3 2 3 5 -67082.33941333 67082.38226127 -74073.73187274 -2 3 2 3 6 -0.74983908 -1.71391790 -4.79897011 -2 3 2 3 7 66979.46149159 -66979.44006762 -74121.37879026 -2 3 2 3 8 1.69249392 0.78197504 -4.72398620 -2 1 3 1 1 -0.81411100 -539.53064183 1559.94379747 -2 1 3 1 2 -74179.75911861 -72096.84541098 72069.47628458 -2 1 3 1 3 74176.10633109 72096.36337158 -72067.86948655 -2 1 3 1 4 0.36420755 538.96290653 -1559.23680634 -2 1 3 1 5 9477.30182443 3068.12727446 -3066.67044425 -2 1 3 1 6 0.10711987 1560.65078860 -539.11287434 -2 1 3 1 7 -0.29993563 -1561.43276364 539.63776170 -2 1 3 1 8 -9473.01702969 -3066.29552471 3063.76749581 -2 1 3 2 1 537.82743592 -0.10711987 3074.36165081 -2 1 3 2 2 -67119.78851937 -72109.14277189 80913.09981473 -2 1 3 2 3 72095.00294925 67136.52064283 -80912.71418320 -2 1 3 2 4 0.51417537 -538.70581884 -3074.34022684 -2 1 3 2 5 -3068.48077003 888.68785331 94.62969186 -2 1 3 2 6 -888.27008582 3063.37115230 -93.15143767 -2 1 3 2 7 -1557.45861652 1.38184630 3075.86132897 -2 1 3 2 8 0.64271921 1558.00492785 -3077.81091058 -2 1 3 3 1 1558.67978302 3074.40449876 -0.31064762 -2 1 3 3 2 67084.31041891 80902.81630735 -72062.98482054 -2 1 3 3 3 -72067.65524681 -80910.63605775 67096.88629147 -2 1 3 3 4 893.78675905 -83.23213785 3055.74421766 -2 1 3 3 5 3067.72021896 95.31525902 887.93801423 -2 1 3 3 6 -1.03906272 -3079.24631682 -536.52057352 -2 1 3 3 7 -534.67811179 3079.13919695 -0.26779967 -2 1 3 3 8 -1.04977471 -3078.61430959 1559.45104607 -2 2 3 1 1 -0.81411100 539.36996203 3074.26524293 -2 2 3 1 2 -72094.99223726 -67142.54077944 80912.70347121 -2 2 3 1 3 67126.66561492 72107.61095777 -80913.99962162 -2 2 3 1 4 -538.63083493 0.53559934 -3074.29737889 -2 2 3 1 5 -1.76747783 -1559.27965428 3080.53175524 -2 2 3 1 6 1557.99421586 0.70699113 -3077.81091058 -2 2 3 1 7 888.00228615 -3058.19726265 91.65175952 -2 2 3 1 8 3063.43542422 -888.25937383 -93.09787774 -2 2 3 2 1 -538.62012295 0.42847947 1558.30486348 -2 2 3 2 2 -72107.71807764 -74174.33885326 72072.29353712 -2 2 3 2 3 72109.50697945 74175.47432387 -72075.34645337 -2 2 3 2 4 538.97361851 0.36420755 -1559.19395839 -2 2 3 2 5 -1559.68670978 0.34278358 538.98433050 -2 2 3 2 6 -3066.29552471 -9473.05987764 3063.77820780 -2 2 3 2 7 3063.11406462 9470.57469669 -3059.60053293 -2 2 3 2 8 1560.62936463 0.12854384 -539.20928222 -2 2 3 3 1 3074.55446658 1560.10447727 -0.53559934 -2 2 3 3 2 80902.88057927 67095.07596570 -72062.42779723 -2 2 3 3 3 -80911.90007220 -72074.42522250 67095.40803729 -2 2 3 3 4 -83.26427381 893.74391110 3055.74421766 -2 2 3 3 5 3081.32444227 -535.96355021 -0.36420755 -2 2 3 3 6 -3078.63573357 -1.02835074 1559.47247005 -2 2 3 3 7 94.22263636 3063.62823999 889.23416464 -2 2 3 3 8 -3079.26774079 -1.04977471 -536.49914955 -2 3 3 1 1 -893.35827957 82.95362619 -3055.86204952 -2 3 3 1 2 72064.09886718 80909.45773920 -67096.52208392 -2 3 3 1 3 -67086.40996833 -80898.98141606 72061.18520675 -2 3 3 1 4 -1559.30107826 -3074.68301042 0.47132742 -2 3 3 1 5 2.18524532 3079.41770861 -1557.30864870 -2 3 3 1 6 535.95283822 -3081.13162650 -0.36420755 -2 3 3 1 7 2.63514877 3077.89660647 536.88478108 -2 3 3 1 8 -3065.72778941 -94.96176345 -888.60215741 -2 3 3 2 1 83.25356182 -893.61536726 -3055.86204952 -2 3 3 2 2 80911.12880915 72070.21541167 -67094.42253450 -2 3 3 2 3 -80900.47038223 -67090.39482744 72062.25640544 -2 3 3 2 4 -3074.67229843 -1559.34392621 0.47132742 -2 3 3 2 5 3080.84240286 0.10711987 536.26348584 -2 3 3 2 6 -94.96176345 -3065.70636543 -888.62358139 -2 3 3 2 7 3075.90417692 2.62443678 -1559.80454164 -2 3 3 2 8 -3081.13162650 535.95283822 -0.34278358 -2 3 3 3 1 3055.44428203 3055.24075428 -9478.87648650 -2 3 3 3 2 -72065.91990494 -72065.25576176 74112.89489667 -2 3 3 3 3 72065.13792990 72064.93440215 -74114.18033509 -2 3 3 3 4 -3055.29431421 -3055.29431421 9478.69438273 -2 3 3 3 5 -1555.32693114 -538.83436268 -1.73534187 -2 3 3 3 6 538.34161129 1556.38741783 2.76369261 -2 3 3 3 7 -538.72724282 -1555.42333902 -2.48518095 -2 3 3 3 8 1556.36599386 538.34161129 2.78511658 -2 1 4 1 1 -0.04284795 0.04284795 897.62165034 -2 1 4 1 2 -0.68556716 0.47132742 -5.48453727 -2 1 4 1 3 -0.06427192 0.12854384 897.66449829 -2 1 4 1 4 0.81411100 -0.44990345 -5.59165714 -2 1 4 1 5 -0.00000000 -0.00000000 -894.83653376 -2 1 4 1 6 -0.07498391 -0.32135961 -1.19974253 -2 1 4 1 7 0.04284795 -0.00000000 -886.58830388 -2 1 4 1 8 -0.00000000 0.27851166 -1.17831855 -2 1 4 2 1 -538.68439487 538.70581884 -83.01789811 -2 1 4 2 2 6.76997569 -1.42469425 -2969.41631561 -2 1 4 2 3 538.57727500 -538.59869897 -80.72553292 -2 1 4 2 4 -2.81725254 5.44168932 -2969.55557144 -2 1 4 2 5 -540.24834495 -540.24834495 -83.12501798 -2 1 4 2 6 -0.27851166 -0.06427192 3371.85494970 -2 1 4 2 7 535.55649471 535.55649471 -99.79286952 -2 1 4 2 8 0.98550279 0.85695895 2913.94964769 -2 1 4 3 1 -1559.83667760 -3074.96152208 -3058.42221437 -2 1 4 3 2 8.82667717 11785.60644743 6.17010443 -2 1 4 3 3 -1559.79382965 -3074.87582618 3058.40079040 -2 1 4 3 4 -5.74162495 -2970.54107423 0.85695895 -2 1 4 3 5 1560.82218039 -3075.15433784 3060.02901240 -2 1 4 3 6 -0.81411100 2915.31007002 -1.07119869 -2 1 4 3 7 1556.38741783 -3078.66786953 -3064.48519893 -2 1 4 3 8 -0.02142397 573.20912850 -1.28543842 -2 2 4 1 1 538.62012295 -538.70581884 -83.03932209 -2 2 4 1 2 2.20666929 -4.78825812 -2970.38039443 -2 2 4 1 3 -538.55585103 538.66297089 -80.89692471 -2 2 4 1 4 -6.07369655 0.92123087 -2970.34825847 -2 2 4 1 5 540.26976892 540.24834495 -80.89692471 -2 2 4 1 6 -0.94265484 -0.66414318 2913.74611994 -2 2 4 1 7 -535.66361458 -535.62076663 -99.94283734 -2 2 4 1 8 0.17139179 -0.06427192 3371.72640585 -2 2 4 2 1 -0.00000000 0.02142397 897.60022637 -2 2 4 2 2 -0.44990345 0.69627915 -5.50596124 -2 2 4 2 3 0.06427192 0.08569589 897.57880239 -2 2 4 2 4 0.51417537 -0.85695895 -5.46311330 -2 2 4 2 5 0.04284795 0.02142397 -895.00792555 -2 2 4 2 6 -0.26779967 -0.00000000 -1.19974253 -2 2 4 2 7 -0.04284795 0.08569589 -886.48118401 -2 2 4 2 8 0.27851166 -0.06427192 -1.29615041 -2 2 4 3 1 -3074.87582618 -1559.92237350 -3058.22939861 -2 2 4 3 2 11785.64929538 8.88023710 -6.13796847 -2 2 4 3 3 -3074.85440221 -1559.79382965 3058.35794245 -2 2 4 3 4 -2970.40181840 -5.69877701 -0.77126305 -2 2 4 3 5 -3075.21860976 1560.77933244 -3059.77192472 -2 2 4 3 6 573.08058465 -0.06427192 1.19974253 -2 2 4 3 7 -3078.62502158 1556.51596168 3064.54947085 -2 2 4 3 8 2915.22437412 -0.71770312 1.04977471 -2 3 4 1 1 -1559.75098171 -3074.94009810 3058.29367053 -2 3 4 1 2 -5.67735303 -2970.50893827 -0.72841511 -2 3 4 1 3 -1559.77240568 -3074.81155426 -3058.31509451 -2 3 4 1 4 8.76240525 11785.60644743 -6.14868045 -2 3 4 1 5 1560.75790847 -3075.21860976 -3059.81477267 -2 3 4 1 6 -0.04284795 573.19841651 1.24259047 -2 3 4 1 7 1556.49453770 -3078.73214145 3064.46377496 -2 3 4 1 8 -0.74983908 2915.35291796 1.03906272 -2 3 4 2 1 -3074.96152208 -1559.81525363 3058.29367053 -2 3 4 2 2 -2970.47680231 -5.67735303 0.63200722 -2 3 4 2 3 -3074.94009810 -1559.79382965 -3058.22939861 -2 3 4 2 4 11785.60644743 8.84810114 6.10583251 -2 3 4 2 5 -3075.19718579 1560.75790847 3059.81477267 -2 3 4 2 6 2915.33149399 -0.79268703 -1.09262266 -2 3 4 2 7 -3078.66786953 1556.51596168 -3064.46377496 -2 3 4 2 8 573.19841651 0.04284795 -1.30686240 -2 3 4 3 1 -0.04284795 -0.02142397 9480.08694102 -2 3 4 3 2 9.46939638 -9.45868439 -6.74855172 -2 3 4 3 3 -0.04284795 -0.02142397 9480.27975678 -2 3 4 3 4 -9.41583644 9.55509227 -6.66285582 -2 3 4 3 5 0.04284795 0.04284795 -9484.05037615 -2 3 4 3 6 -1.27472644 -1.32828637 -2.61372479 -2 3 4 3 7 -0.04284795 0.04284795 -9457.20613710 -2 3 4 3 8 1.24259047 1.33899836 -2.63514877 -2 1 5 1 1 -1.37113432 1559.48318203 -536.74552525 -2 1 5 1 2 -74173.56759021 72113.86675809 -72082.25568489 -2 1 5 1 3 9477.44108026 -3068.12727446 3067.24889154 -2 1 5 1 4 0.21423974 -540.84821621 1560.26515707 -2 1 5 1 5 74163.21981091 -72101.89075679 72063.22048425 -2 1 5 1 6 -1.04977471 -1561.03642013 541.72659913 -2 1 5 1 7 -1.13547061 538.39517122 -1558.10133573 -2 1 5 1 8 -9463.80472100 3060.09328432 -3055.18719435 -2 1 5 2 1 1560.02949336 -0.37491954 3080.53175524 -2 1 5 2 2 67117.81751378 -72109.50697945 80902.50565973 -2 1 5 2 3 3068.91996149 888.06655807 94.88677954 -2 1 5 2 4 -0.52488736 -540.18407303 -3074.68301042 -2 1 5 2 5 -72100.32680671 67159.12293509 -80923.66183376 -2 1 5 2 6 889.54481225 3054.26596348 -86.85278940 -2 1 5 2 7 -533.90684873 -3.63136354 3077.32887117 -2 1 5 2 8 -1.56395008 1552.14547104 -3070.03400812 -2 1 5 3 1 537.93455579 3080.68172306 -0.39634351 -2 1 5 3 2 -67092.28013713 80902.75203543 -72062.01002974 -2 1 5 3 3 -3066.95966790 94.73681173 888.06655807 -2 1 5 3 4 -891.08733836 -81.19686035 3057.41528761 -2 1 5 3 5 72059.81407243 -80921.73367613 67085.81009707 -2 1 5 3 6 3.05291625 -3077.59667084 -534.78523165 -2 1 5 3 7 -1556.53738565 3074.92938612 3.52424367 -2 1 5 3 8 6.08440853 -3072.58346099 1562.17189073 -2 2 5 1 1 -888.08798204 -3068.91996149 94.89749153 -2 2 5 1 2 72109.53911541 -67117.89249769 80902.48423576 -2 2 5 1 3 0.39634351 -1560.05091734 3080.57460319 -2 2 5 1 4 540.16264905 0.55702332 -3074.64016247 -2 2 5 1 5 -67159.14435906 72100.39107863 -80923.83322555 -2 2 5 1 6 -1552.10262309 1.60679803 -3070.05543210 -2 2 5 1 7 3.64207553 533.90684873 3077.29673521 -2 2 5 1 8 -3054.30881142 -889.57694822 -86.90634934 -2 2 5 2 1 3068.10585049 -9477.40894430 3067.23817955 -2 2 5 2 2 -72113.93103002 74173.47118233 -72082.21283694 -2 2 5 2 3 -1559.47247005 1.43540624 -536.73481326 -2 2 5 2 4 540.79465628 -0.23566371 1560.30800502 -2 2 5 2 5 72101.93360474 -74163.28408283 72063.02766849 -2 2 5 2 6 -3060.05043638 9463.82614497 -3055.18719435 -2 2 5 2 7 -538.38445924 1.13547061 -1558.10133573 -2 2 5 2 8 1560.99357218 1.01763875 541.66232721 -2 2 5 3 1 94.71538776 -3066.95966790 -888.12011800 -2 2 5 3 2 80902.81630735 -67092.44081693 72062.11714961 -2 2 5 3 3 3080.68172306 537.91313182 0.36420755 -2 2 5 3 4 -81.17543637 -891.10876234 -3057.45813556 -2 2 5 3 5 -80921.89435593 72059.87834435 -67085.87436899 -2 2 5 3 6 -3072.57274901 6.08440853 -1562.15046676 -2 2 5 3 7 3074.94009810 -1556.53738565 -3.53495566 -2 2 5 3 8 -3077.61809482 3.05291625 534.84950358 -2 3 5 1 1 -0.94265484 3079.87832404 538.45944314 -2 3 5 1 2 -72076.28910821 80899.54915136 -67091.74453778 -2 3 5 1 3 -0.27851166 3080.51033127 -1555.12340339 -2 3 5 1 4 1560.82218039 -3074.44734671 0.47132742 -2 3 5 1 5 67094.89386192 -80910.01476251 72055.57212564 -2 3 5 1 6 -530.70396466 -3076.84683176 0.51417537 -2 3 5 1 7 889.63050815 93.59062914 -3056.76185641 -2 3 5 1 8 3062.81412898 -92.15522290 -891.29086611 -2 3 5 2 1 3080.51033127 -0.26779967 1555.09126742 -2 3 5 2 2 80899.49559142 -72076.25697225 67091.74453778 -2 3 5 2 3 3079.86761205 -1.00692676 -538.44873116 -2 3 5 2 4 -3074.42592273 1560.86502834 -0.42847947 -2 3 5 2 5 -80910.05761046 67094.85101397 -72055.33646193 -2 3 5 2 6 -92.11237495 3062.77128104 891.32300207 -2 3 5 2 7 93.60134112 889.66264411 3056.79399237 -2 3 5 2 8 -3076.86825574 -530.67182870 -0.50346338 -2 3 5 3 1 -536.90620505 1557.46932851 -2.82796453 -2 3 5 3 2 -72066.43408031 72066.63760806 -74083.89754826 -2 3 5 3 3 -1557.42648056 536.90620505 -2.82796453 -2 3 5 3 4 -3056.79399237 3057.11535198 -9483.08629733 -2 3 5 3 5 72059.12850528 -72061.37802251 74120.17904773 -2 3 5 3 6 540.67682442 -1552.85246217 -6.34149622 -2 3 5 3 7 3064.05671946 -3064.05671946 9465.69003069 -2 3 5 3 8 1553.62372523 -539.85200144 -6.90923152 -2 1 6 1 1 0.12854384 886.41691209 -1.15689458 -2 1 6 1 2 0.08569589 2.37806108 8.83738915 -2 1 6 1 3 -0.21423974 -886.45976004 -1.19974253 -2 1 6 1 4 0.08569589 -0.04284795 -0.29993563 -2 1 6 1 5 -0.47132742 891.28015412 3.34213990 -2 1 6 1 6 0.20352775 -2.29236519 -8.86952511 -2 1 6 1 7 -0.08569589 -891.30157810 -1.09262266 -2 1 6 1 8 0.19281576 0.04284795 0.33207159 -2 1 6 2 1 -1561.16496397 -3065.98487709 -3079.41770861 -2 1 6 2 2 6.98421543 -0.08569589 11784.99586418 -2 1 6 2 3 1561.14354000 3065.92060517 -3079.22489284 -2 1 6 2 4 -0.18210378 -0.10711987 2915.26722207 -2 1 6 2 5 -1560.37227694 3055.76564164 -3077.03964753 -2 1 6 2 6 -2.32450115 3.83489129 -2964.86372120 -2 1 6 2 7 1555.18767531 -3059.10778153 -3074.06171518 -2 1 6 2 8 0.79268703 -0.23566371 574.52670288 -2 1 6 3 1 -539.04860242 -90.73052865 536.58484545 -2 1 6 3 2 6.42719211 -2961.02882991 -0.50346338 -2 1 6 3 3 -539.09145037 -90.75195262 -536.54199750 -2 1 6 3 4 -0.80339901 3371.85494970 -0.53559934 -2 1 6 3 5 542.28362245 -86.98133325 -534.31390423 -2 1 6 3 6 -5.13104170 -2964.30669788 -1.39255829 -2 1 6 3 7 535.36367894 -92.25163078 537.76316400 -2 1 6 3 8 -0.00000000 2914.30314325 -1.11404663 -2 2 6 1 1 -1558.52981520 3063.30688038 -3078.06799826 -2 2 6 1 2 1.75676584 4.67042627 -2955.29791694 -2 2 6 1 3 1558.44411931 -3063.19976051 -3078.15369416 -2 2 6 1 4 -0.67485517 -0.06427192 573.66974393 -2 2 6 1 5 -1552.65964641 -3060.92881930 -3072.66915689 -2 2 6 1 6 -6.28793628 0.74983908 11771.78798439 -2 2 6 1 7 1557.77997612 3055.33716216 -3075.58281731 -2 2 6 1 8 0.08569589 0.12854384 2914.09961550 -2 2 6 2 1 -0.42847947 9471.68874332 -1.97100558 -2 2 6 2 2 -0.02142397 -3.06362824 6.94136748 -2 2 6 2 3 0.44990345 -9471.62447140 -1.97100558 -2 2 6 2 4 -0.81411100 0.10711987 -0.21423974 -2 2 6 2 5 1.17831855 9463.44051345 5.78447290 -2 2 6 2 6 0.01071199 3.14932413 -6.98421543 -2 2 6 2 7 0.36420755 -9463.44051345 -1.94958161 -2 2 6 2 8 -0.79268703 -0.10711987 0.12854384 -2 2 6 3 1 -3078.11084621 3061.63581043 -1559.04399057 -2 2 6 3 2 -2959.50772777 -3.92058719 1.53181412 -2 2 6 3 3 -3078.15369416 3061.59296248 1559.06541455 -2 2 6 3 4 2913.71398398 -0.62129524 1.00692676 -2 2 6 3 5 -3070.37679170 -3054.33023540 -1562.40755445 -2 2 6 3 6 11772.96630295 -4.02770706 1.54252611 -2 2 6 3 7 -3075.56139334 -3061.35729877 1557.35149665 -2 2 6 3 8 574.78379056 1.11404663 1.03906272 -2 3 6 1 1 535.49222279 -94.37260418 -538.34161129 -2 3 6 1 2 5.12032972 -2955.72639641 -2.58158883 -2 3 6 1 3 535.57791868 -94.39402815 538.29876334 -2 3 6 1 4 0.03213596 2915.50288578 -1.28543842 -2 3 6 1 5 -531.78587534 -98.05752765 539.75559355 -2 3 6 1 6 -6.44861609 -2959.05782433 0.83553497 -2 3 6 1 7 -538.77009076 -88.41673949 -536.04924610 -2 3 6 1 8 0.79268703 3374.69362621 -0.55702332 -2 3 6 2 1 -3080.61745113 -3069.39128891 -1556.34456989 -2 3 6 2 2 11786.37771049 8.56958948 -3.54566765 -2 3 6 2 3 -3080.70314703 -3069.43413686 1556.32314591 -2 3 6 2 4 572.99488876 -0.14996782 -1.26401445 -2 3 6 2 5 -3078.08942224 3060.28610009 -1554.73777186 -2 3 6 2 6 -2963.12837933 8.44104564 0.36420755 -2 3 6 2 7 -3073.01194047 3060.07186035 1559.85810157 -2 3 6 2 8 2916.01706115 1.43540624 -0.68556716 -2 3 6 3 1 0.12854384 885.32428943 2.46375698 -2 3 6 3 2 -2.39948506 3.48139573 -2.67799671 -2 3 6 3 3 -0.17139179 -885.36713738 2.48518095 -2 3 6 3 4 1.07119869 -0.08569589 -1.86388571 -2 3 6 3 5 -0.42847947 890.10183557 -7.45554285 -2 3 6 3 6 1.42469425 1.94958161 2.63514877 -2 3 6 3 7 -0.34278358 -896.80753934 2.50660492 -2 3 6 3 8 0.66414318 1.27472644 1.84246174 -2 1 7 1 1 -9469.58919390 3060.51105181 3063.71393588 -2 1 7 1 2 74060.92033646 -71905.42220592 -71940.73962657 -2 1 7 1 3 -0.19281576 -1555.80897054 -535.51364676 -2 1 7 1 4 -0.69627915 535.94212623 1555.65900273 -2 1 7 1 5 -1.01763875 -534.44244807 -1556.40884181 -2 1 7 1 6 -0.96407882 1554.24502046 535.79215842 -2 1 7 1 7 -74051.60090790 71902.41213761 71937.42962264 -2 1 7 1 8 9463.16200179 -3057.43671158 -3059.97545247 -2 1 7 2 1 -3065.19219007 -890.86238664 93.19428562 -2 1 7 2 2 -66918.29604666 71901.25524303 80696.62127241 -2 1 7 2 3 -1561.19709993 0.66414318 3079.20346887 -2 1 7 2 4 0.35349557 535.42795087 -3078.30366197 -2 1 7 2 5 538.17021950 -2.74226863 3075.53996937 -2 1 7 2 6 -890.29465133 -3058.82926988 -90.85907249 -2 1 7 2 7 71896.13491332 -66927.43337144 -80700.32761986 -2 1 7 2 8 0.12854384 -1557.40505658 -3075.04721797 -2 1 7 3 1 -3060.50033982 90.22706526 -890.13397153 -2 1 7 3 2 -66969.62788766 80709.22928094 71950.99099799 -2 1 7 3 3 540.01268124 3075.39000155 -0.49275140 -2 1 7 3 4 -884.81011407 -101.65675524 -3065.12791814 -2 1 7 3 5 -1559.93308548 3079.56767642 1.77818982 -2 1 7 3 6 -0.85695895 -3073.03336444 537.46322837 -2 1 7 3 7 71939.62557994 -80702.99490459 -66976.26931951 -2 1 7 3 8 -3.96343514 -3076.83611978 -1558.30486348 -2 2 7 1 1 0.21423974 1561.78625921 3079.80334013 -2 2 7 1 2 -71903.80469591 66918.51028640 80696.89978407 -2 2 7 1 3 891.04449041 3065.10649417 93.32282946 -2 2 7 1 4 -535.42795087 -0.42847947 -3078.34650992 -2 2 7 1 5 2.99935632 -538.12737155 3075.41142552 -2 2 7 1 6 1557.39434460 -0.14996782 -3075.04721797 -2 2 7 1 7 66928.72952185 -71897.00258425 -80701.29169868 -2 2 7 1 8 3058.76499795 890.24109140 -90.79480057 -2 2 7 2 1 1555.83039452 0.23566371 -535.47079881 -2 2 7 2 2 71905.26152612 -74060.84535255 -71940.55752280 -2 2 7 2 3 -3060.53247578 9469.65346582 3063.69251191 -2 2 7 2 4 -535.97426219 0.70699113 1555.59473081 -2 2 7 2 5 534.44244807 0.96407882 -1556.51596168 -2 2 7 2 6 3057.43671158 -9463.14057781 -3060.02901240 -2 2 7 2 7 -71902.24074582 74051.44022810 71937.32250277 -2 2 7 2 8 -1554.18074854 1.02835074 535.80287040 -2 2 7 3 1 3075.39000155 539.99125726 0.47132742 -2 2 7 3 2 80709.40067273 -66969.85283938 -71951.14096581 -2 2 7 3 3 90.21635328 -3060.52176380 890.12325954 -2 2 7 3 4 -101.65675524 -884.78869009 3065.04222225 -2 2 7 3 5 3079.64266033 -1559.90094952 -1.79961379 -2 2 7 3 6 -3076.85754375 -4.02770706 1558.31557547 -2 2 7 3 7 -80703.27341625 71939.86124365 66976.37643938 -2 2 7 3 8 -3073.03336444 -0.83553497 -537.45251638 -2 3 7 1 1 3.53495566 3077.93945442 1556.83732128 -2 3 7 1 2 -71942.21788076 80699.11716535 66981.27181737 -2 3 7 1 3 2.48518095 3075.53996937 -537.99882771 -2 3 7 1 4 1556.86945724 -3078.90353324 0.51417537 -2 3 7 1 5 891.39798598 92.57299038 3063.88532767 -2 3 7 1 6 -538.50229109 -3072.51918907 -0.29993563 -2 3 7 1 7 66969.13513626 -80705.09445401 -71954.82588929 -2 3 7 1 8 3057.32959172 -88.63097922 890.76597876 -2 3 7 2 1 3075.51854539 2.47446896 538.03096367 -2 3 7 2 2 80699.28855714 -71942.34642460 -66981.41107320 -2 3 7 2 3 3077.88589449 3.51353169 -1556.85874526 -2 3 7 2 4 -3078.93566920 1556.83732128 -0.47132742 -2 3 7 2 5 92.50871846 891.38727399 -3063.79963178 -2 3 7 2 6 -88.57741929 3057.39386364 -890.72313081 -2 3 7 2 7 -80705.30869375 66969.18869620 71955.05084101 -2 3 7 2 8 -3072.51918907 -538.44873116 0.36420755 -2 3 7 3 1 1559.10826249 -536.75623723 -3.21359606 -2 3 7 3 2 71946.24558782 -71946.22416384 -74126.15633640 -2 3 7 3 3 536.79908518 -1559.08683852 -3.21359606 -2 3 7 3 4 3067.70950698 -3067.69879499 -9458.19163989 -2 3 7 3 5 -3058.14370272 3058.20797464 9466.35417387 -2 3 7 3 6 -536.20992591 1559.45104607 2.91366042 -2 3 7 3 7 -71955.95064791 71956.00420784 74118.46512984 -2 3 7 3 8 -1559.42962210 536.20992591 2.99935632 -2 1 8 1 1 9471.64589538 -0.38563153 -1.99242955 -2 1 8 1 2 3.02078029 0.02142397 6.95207947 -2 1 8 1 3 -9471.53877551 0.38563153 -1.97100558 -2 1 8 1 4 -0.08569589 0.81411100 -0.23566371 -2 1 8 1 5 -9463.50478537 -1.19974253 5.74162495 -2 1 8 1 6 0.13925583 0.77126305 0.25708768 -2 1 8 1 7 9463.48336139 -0.49275140 -1.99242955 -2 1 8 1 8 -3.08505221 0.06427192 -6.88780755 -2 1 8 2 1 3063.32830435 -1558.52981520 -3077.98230237 -2 1 8 2 2 -4.69185024 -1.77818982 -2955.30862893 -2 1 8 2 3 -3063.22118448 1558.50839123 -3078.17511813 -2 1 8 2 4 0.08569589 0.68556716 573.75543983 -2 1 8 2 5 3060.84312340 1552.55252654 -3072.58346099 -2 1 8 2 6 -0.04284795 -0.19281576 2914.04605557 -2 1 8 2 7 -3055.20861832 -1557.71570420 -3075.58281731 -2 1 8 2 8 -0.81411100 6.39505615 11771.69157651 -2 1 8 3 1 3061.50726659 -3078.08942224 -1559.04399057 -2 1 8 3 2 -4.77754614 -2958.82216061 -0.83553497 -2 1 8 3 3 3061.61438646 -3078.08942224 1558.89402276 -2 1 8 3 4 -0.79268703 2913.66042404 -0.85695895 -2 1 8 3 5 -3054.39450732 -3070.33394376 1562.55752226 -2 1 8 3 6 0.95336683 574.82663851 -1.11404663 -2 1 8 3 7 -3059.08635756 -3075.43284950 -1557.28722473 -2 1 8 3 8 -4.94893793 11772.39856764 -2.31378916 -2 2 8 1 1 -3065.96345312 -1561.10069205 -3079.46055655 -2 2 8 1 2 0.10711987 -6.98421543 11784.98515220 -2 2 8 1 3 3066.00630107 1561.12211602 -3079.16062092 -2 2 8 1 4 0.05355993 0.17139179 2915.28864604 -2 2 8 1 5 -3055.74421766 1560.26515707 -3076.99679958 -2 2 8 1 6 0.17139179 -0.77126305 574.46243096 -2 2 8 1 7 3059.12920551 -1555.18767531 -3074.14741108 -2 2 8 1 8 -3.79204335 2.48518095 -2964.81016127 -2 2 8 2 1 886.39548812 0.17139179 -1.09262266 -2 2 8 2 2 -2.42090903 -0.13925583 8.76240525 -2 2 8 2 3 -886.45976004 -0.25708768 -1.17831855 -2 2 8 2 4 -0.00000000 -0.06427192 -0.32135961 -2 2 8 2 5 -891.21588220 0.40705550 3.34213990 -2 2 8 2 6 -0.05355993 -0.06427192 0.27851166 -2 2 8 2 7 891.36585002 0.23566371 -1.09262266 -2 2 8 2 8 2.37806108 -0.18210378 -8.86952511 -2 2 8 3 1 -90.75195262 -539.02717845 536.60626942 -2 2 8 3 2 -2961.97148475 7.03777536 -0.23566371 -2 2 8 3 3 -90.81622454 -539.13429832 -536.62769339 -2 2 8 3 4 3371.66213393 -0.96407882 0.53559934 -2 2 8 3 5 -84.90320780 542.19792656 534.14251244 -2 2 8 3 6 2914.08890352 0.14996782 1.24259047 -2 2 8 3 7 -92.23020681 535.29940702 -537.78458797 -2 2 8 3 8 -2965.14223286 -5.70948899 1.94958161 -2 3 8 1 1 -3069.34844096 -3080.59602716 -1556.32314591 -2 3 8 1 2 8.50531756 11786.39913446 2.34592512 -2 3 8 1 3 -3069.26274507 -3080.59602716 1556.43026578 -2 3 8 1 4 -0.19281576 573.02702472 1.00692676 -2 3 8 1 5 3062.55704130 -3078.02515032 1554.60922802 -2 3 8 1 6 1.45683021 2916.01706115 1.04977471 -2 3 8 1 7 3057.84376708 -3072.90482060 -1559.90094952 -2 3 8 1 8 8.39819769 -2963.10695536 0.92123087 -2 3 8 2 1 -94.43687610 535.57791868 -538.32018732 -2 3 8 2 2 -2955.75853237 5.20602561 2.49589294 -2 3 8 2 3 -94.52257199 535.53507073 538.25591539 -2 3 8 2 4 2915.46003783 -0.02142397 1.28543842 -2 3 8 2 5 -98.03610368 -531.82872328 -539.62704971 -2 3 8 2 6 3374.60793032 0.74983908 0.47132742 -2 3 8 2 7 -88.45958743 -538.83436268 536.02782213 -2 3 8 2 8 -2958.99355240 -6.39505615 -0.91051888 -2 3 8 3 1 885.30286546 0.17139179 2.37806108 -2 3 8 3 2 -1.73534187 1.22116650 -2.57087684 -2 3 8 3 3 -885.36713738 -0.19281576 2.46375698 -2 3 8 3 4 0.52488736 -0.92123087 -1.79961379 -2 3 8 3 5 -892.24423294 0.40705550 -7.45554285 -2 3 8 3 6 -0.86767094 -0.72841511 1.75676584 -2 3 8 3 7 894.47232621 0.17139179 2.42090903 -2 3 8 3 8 -0.19281576 -0.09640788 2.64586075 -3 1 1 1 1 -0.04284795 0.08569589 4.69185024 -3 1 1 1 2 -0.64271921 -0.00000000 -897.66449829 -3 1 1 1 3 0.01071199 0.02142397 4.54188243 -3 1 1 1 4 0.67485517 -0.08569589 -897.49310650 -3 1 1 1 5 0.04284795 0.02142397 1.60679803 -3 1 1 1 6 -0.70699113 0.06427192 891.92287334 -3 1 1 1 7 -0.00000000 0.06427192 0.55702332 -3 1 1 1 8 0.62129524 -0.00000000 891.86931340 -3 1 1 2 1 0.06427192 0.02142397 2970.18757867 -3 1 1 2 2 -539.11287434 539.09145037 80.63983703 -3 1 1 2 3 0.06427192 0.08569589 2970.36968244 -3 1 1 2 4 538.97361851 -538.89863461 80.68268498 -3 1 1 2 5 0.02142397 -0.12854384 -2913.72469596 -3 1 1 2 6 -537.54892426 -537.63462016 91.65175952 -3 1 1 2 7 0.04284795 0.01071199 -3371.82281374 -3 1 1 2 8 537.61319618 537.65604413 91.69460746 -3 1 1 3 1 7.02706338 2969.23421184 0.11783186 -3 1 1 3 2 1560.54366873 3074.81155426 -3058.35794245 -3 1 1 3 3 -12.64014449 -11784.25673709 0.02142397 -3 1 1 3 4 1560.58651668 3074.83297823 3058.40079040 -3 1 1 3 5 -0.71770312 -573.39123227 0.08569589 -3 1 1 3 6 -1557.95136791 3077.01822355 3060.07186035 -3 1 1 3 7 1.00692676 -2915.16010220 -0.02142397 -3 1 1 3 8 -1557.84424805 3076.98608759 -3059.95402849 -3 2 1 1 1 0.04284795 -0.11783186 2970.23042661 -3 2 1 1 2 538.27733937 -538.34161129 81.04689253 -3 2 1 1 3 0.04284795 -0.00000000 2970.15544271 -3 2 1 1 4 -538.26662738 538.34161129 81.19686035 -3 2 1 1 5 -0.01071199 0.04284795 -3371.81210175 -3 2 1 1 6 538.19164347 538.32018732 91.52321567 -3 2 1 1 7 0.02142397 0.03213596 -2913.68184802 -3 2 1 1 8 -538.29876334 -538.34161129 91.42680779 -3 2 1 2 1 -0.14996782 -0.05355993 4.53117044 -3 2 1 2 2 -0.00000000 0.74983908 -897.49310650 -3 2 1 2 3 0.05355993 -0.08569589 4.71327422 -3 2 1 2 4 0.07498391 -0.72841511 -897.32171471 -3 2 1 2 5 0.06427192 0.04284795 1.58537405 -3 2 1 2 6 -0.23566371 -0.59987126 891.92287334 -3 2 1 2 7 0.02142397 0.03213596 0.46061543 -3 2 1 2 8 -0.00000000 0.62129524 891.85860142 -3 2 1 3 1 2969.12709197 6.95207947 0.01071199 -3 2 1 3 2 3074.91867413 1559.02256660 -3058.46506232 -3 2 1 3 3 -11784.26744908 -7.66978259 -0.04284795 -3 2 1 3 4 3074.96152208 1559.04399057 3058.31509451 -3 2 1 3 5 -2915.17081419 0.89980690 0.06427192 -3 2 1 3 6 3076.91110368 -1559.25823031 -3059.72907677 -3 2 1 3 7 -573.41265625 0.44990345 0.02142397 -3 2 1 3 8 3076.80398381 -1559.34392621 3059.88975657 -3 3 1 1 1 -7.58408669 -11784.32100901 -0.03213596 -3 3 1 1 2 1559.04399057 3074.96152208 3058.50791027 -3 3 1 1 3 6.89851953 2969.19136389 0.06427192 -3 3 1 1 4 1559.04399057 3075.02579400 -3058.44363835 -3 3 1 1 5 0.88909491 -2915.16010220 0.06427192 -3 3 1 1 6 -1559.38677415 3076.86825574 -3059.94331651 -3 3 1 1 7 0.53559934 -573.32696035 0.01071199 -3 3 1 1 8 -1559.40819813 3076.83611978 3059.93260452 -3 3 1 2 1 -11784.42812888 -12.51160064 0.07498391 -3 3 1 2 2 3074.94009810 1560.47939681 3058.25082259 -3 3 1 2 3 2969.15922793 7.15560722 -0.06427192 -3 3 1 2 4 3074.86511419 1560.58651668 -3058.10085477 -3 3 1 2 5 -573.27340042 -0.72841511 -0.06427192 -3 3 1 2 6 3076.91110368 -1557.95136791 3060.11470830 -3 3 1 2 7 -2915.22437412 1.00692676 -0.05355993 -3 3 1 2 8 3076.97537560 -1557.95136791 -3060.11470830 -3 3 1 3 1 -0.06427192 0.06427192 11.24758620 -3 3 1 3 2 0.10711987 -0.06427192 -9480.12978896 -3 3 1 3 3 0.02142397 -0.06427192 11.16189030 -3 3 1 3 4 -0.07498391 -0.00000000 -9480.06551704 -3 3 1 3 5 0.01071199 0.02142397 3.92058719 -3 3 1 3 6 0.17139179 0.12854384 9465.28297519 -3 3 1 3 7 -0.02142397 -0.02142397 3.11718817 -3 3 1 3 8 -0.21423974 -0.12854384 9465.26155121 -3 1 2 1 1 -0.85695895 -539.56277779 1559.91166151 -3 1 2 1 2 -74179.69484669 -72096.74900310 72069.39058868 -3 1 2 1 3 74175.97778725 72096.19197979 -72067.48385502 -3 1 2 1 4 0.37491954 538.98433050 -1559.15111044 -3 1 2 1 5 9477.31253642 3068.17012241 -3066.67044425 -3 1 2 1 6 0.16067980 1560.65078860 -539.21999421 -3 1 2 1 7 -0.25708768 -1561.43276364 539.66989766 -3 1 2 1 8 -9473.05987764 -3066.27410074 3063.74607184 -3 1 2 2 1 -0.57844729 538.99504249 3074.40449876 -3 1 2 2 2 -72093.98531050 -67136.92769833 80911.73939240 -3 1 2 2 3 67125.08024087 72103.30473906 -80912.20000783 -3 1 2 2 4 -538.69510686 0.74983908 -3074.38307479 -3 1 2 2 5 -1.98171757 -1559.53674197 3080.25324358 -3 1 2 2 6 1557.35149665 1.58537405 -3077.14676739 -3 1 2 2 7 889.24487662 -3060.01830042 90.39845705 -3 1 2 2 8 3063.49969614 -888.05584608 -93.03360582 -3 1 2 3 1 -893.33685560 82.97505016 -3055.85133753 -3 1 2 3 2 72063.69181167 80909.16851555 -67096.30784418 -3 1 2 3 3 -67086.14216866 -80898.70290440 72061.14235880 -3 1 2 3 4 -1559.26894230 -3074.64016247 0.59987126 -3 1 2 3 5 2.18524532 3079.46055655 -1557.26580076 -3 1 2 3 6 536.02782213 -3081.17447445 -0.34278358 -3 1 2 3 7 2.63514877 3077.88589449 536.89549306 -3 1 2 3 8 -3065.72778941 -94.97247544 -888.66642933 -3 2 2 1 1 537.89170784 -0.31064762 3074.43663472 -3 2 2 1 2 -67119.38146386 -72106.87183068 80913.15337466 -3 2 2 1 3 72091.97145697 67135.51371607 -80913.99962162 -3 2 2 1 4 1.34971034 -538.10594758 -3073.52611584 -3 2 2 1 5 -3068.60931387 888.49503754 94.60826789 -3 2 2 1 6 -887.97015019 3063.41400025 -92.91577396 -3 2 2 1 7 -1556.79447333 0.47132742 3075.22932175 -3 2 2 1 8 1.49967816 1557.42648056 -3076.98608759 -3 2 2 2 1 -538.64154692 0.42847947 1558.26201553 -3 2 2 2 2 -72107.65380572 -74174.14603750 72072.33638507 -3 2 2 2 3 72109.41057156 74175.38862797 -72075.34645337 -3 2 2 2 4 538.97361851 0.38563153 -1559.19395839 -3 2 2 2 5 -1559.71884575 0.36420755 538.92005858 -3 2 2 2 6 -3066.30623670 -9473.01702969 3063.82105575 -3 2 2 2 7 3063.13548859 9470.58540868 -3059.57910895 -3 2 2 2 8 1560.69363655 0.09640788 -539.20928222 -3 2 2 3 1 83.29640977 -893.59394329 -3055.82991356 -3 2 2 3 2 80911.27877696 72070.39751544 -67094.63677423 -3 2 2 3 3 -80900.57750210 -67090.39482744 72062.44922120 -3 2 2 3 4 -3074.67229843 -1559.30107826 0.47132742 -3 2 2 3 5 3080.88525081 0.10711987 536.28490981 -3 2 2 3 6 -94.95105147 -3065.77063736 -888.68785331 -3 2 2 3 7 3075.88275295 2.62443678 -1559.79382965 -3 2 2 3 8 -3081.13162650 535.98497418 -0.35349557 -3 3 2 1 1 1558.74405494 3074.40449876 -0.32135961 -3 3 2 1 2 67084.16045109 80902.76274741 -72062.98482054 -3 3 2 1 3 -72067.52670297 -80910.57178583 67096.80059558 -3 3 2 1 4 893.76533507 -83.21071387 3055.74421766 -3 3 2 1 5 3067.72021896 95.22956312 888.02371012 -3 3 2 1 6 -1.11404663 -3079.20346887 -536.39202968 -3 3 2 1 7 -534.72095973 3079.14990894 -0.26779967 -3 3 2 1 8 -1.02835074 -3078.63573357 1559.50460601 -3 3 2 2 1 3074.59731452 1560.11518926 -0.54631133 -3 3 2 2 2 80902.79488338 67095.00098179 -72062.32067736 -3 3 2 2 3 -80911.81437631 -72074.38237455 67095.25806947 -3 3 2 2 4 -83.22142586 893.78675905 3055.74421766 -3 3 2 2 5 3081.30301829 -535.98497418 -0.38563153 -3 3 2 2 6 -3078.64644555 -1.04977471 1559.49389402 -3 3 2 2 7 94.24406033 3063.59610402 889.20202868 -3 3 2 2 8 -3079.18204490 -1.11404663 -536.40274167 -3 3 2 3 1 3055.48712998 3055.31573819 -9478.86577451 -3 3 2 3 2 -72065.34145765 -72064.62375453 74112.07007368 -3 3 2 3 3 72065.08436997 72064.91297818 -74112.16648157 -3 3 2 3 4 -3055.92632144 -3055.93703342 9477.79457583 -3 3 2 3 5 -1555.29479517 -538.92005858 -1.64964598 -3 3 2 3 6 538.24520341 1556.45168975 2.59230082 -3 3 2 3 7 -538.77009076 -1555.44476299 -2.49589294 -3 3 2 3 8 1556.47311373 538.24520341 2.63514877 -3 1 3 1 1 0.64271921 -0.07498391 -11.75104958 -3 1 3 1 2 74172.21787986 67121.29890951 -67081.84666193 -3 1 3 1 3 3.37427586 -0.42847947 107.03417264 -3 1 3 1 4 -74176.08490712 -67120.94541395 -67081.37533451 -3 1 3 1 5 3.62065156 0.08569589 9.85502790 -3 1 3 1 6 -74114.57667861 67021.68814376 67030.98614835 -3 1 3 1 7 0.74983908 0.03213596 -4.16696289 -3 1 3 1 8 74110.19547598 -67021.61315986 67031.22181206 -3 1 3 2 1 -0.08569589 -0.20352775 -11785.57431147 -3 1 3 2 2 72096.29909966 72106.66830293 -80899.92407090 -3 1 3 2 3 -1.83174975 -3.29929195 329268.90820573 -3 1 3 2 4 -72094.36023004 -72104.91153709 -80898.81002427 -3 1 3 2 5 0.08569589 -0.12854384 2960.08617506 -3 1 3 2 6 72011.81365935 -71998.67005148 -80802.48783848 -3 1 3 2 7 -0.70699113 -0.91051888 2960.71818229 -3 1 3 2 8 -72011.28877199 72001.30520024 -80802.65923027 -3 1 3 3 1 4.69185024 2970.58392218 1.94958161 -3 1 3 3 2 -72069.49770855 -80912.14644790 72059.73908853 -3 1 3 3 3 111.45822321 329278.05624250 2.35663711 -3 1 3 3 4 -72068.66217357 -80911.19308107 -72063.00624452 -3 1 3 3 5 -8.89094909 2954.21600627 -0.29993563 -3 1 3 3 6 72017.66240417 -80799.61702601 -72002.26927906 -3 1 3 3 7 -1.58537405 -11781.05385302 0.28922365 -3 1 3 3 8 72014.75945573 -80798.96359481 72001.43374408 -3 2 3 1 1 -0.04284795 -0.21423974 -11785.60644743 -3 2 3 1 2 72094.69230163 72105.02936894 -80898.76717632 -3 2 3 1 3 0.84624696 -0.53559934 329269.31526123 -3 2 3 1 4 -72094.91725335 -72105.44713643 -80898.98141606 -3 2 3 1 5 0.05355993 -0.10711987 2960.10759904 -3 2 3 1 6 72012.35997067 -71999.78409811 -80803.40906935 -3 2 3 1 7 -0.70699113 -0.97479080 2960.64319838 -3 2 3 1 8 -72012.31712273 72001.85151157 -80803.26981352 -3 2 3 2 1 0.49275140 0.17139179 -6.94136748 -3 2 3 2 2 67130.41481032 74170.00049859 -67084.05333122 -3 2 3 2 3 5.58094515 0.98550279 133.83556374 -3 2 3 2 4 -67134.68889308 -74174.48882108 -67084.07475520 -3 2 3 2 5 3.82417931 0.29993563 -15.36098915 -3 2 3 2 6 -67016.97486955 74116.72978797 67028.92944688 -3 2 3 2 7 -1.19974253 0.93194286 -1.14618259 -3 2 3 2 8 67012.69007481 -74114.59810258 67028.84375098 -3 2 3 3 1 2972.70489558 6.17010443 0.10711987 -3 2 3 3 2 -80912.37139962 -72074.20027078 72059.29989706 -3 2 3 3 3 329275.20685400 138.95589346 0.66414318 -3 2 3 3 4 -80911.60013657 -72073.28975189 -72058.33581825 -3 2 3 3 5 -11779.81126255 -10.71198685 -0.06427192 -3 2 3 3 6 -80800.24903323 72005.41860319 72001.30520024 -3 2 3 3 7 2957.23678656 -0.95336683 -0.65343120 -3 2 3 3 8 -80800.98816032 72008.40724753 -72002.08717528 -3 3 3 1 1 5.93444072 2971.92292054 0.04284795 -3 3 3 1 2 -72069.26204484 -80911.93220816 72059.47128885 -3 3 3 1 3 110.68696015 329276.19235679 0.68556716 -3 3 3 1 4 -72068.94068523 -80911.53586465 -72059.10708130 -3 3 3 1 5 -9.04091690 2954.38739806 -0.66414318 -3 3 3 1 6 72017.40531648 -80799.35993832 -72002.01219137 -3 3 3 1 7 -1.39255829 -11781.28951673 -0.06427192 -3 3 3 1 8 72014.50236805 -80798.67437116 72001.34804819 -3 3 3 2 1 2972.61919968 6.15939244 0.19281576 -3 3 3 2 2 -80912.32855167 -72074.10386290 72059.29989706 -3 3 3 2 3 329275.39966976 139.19155717 0.85695895 -3 3 3 2 4 -80911.87864823 -72073.58968753 -72058.67860183 -3 3 3 2 5 -11779.85411049 -10.71198685 -0.14996782 -3 3 3 2 6 -80800.23832124 72005.37575525 72001.34804819 -3 3 3 2 7 2957.27963451 -0.98550279 -0.67485517 -3 3 3 2 8 -80801.03100827 72008.36439958 -72002.09788727 -3 3 3 3 1 0.62129524 0.04284795 1.09262266 -3 3 3 3 2 67094.78674205 67096.50065995 -74104.17533937 -3 3 3 3 3 3.98485911 0.59987126 -4.52045845 -3 3 3 3 4 -67098.84658507 -67098.38596963 -74104.02537156 -3 3 3 3 5 3.72777142 0.23566371 6.62000788 -3 3 3 3 6 -67033.97479269 67032.44297857 74102.71850916 -3 3 3 3 7 -0.00000000 0.89980690 -0.86767094 -3 3 3 3 8 67029.82925377 -67032.30372274 74103.00773281 -3 1 4 1 1 0.94265484 539.35925004 1559.84738959 -3 1 4 1 2 -0.34278358 -538.98433050 -1559.19395839 -3 1 4 1 3 -74176.69549037 -72097.19890655 -72068.66217357 -3 1 4 1 4 74179.78054258 72098.95567239 72069.56198047 -3 1 4 1 5 -9477.41965629 -3068.34151420 -3066.54190041 -3 1 4 1 6 9473.03845367 3066.28481272 3063.75678383 -3 1 4 1 7 0.89980690 1560.53295675 540.29119290 -3 1 4 1 8 -0.08569589 -1560.72577251 -539.16643428 -3 1 4 2 1 0.57844729 -539.01646646 3074.45805869 -3 1 4 2 2 538.44873116 -0.42847947 -3074.42592273 -3 1 4 2 3 -67122.94855549 -72105.46856040 -80912.30712770 -3 1 4 2 4 72093.73893480 67137.39902575 80911.92149617 -3 1 4 2 5 1.99242955 1559.55816594 3080.27466756 -3 1 4 2 6 -3064.30309516 888.90209304 -92.48729449 -3 1 4 2 7 -889.26630060 3060.01830042 90.38774507 -3 1 4 2 8 -1558.16560765 -0.77126305 -3077.73592667 -3 1 4 3 1 -893.31543163 82.95362619 3055.88347349 -3 1 4 3 2 -1559.40819813 -3074.46877068 -0.42847947 -3 1 4 3 3 -67086.38854436 -80901.01669356 -72061.07808688 -3 1 4 3 4 72064.54877062 80910.14330636 67097.05768326 -3 1 4 3 5 2.20666929 3079.46055655 1557.26580076 -3 1 4 3 6 -3065.64209351 -94.80108365 888.60215741 -3 1 4 3 7 2.63514877 3077.89660647 -536.89549306 -3 1 4 3 8 535.36367894 -3080.22110762 -0.29993563 -3 2 4 1 1 -537.87028387 0.28922365 3074.45805869 -3 2 4 1 2 -1.02835074 537.81672393 -3073.52611584 -3 2 4 1 3 -72094.59589375 -67133.64983035 -80914.49237302 -3 2 4 1 4 67120.01347109 72106.98966253 80913.54971818 -3 2 4 1 5 3068.57717791 -888.49503754 94.60826789 -3 2 4 1 6 -0.65343120 -1558.29415149 -3077.53239892 -3 2 4 1 7 1556.83732128 -0.43919146 3075.20789777 -3 2 4 1 8 888.79497318 -3064.20668728 -92.27305475 -3 2 4 2 1 539.00575447 -0.58915928 1558.46554328 -3 2 4 2 2 -539.00575447 -0.33207159 -1559.20467038 -3 2 4 2 3 -72107.23603823 -74173.80325392 -72073.71823137 -3 2 4 2 4 72102.90839554 74174.06034160 72071.96146553 -3 2 4 2 5 1561.55059550 -1.69249392 537.63462016 -3 2 4 2 6 -1560.68292456 -0.12854384 -539.15572229 -3 2 4 2 7 -3062.74985706 -9470.44615285 -3059.72907677 -3 2 4 2 8 3066.30623670 9473.01702969 3063.77820780 -3 2 4 3 1 83.31783374 -893.60465527 3055.82991356 -3 2 4 3 2 -3074.46877068 -1559.37606217 -0.42847947 -3 2 4 3 3 -80902.91271523 -67090.58764320 -72062.83485273 -3 2 4 3 4 80912.40353558 72071.06165863 67095.81509279 -3 2 4 3 5 3080.87453882 0.08569589 -536.26348584 -3 2 4 3 6 -3080.22110762 535.29940702 -0.27851166 -3 2 4 3 7 3075.90417692 2.62443678 1559.81525363 -3 2 4 3 8 -94.82250762 -3065.60995755 888.58073344 -3 3 4 1 1 1558.67978302 3074.40449876 0.28922365 -3 3 4 1 2 893.42255150 -83.06074606 -3055.91560945 -3 3 4 1 3 -72063.40258803 -80910.85029749 -67097.10053121 -3 3 4 1 4 67082.62863697 80901.74510866 72062.02074173 -3 3 4 1 5 3067.73093095 95.27241107 -887.95943820 -3 3 4 1 6 -2.84938850 -3077.33958316 -1558.14418368 -3 3 4 1 7 -534.67811179 3079.11777297 0.28922365 -3 3 4 1 8 -1.41398226 -3079.41770861 536.58484545 -3 3 4 2 1 3074.55446658 1560.07234131 0.56773530 -3 3 4 2 2 -83.06074606 893.41183951 -3055.93703342 -3 3 4 2 3 -80911.84651227 -72070.09757981 -67095.21522152 -3 3 4 2 4 80901.59514085 67093.32991184 72061.46371841 -3 3 4 2 5 3081.32444227 -535.98497418 0.32135961 -3 3 4 2 6 -3079.41770861 -1.45683021 536.60626942 -3 3 4 2 7 94.24406033 3063.60681601 -889.22345265 -3 3 4 2 8 -3077.31815918 -2.86010049 -1558.18703163 -3 3 4 3 1 -3055.42285806 -3055.26217825 -9478.83363855 -3 3 4 3 2 3056.06557727 3056.03344131 9478.00881557 -3 3 4 3 3 -72067.38744714 -72067.22676734 -74112.38072130 -3 3 4 3 4 72067.00181561 72066.24126455 74113.70900767 -3 3 4 3 5 1555.31621915 538.87721063 -1.69249392 -3 3 4 3 6 -1555.43405100 -538.70581884 1.88530969 -3 3 4 3 7 538.68439487 1555.42333902 -2.52802890 -3 3 4 3 8 -538.68439487 -1555.43405100 1.92815763 -3 1 5 1 1 -0.02142397 0.01071199 -0.12854384 -3 1 5 1 2 9474.64525169 -0.81411100 0.92123087 -3 1 5 1 3 0.09640788 -0.10711987 -8.67670935 -3 1 5 1 4 -9474.69881163 0.89980690 0.89980690 -3 1 5 1 5 0.08569589 0.02142397 13.38998357 -3 1 5 1 6 -9456.28490623 -0.00000000 -3.08505221 -3 1 5 1 7 0.02142397 0.03213596 -0.16067980 -3 1 5 1 8 9456.17778636 0.07498391 -3.09576420 -3 1 5 2 1 0.12854384 0.07498391 -573.11272061 -3 1 5 2 2 3069.58410468 -1560.52224476 3080.36036345 -3 1 5 2 3 0.99621478 -0.64271921 2958.99355240 -3 1 5 2 4 -3069.50912077 1560.52224476 3080.42463537 -3 1 5 2 5 0.88909491 0.55702332 -11775.53717979 -3 1 5 2 6 3057.22247185 1553.23809370 3071.89789384 -3 1 5 2 7 0.23566371 -0.11783186 -2914.66735081 -3 1 5 2 8 -3059.40771717 -1553.18453376 3071.72650205 -3 1 5 3 1 1.99242955 -2913.89608775 -0.04284795 -3 1 5 3 2 -3068.74856970 3081.19589842 -1558.05848778 -3 1 5 3 3 14.17195861 2960.92171004 -0.04284795 -3 1 5 3 4 -3068.69500977 3081.19589842 1558.37984739 -3 1 5 3 5 16.69998750 -11774.25174137 0.02142397 -3 1 5 3 6 3053.10906890 3069.81976839 1560.43654886 -3 1 5 3 7 -1.54252611 -574.69809467 -0.03213596 -3 1 5 3 8 3052.95910108 3069.83048037 -1560.50082079 -3 2 5 1 1 -0.12854384 -0.13925583 -2915.42790187 -3 2 5 1 2 -3069.24132110 -1560.80075642 3081.41013816 -3 2 5 1 3 -0.89980690 0.57844729 -11785.62787141 -3 2 5 1 4 3069.29488103 1560.82218039 3081.23874637 -3 2 5 1 5 -0.93194286 -0.66414318 2965.42074452 -3 2 5 1 6 -3054.05172374 1558.07991176 3073.61181173 -3 2 5 1 7 -0.17139179 0.07498391 -574.35531109 -3 2 5 1 8 3056.21554508 -1558.02635182 3073.75106756 -3 2 5 2 1 0.23566371 0.17139179 0.81411100 -3 2 5 2 2 890.27322736 0.89980690 -0.25708768 -3 2 5 2 3 0.91051888 -0.77126305 -8.41962167 -3 2 5 2 4 -890.25180339 -0.89980690 -0.08569589 -3 2 5 2 5 0.92123087 0.66414318 12.61872051 -3 2 5 2 6 -889.45911636 -0.55702332 -2.31378916 -3 2 5 2 7 0.17139179 -0.08569589 0.37491954 -3 2 5 2 8 887.31671899 0.54631133 -2.52802890 -3 2 5 3 1 -3372.09061341 1.34971034 0.10711987 -3 2 5 3 2 94.02982060 538.23449142 536.43487763 -3 2 5 3 3 2959.25064009 -12.23308899 0.64271921 -3 2 5 3 4 93.96554868 538.25591539 -536.62769339 -3 2 5 3 5 2962.47494813 13.75419112 -0.59987126 -3 2 5 3 6 89.53078612 -539.51992984 536.19921392 -3 2 5 3 7 -2914.66735081 -0.28922365 -0.01071199 -3 2 5 3 8 87.36696477 -539.57348978 -536.02782213 -3 3 5 1 1 0.72841511 -573.03773671 0.17139179 -3 3 5 1 2 3069.26274507 3081.79576969 -1556.45168975 -3 3 5 1 3 -8.98735697 -11786.31343857 0.68556716 -3 3 5 1 4 3069.31630500 3081.62437790 1556.40884181 -3 3 5 1 5 -8.90166107 2963.10695536 -0.66414318 -3 3 5 1 6 -3059.15062948 3074.55446658 1557.39434460 -3 3 5 1 7 -0.94265484 -2915.98492519 -0.07498391 -3 3 5 1 8 -3061.35729877 3074.46877068 -1557.36220864 -3 3 5 2 1 -2915.22437412 -0.32135961 -0.02142397 -3 3 5 2 2 94.71538776 -536.22063789 -538.29876334 -3 3 5 2 3 2957.64384206 -11.84745746 -0.64271921 -3 3 5 2 4 96.90063307 -536.28490981 538.42730718 -3 3 5 2 5 2960.80387818 16.02513233 0.66414318 -3 3 5 2 6 89.70217791 534.78523165 -537.78458797 -3 3 5 2 7 -3374.31870667 -1.07119869 0.09640788 -3 3 5 2 8 89.61648201 534.69953576 537.81672393 -3 3 5 3 1 0.17139179 -0.10711987 2.88152446 -3 3 5 3 2 888.55930946 0.08569589 -2.03527750 -3 3 5 3 3 0.89980690 0.64271921 10.13353956 -3 3 5 3 4 -890.69099485 -0.08569589 -2.27094121 -3 3 5 3 5 0.83553497 -0.66414318 -12.12596912 -3 3 5 3 6 -891.21588220 0.08569589 2.91366042 -3 3 5 3 7 0.17139179 0.05355993 -2.45304499 -3 3 5 3 8 891.32300207 -0.09640788 2.88152446 -3 1 6 1 1 -1.54252611 -536.68125333 -1558.99043064 -3 1 6 1 2 -0.04284795 1558.21916759 536.16707796 -3 1 6 1 3 -74117.21182737 72014.13816049 72010.47466099 -3 1 6 1 4 9473.78829275 -3064.07814343 -3064.99937430 -3 1 6 1 5 -9460.46258110 3056.06557727 3053.38758055 -3 1 6 1 6 74104.98945037 -72006.46837791 -71995.75639105 -3 1 6 1 7 -0.64271921 -1556.90159320 -538.74866679 -3 1 6 1 8 0.98550279 535.57791868 1558.62622309 -3 1 6 2 1 -0.44990345 -537.24898863 3076.66472799 -3 1 6 2 2 1562.06477087 1.86388571 -3081.60295392 -3 1 6 2 3 67024.11976478 -72004.13316477 -80798.58867527 -3 1 6 2 4 3065.93131716 889.26630060 -94.95105147 -3 1 6 2 5 -0.58915928 1552.85246217 3069.32701699 -3 1 6 2 6 -72004.77588398 67036.04220615 80814.39956786 -3 1 6 2 7 889.69478007 3061.36801076 90.54842487 -3 1 6 2 8 -536.00639816 -0.05355993 -3076.03272076 -3 1 6 3 1 888.43076562 91.43751978 3061.92503408 -3 1 6 3 2 -539.92698534 -3079.48198053 0.92123087 -3 1 6 3 3 67030.68621272 -80802.29502272 -72004.69018809 -3 1 6 3 4 3064.37807907 -92.42302257 889.48054033 -3 1 6 3 5 -1.83174975 3072.69058086 1561.12211602 -3 1 6 3 6 -72000.35183341 80809.42920596 67027.49404064 -3 1 6 3 7 0.72841511 3077.75735064 -536.42416564 -3 1 6 3 8 1557.84424805 -3077.17890335 0.23566371 -3 2 6 1 1 537.87028387 0.08569589 3076.40764030 -3 2 6 1 2 -889.22345265 -3065.89918120 -94.94033948 -3 2 6 1 3 72016.49479760 -67015.92509484 -80800.02408151 -3 2 6 1 4 -1.84246174 -1562.02192292 -3081.58152995 -3 2 6 1 5 -3053.48398844 -891.62293770 85.99583046 -3 2 6 1 6 -67052.13161040 71998.99141108 80813.84254455 -3 2 6 1 7 -1557.71570420 0.36420755 3076.20411255 -3 2 6 1 8 0.02142397 536.01711014 -3076.08628070 -3 2 6 2 1 537.39895645 -0.02142397 -1560.56509271 -3 2 6 2 2 3064.72086264 -9472.85634989 -3065.58853358 -3 2 6 2 3 -72000.95170468 74114.99444610 72002.82630238 -3 2 6 2 4 -1558.27272752 0.23566371 535.98497418 -3 2 6 2 5 1557.82282407 -0.85695895 -540.14122508 -3 2 6 2 6 71996.82758974 -74107.02472788 -71992.24285936 -3 2 6 2 7 -3061.95717004 9466.34346188 3060.99309122 -3 2 6 2 8 -535.49222279 -0.82482299 1558.73334295 -3 2 6 3 1 91.03046428 888.21652588 -3061.74293030 -3 2 6 3 2 -92.85150204 3063.33901634 -888.75212523 -3 2 6 3 3 -80804.00894062 67030.08634146 72004.54022027 -3 2 6 3 4 -3078.46434178 -539.39138600 -0.17139179 -3 2 6 3 5 3073.79391551 -2.31378916 536.32775776 -3 2 6 3 6 80810.84318823 -71997.40603703 -67030.32200517 -3 2 6 3 7 3076.76113587 -0.42847947 -1559.37606217 -3 2 6 3 8 -3077.12534342 1557.79068811 -0.36420755 -3 3 6 1 1 -1559.85810157 3077.32887117 -0.18210378 -3 3 6 1 2 -1.37113432 -3078.00372634 538.37374725 -3 3 6 1 3 72014.83443964 -80797.34608479 -67034.79961567 -3 3 6 1 4 -2.93508440 -3080.29609153 -1556.92301718 -3 3 6 1 5 -3058.51862226 89.83072175 -892.22280897 -3 3 6 1 6 -67037.15625278 80804.56596393 72006.40410598 -3 3 6 1 7 536.04924610 3077.12534342 -0.65343120 -3 3 6 1 8 -890.85167465 -93.22642158 -3060.23254015 -3 3 6 2 1 3077.03964753 -1558.29415149 0.54631133 -3 3 6 2 2 -3080.44605934 -2.87081248 1556.85874526 -3 3 6 2 3 -80795.49291107 72009.21064654 67037.41334046 -3 3 6 2 4 -3078.90353324 -1.94958161 -538.98433050 -3 3 6 2 5 3073.93317134 534.22820834 -0.04284795 -3 3 6 2 6 80805.85140235 -67027.64400845 -72006.31841009 -3 3 6 2 7 91.37324786 -3061.65723440 890.20895544 -3 3 6 2 8 -93.40852536 -890.94808253 3060.32894803 -3 3 6 3 1 -3063.00694475 3064.00315953 9468.50728323 -3 3 6 3 2 -536.37060571 1559.31179024 2.42090903 -3 3 6 3 3 -71999.58057036 72000.59820911 74099.69772887 -3 3 6 3 4 -1559.31179024 536.32775776 2.39948506 -3 3 6 3 5 1559.54745396 -535.96355021 3.94201116 -3 3 6 3 6 71998.74503538 -72005.93277856 -74113.02344051 -3 3 6 3 7 538.57727500 -1556.96586512 1.48896617 -3 3 6 3 8 3061.33587480 -3061.36801076 -9465.39009505 -3 1 7 1 1 0.06427192 -0.04284795 0.64271921 -3 1 7 1 2 -0.57844729 889.00921291 2.39948506 -3 1 7 1 3 0.08569589 0.06427192 -2.20666929 -3 1 7 1 4 0.55702332 -889.05206086 2.14239737 -3 1 7 1 5 -0.06427192 0.10711987 -1.92815763 -3 1 7 1 6 -0.83553497 888.60215741 0.21423974 -3 1 7 1 7 0.02142397 -0.04284795 -1.92815763 -3 1 7 1 8 0.85695895 -888.62358139 0.24637570 -3 1 7 2 1 0.06427192 0.18210378 -2915.08511829 -3 1 7 2 2 -1561.33635576 -3058.27224656 3077.57524687 -3 1 7 2 3 -0.62129524 0.87838292 -11783.14269046 -3 1 7 2 4 1561.35777973 3058.22939861 3077.85375853 -3 1 7 2 5 -0.09640788 0.10711987 -574.86948646 -3 1 7 2 6 -1557.37292062 3060.80027546 3077.38243110 -3 1 7 2 7 0.66414318 0.92123087 2962.94627555 -3 1 7 2 8 1557.39434460 -3063.01765673 3077.44670303 -3 1 7 3 1 0.70699113 -3372.07990142 -0.01071199 -3 1 7 3 2 539.79844150 91.80172733 536.58484545 -3 1 7 3 3 -3.94201116 2960.30041480 0.04284795 -3 1 7 3 4 539.83057746 91.84457528 -536.71338929 -3 1 7 3 5 -0.16067980 -2914.49595902 -0.04284795 -3 1 7 3 6 -538.06309963 89.42366625 -536.02782213 -3 1 7 3 7 -0.25708768 2963.38546701 -0.07498391 -3 1 7 3 8 -537.93455579 89.63790599 536.14565398 -3 2 7 1 1 -0.08569589 -0.19281576 -573.42336823 -3 2 7 1 2 -1556.45168975 3063.52112012 3075.66851321 -3 2 7 1 3 0.68556716 -0.96407882 2957.90092975 -3 2 7 1 4 1556.47311373 -3063.56396806 3075.96844884 -3 2 7 1 5 0.07498391 -0.17139179 -2914.53880696 -3 2 7 1 6 -1557.33007268 -3061.10021109 3076.35408037 -3 2 7 1 7 -0.62129524 -0.88909491 -11774.32672528 -3 2 7 1 8 1557.15868089 3063.25332045 3076.33265639 -3 2 7 2 1 -0.02142397 -0.03213596 0.66414318 -3 2 7 2 2 -0.08569589 9468.73223495 2.97793235 -3 2 7 2 3 -0.03213596 -0.02142397 -3.83489129 -3 2 7 2 4 0.12854384 -9468.68938700 2.78511658 -3 2 7 2 5 0.04284795 0.12854384 -0.32135961 -3 2 7 2 6 0.66414318 9468.71081098 -0.94265484 -3 2 7 2 7 -0.02142397 0.02142397 -0.93194286 -3 2 7 2 8 -0.79268703 -9468.67867502 -0.98550279 -3 2 7 3 1 -2913.78896788 0.06427192 0.02142397 -3 2 7 3 2 3074.98294605 -3058.85069385 -1559.68670978 -3 2 7 3 3 2960.15044698 -1.92815763 0.64271921 -3 2 7 3 4 3075.04721797 -3058.87211782 1559.45104607 -3 2 7 3 5 -574.76236659 0.32135961 -0.06427192 -3 2 7 3 6 3076.13984063 3060.54318777 -1559.36535018 -3 2 7 3 7 -11773.78041395 -4.17767487 -0.74983908 -3 2 7 3 8 3076.07556871 3062.82484097 1559.31179024 -3 3 7 1 1 0.85695895 -2914.62450286 0.04284795 -3 3 7 1 2 -534.87092755 92.03739104 -538.27733937 -3 3 7 1 3 -1.67106995 2960.27899083 -0.04284795 -3 3 7 1 4 -534.94591146 91.97311912 538.34161129 -3 3 7 1 5 -1.04977471 -3373.78310733 0.02142397 -3 3 7 1 6 535.89927829 90.40916904 537.91313182 -3 3 7 1 7 -0.00000000 2963.53543483 -0.02142397 -3 3 7 1 8 535.89927829 90.32347315 -537.87028387 -3 3 7 2 1 -573.45550419 1.02835074 -0.13925583 -3 3 7 2 2 3079.56767642 3062.94267283 -1556.38741783 -3 3 7 2 3 -11783.83896960 -0.87838292 -0.70699113 -3 3 7 2 4 3079.59981238 3062.98552077 1556.15175412 -3 3 7 2 5 -2915.63142962 -0.53559934 -0.00000000 -3 3 7 2 6 3076.56832010 -3061.07878711 -1557.18010486 -3 3 7 2 7 2960.57892646 -0.73912709 0.62129524 -3 3 7 2 8 3076.58974408 -3063.37115230 1557.19081685 -3 3 7 3 1 -0.02142397 -0.03213596 2.19595730 -3 3 7 3 2 0.19281576 890.91594657 -2.84938850 -3 3 7 3 3 -0.05355993 -0.00000000 4.77754614 -3 3 7 3 4 -0.10711987 -890.74455478 -2.78511658 -3 3 7 3 5 0.02142397 0.02142397 -2.48518095 -3 3 7 3 6 -0.14996782 888.96636496 1.97100558 -3 3 7 3 7 0.04284795 -0.01071199 -2.77440459 -3 3 7 3 8 0.08569589 -888.95565298 2.00314154 -3 1 8 1 1 1.22116650 536.49914955 -1559.18324640 -3 1 8 1 2 -9472.84563790 3064.68872668 -3065.65280550 -3 1 8 1 3 74113.44120800 -72013.13123373 72009.44631025 -3 1 8 1 4 0.21423974 -1558.31557547 535.98497418 -3 1 8 1 5 9458.56655943 -3057.37243966 3054.60874706 -3 1 8 1 6 -0.85695895 -535.44937484 1558.82975084 -3 1 8 1 7 0.23566371 1557.07298499 -538.60941096 -3 1 8 1 8 -74099.91196861 72006.06132240 -71995.43503145 -3 1 8 2 1 0.23566371 537.18471671 3076.51476017 -3 1 8 2 2 -3065.85633325 -889.27701258 -94.91891551 -3 1 8 2 3 -67025.19096347 72004.77588398 -80799.06000269 -3 1 8 2 4 -1562.04334689 -1.84246174 -3081.53868200 -3 1 8 2 5 -0.31064762 -1553.47375741 3069.92688826 -3 1 8 2 6 536.00639816 0.06427192 -3076.07556871 -3 1 8 2 7 -889.84474789 -3061.26089089 90.63412076 -3 1 8 2 8 72006.98255327 -67036.17074999 80814.66736753 -3 1 8 3 1 888.38791767 91.38395984 -3061.93574606 -3 1 8 3 2 3063.32830435 -92.83007807 -888.75212523 -3 1 8 3 3 67032.96786592 -80804.43742009 72004.60449219 -3 1 8 3 4 -539.45565792 -3078.47505376 -0.21423974 -3 1 8 3 5 -1.83174975 3072.75485278 -1561.20781192 -3 1 8 3 6 1557.79068811 -3077.12534342 -0.47132742 -3 1 8 3 7 0.74983908 3077.77877462 536.42416564 -3 1 8 3 8 -72001.94791945 80810.93959611 -67028.77947906 -3 2 8 1 1 -537.89170784 -0.11783186 3076.42906427 -3 2 8 1 2 1.79961379 1562.04334689 -3081.61366591 -3 2 8 1 3 -72016.45194965 67015.98936676 -80800.19547330 -3 2 8 1 4 889.26630060 3065.87775722 -94.95105147 -3 2 8 1 5 3053.47327645 891.66578565 85.93155854 -3 2 8 1 6 -0.04284795 -536.00639816 -3076.05414473 -3 2 8 1 7 1557.71570420 -0.34278358 3076.19340056 -3 2 8 1 8 67052.13161040 -71999.02354704 80814.09963223 -3 2 8 2 1 -537.46322837 -0.18210378 -1560.51153277 -3 2 8 2 2 1558.16560765 -0.06427192 536.11351802 -3 2 8 2 3 72001.62655985 -74118.18661818 72003.29762980 -3 2 8 2 4 -3064.07814343 9473.76686877 -3064.91367841 -3 2 8 2 5 -1557.73712818 0.66414318 -540.16264905 -3 2 8 2 6 535.57791868 0.96407882 1558.59408713 -3 2 8 2 7 3061.29302685 -9467.27540474 3060.36108400 -3 2 8 2 8 -71997.44888498 74110.18476400 -71992.83201864 -3 2 8 3 1 91.15900812 888.32364575 3061.85005017 -3 2 8 3 2 -3079.48198053 -539.83057746 0.89980690 -3 2 8 3 3 -80800.89175244 67027.19410501 -72003.70468530 -3 2 8 3 4 -92.35875065 3064.35665509 889.48054033 -3 2 8 3 5 3074.72585837 -1.64964598 -536.92762902 -3 2 8 3 6 -3077.16819137 1557.82282407 0.27851166 -3 2 8 3 7 3076.97537560 -0.46061543 1559.29036627 -3 2 8 3 8 80807.07256886 -71995.79923900 67028.83303900 -3 3 8 1 1 -1559.83667760 3077.32887117 0.14996782 -3 3 8 1 2 -2.84938850 -3080.47819531 1556.83732128 -3 3 8 1 3 72014.72731977 -80795.37507921 67034.92815952 -3 3 8 1 4 -1.97100558 -3078.90353324 -539.02717845 -3 3 8 1 5 -3058.50791027 89.78787380 892.22280897 -3 3 8 1 6 -890.95879452 -93.45137331 3060.37179598 -3 3 8 1 7 536.02782213 3077.09320746 0.65343120 -3 3 8 1 8 -67036.74919728 80803.78398889 -72005.93277856 -3 3 8 2 1 3077.21103932 -1558.18703163 -0.43919146 -3 3 8 2 2 -3077.98230237 -1.36042233 538.37374725 -3 3 8 2 3 -80796.64980565 72008.82501501 -67036.85631715 -3 3 8 2 4 -3080.28537954 -2.93508440 -1556.92301718 -3 3 8 2 5 3074.86511419 534.95662344 -0.62129524 -3 3 8 2 6 -93.24784556 -890.87309862 -3060.30752406 -3 3 8 2 7 91.48036773 -3061.79649023 -890.29465133 -3 3 8 2 8 80804.67308380 -67028.64022323 72007.03611321 -3 3 8 3 1 3063.17833654 -3063.88532767 9468.58226714 -3 3 8 3 2 1559.32250223 -536.33846975 2.41019704 -3 3 8 3 3 72000.45895328 -72001.15523243 74100.55468782 -3 3 8 3 4 536.33846975 -1559.30107826 2.39948506 -3 3 8 3 5 -1558.66907103 536.62769339 3.29929195 -3 3 8 3 6 -3061.37872275 3061.33587480 -9465.34724711 -3 3 8 3 7 -538.36303526 1556.91230519 1.42469425 -3 3 8 3 8 -72000.83387282 72005.80423472 -74113.00201654 -4 1 1 1 1 74175.26008413 72107.09678240 -72075.07865370 -4 1 1 1 2 0.32135961 539.16643428 -1559.26894230 -4 1 1 1 3 0.42847947 -538.62012295 1558.20845560 -4 1 1 1 4 -74173.53545425 -72106.60403101 72071.34017029 -4 1 1 1 5 0.37491954 -1559.70813376 538.92005858 -4 1 1 1 6 -9472.92062181 -3066.09199696 3063.86390370 -4 1 1 1 7 9470.53184874 3063.13548859 -3059.60053293 -4 1 1 1 8 -0.53559934 1561.58273146 -538.52371507 -4 1 1 2 1 72106.62545498 67123.79480245 -80913.06767877 -4 1 1 2 2 0.42847947 -538.47015513 -3074.44734671 -4 1 1 2 3 539.15572229 -0.66414318 3074.42592273 -4 1 1 2 4 -67139.60569504 -72093.92103857 80911.96434412 -4 1 1 2 5 -1559.39748614 -1.84246174 3080.44605934 -4 1 1 2 6 0.73912709 1558.20845560 -3077.74663866 -4 1 1 2 7 -3059.08635756 888.61286940 90.98761633 -4 1 1 2 8 -888.92351702 3064.33523112 -92.48729449 -4 1 1 3 1 -72073.35402382 -80911.05382524 67094.51894238 -4 1 1 3 2 893.78675905 -83.22142586 3055.75492965 -4 1 1 3 3 1560.28658105 3074.42592273 -0.59987126 -4 1 1 3 4 67092.82644846 80902.68776351 -72062.34210133 -4 1 1 3 5 -535.78144643 3081.38871419 -0.23566371 -4 1 1 3 6 -1.06048670 -3078.64644555 1559.47247005 -4 1 1 3 7 3064.50662291 93.62276510 889.83403590 -4 1 1 3 8 -1.09262266 -3079.24631682 -536.45630160 -4 2 1 1 1 67134.29254956 72094.91725335 -80912.69275923 -4 2 1 1 2 -538.47015513 0.42847947 -3074.43663472 -4 2 1 1 3 -0.10711987 537.82743592 3074.38307479 -4 2 1 1 4 -72108.24296500 -67119.16722413 80912.73560717 -4 2 1 1 5 888.66642933 -3068.42721010 94.71538776 -4 2 1 1 6 3064.30309516 -888.88066907 -92.46587052 -4 2 1 1 7 1.39255829 -1557.45861652 3075.88275295 -4 2 1 1 8 1558.18703163 0.74983908 -3077.70379071 -4 2 1 2 1 72092.97838373 74174.46739710 -72066.57333614 -4 2 1 2 2 539.17714626 0.26779967 -1559.32250223 -4 2 1 2 3 -539.41280997 -1.19974253 1560.13661323 -4 2 1 2 4 -72096.06343594 -74174.89587658 72068.94068523 -4 2 1 2 5 3069.44484885 9475.43793872 -3067.95588267 -4 2 1 2 6 1561.55059550 -0.47132742 -538.57727500 -4 2 1 2 7 -1561.63629139 -0.63200722 539.44494594 -4 2 1 2 8 -3066.07057299 -9472.96346976 3063.83176774 -4 2 1 3 1 -80907.35818977 -72066.79828786 67095.99719656 -4 2 1 3 2 -83.44637759 893.85103097 3055.82991356 -4 2 1 3 3 3074.57589055 1558.59408713 -0.38563153 -4 2 1 3 4 80899.66698321 67083.49630791 -72062.04216570 -4 2 1 3 5 95.48665081 3067.78449088 888.02371012 -4 2 1 3 6 -3080.15683570 -0.42847947 -537.14186876 -4 2 1 3 7 3080.03900384 -535.31011901 0.35349557 -4 2 1 3 8 -3078.79641337 -1.14618259 1559.37606217 -4 3 1 1 1 -67090.78045897 -80901.40232508 72062.95268458 -4 3 1 1 2 -1559.30107826 -3074.61873850 0.52488736 -4 3 1 1 3 -893.34756759 83.01789811 -3055.87276150 -4 3 1 1 4 72068.69430953 80914.12816547 -67095.10810166 -4 3 1 1 5 0.92123087 3079.99615590 535.68503855 -4 3 1 1 6 -3065.71707742 -94.95105147 -888.64500536 -4 3 1 1 7 3.44925977 3075.04721797 -1559.22609435 -4 3 1 1 8 536.00639816 -3081.11020253 -0.34278358 -4 3 1 2 1 -80900.84530177 -67087.74896669 72062.40637325 -4 3 1 2 2 -3074.61873850 -1559.29036627 0.52488736 -4 3 1 2 3 82.62155460 -893.18688778 -3055.78706561 -4 3 1 2 4 80913.74253394 72064.01317128 -67096.69347571 -4 3 1 2 5 3079.08563701 2.01385353 -1557.41576857 -4 3 1 2 6 -3081.14233849 536.00639816 -0.32135961 -4 3 1 2 7 3076.09699268 3.89916321 535.63147862 -4 3 1 2 8 -94.95105147 -3065.72778941 -888.64500536 -4 3 1 3 1 72061.67795815 72062.13857358 -74113.49476794 -4 3 1 3 2 -3055.20861832 -3055.20861832 9478.51227895 -4 3 1 3 3 3055.10149845 3055.57282587 -9478.69438273 -4 3 1 3 4 -72061.52799033 -72064.27025896 74111.50233838 -4 3 1 3 5 -539.02717845 -1555.40191504 -1.75676584 -4 3 1 3 6 1557.40505658 537.82743592 3.59922758 -4 3 1 3 7 -1556.30172194 -538.08452360 -3.13861215 -4 3 1 3 8 537.82743592 1557.40505658 3.58851560 -4 1 2 1 1 -0.02142397 -0.00000000 897.49310650 -4 1 2 1 2 -0.81411100 0.51417537 -5.49524926 -4 1 2 1 3 -0.02142397 -0.00000000 897.62165034 -4 1 2 1 4 0.84624696 -0.47132742 -5.44168932 -4 1 2 1 5 0.04284795 -0.04284795 -895.17931734 -4 1 2 1 6 0.01071199 -0.29993563 -1.32828637 -4 1 2 1 7 -0.04284795 -0.08569589 -886.63115183 -4 1 2 1 8 0.04284795 0.32135961 -1.24259047 -4 1 2 2 1 538.64154692 -538.57727500 -82.99647414 -4 1 2 2 2 1.47825419 -5.47382528 -2969.45916356 -4 1 2 2 3 -538.74866679 538.72724282 -83.03932209 -4 1 2 2 4 -5.47382528 1.56395008 -2969.46987555 -4 1 2 2 5 540.20549700 540.18407303 -80.89692471 -4 1 2 2 6 -0.73912709 -0.81411100 2913.96035967 -4 1 2 2 7 -535.70646252 -535.55649471 -99.87856542 -4 1 2 2 8 0.17139179 0.17139179 3371.86566168 -4 1 2 3 1 -1559.79382965 -3074.91867413 3058.48648630 -4 1 2 3 2 -5.03463382 -2969.84479509 -1.70320591 -4 1 2 3 3 -1559.77240568 -3074.89725015 -3056.17269714 -4 1 2 3 4 8.11968603 11785.02800014 -7.17703119 -4 1 2 3 5 1560.88645231 -3075.17576181 -3060.02901240 -4 1 2 3 6 -0.04284795 573.30553638 1.07119869 -4 1 2 3 7 1556.49453770 -3078.68929350 3064.50662291 -4 1 2 3 8 -0.77126305 2915.25651008 0.87838292 -4 2 2 1 1 -538.59869897 538.62012295 -83.01789811 -4 2 2 1 2 5.50596124 -1.55323809 -2969.43773959 -4 2 2 1 3 538.70581884 -538.64154692 -83.08217003 -4 2 2 1 4 -1.58537405 5.39884137 -2969.44845157 -4 2 2 1 5 -540.24834495 -540.22692098 -80.89692471 -4 2 2 1 6 -0.09640788 -0.06427192 3371.94064559 -4 2 2 1 7 535.51364676 535.59934265 -99.79286952 -4 2 2 1 8 0.74983908 0.83553497 2914.00320762 -4 2 2 2 1 -0.02142397 -0.06427192 897.40741060 -4 2 2 2 2 -0.49275140 0.79268703 -5.40955336 -4 2 2 2 3 0.06427192 0.04284795 897.57880239 -4 2 2 2 4 0.54631133 -0.83553497 -5.44168932 -4 2 2 2 5 0.04284795 0.02142397 -895.00792555 -4 2 2 2 6 -0.27851166 0.02142397 -1.17831855 -4 2 2 2 7 0.06427192 -0.04284795 -886.60972786 -4 2 2 2 8 0.27851166 -0.03213596 -1.14618259 -4 2 2 3 1 -3074.89725015 -1559.75098171 3058.22939861 -4 2 2 3 2 -2969.74838720 -5.06676978 -0.14996782 -4 2 2 3 3 -3075.02579400 -1559.75098171 -3056.17269714 -4 2 2 3 4 11784.94230425 8.09826206 5.29172151 -4 2 2 3 5 -3075.17576181 1560.86502834 3060.02901240 -4 2 2 3 6 2915.24579810 -0.68556716 -1.32828637 -4 2 2 3 7 -3078.66786953 1556.58023360 -3064.39950304 -4 2 2 3 8 573.24126446 -0.14996782 -1.51039015 -4 3 2 1 1 -1559.79382965 -3074.85440221 -3058.35794245 -4 3 2 1 2 8.76240525 11785.57431147 6.13796847 -4 3 2 1 3 -1559.77240568 -3074.85440221 3058.35794245 -4 3 2 1 4 -5.72020098 -2970.47680231 0.81411100 -4 3 2 1 5 1560.84360436 -3075.11148989 3059.85762061 -4 3 2 1 6 -0.85695895 2915.35291796 -0.98550279 -4 3 2 1 7 1556.58023360 -3078.71071747 -3064.50662291 -4 3 2 1 8 0.02142397 573.13414459 -1.26401445 -4 3 2 2 1 -3074.89725015 -1559.81525363 -3058.33651848 -4 3 2 2 2 11785.67071936 8.88023710 -6.14868045 -4 3 2 2 3 -3074.96152208 -1559.77240568 3058.35794245 -4 3 2 2 4 -2970.55178622 -5.72020098 -0.79268703 -4 3 2 2 5 -3075.17576181 1560.77933244 -3059.85762061 -4 3 2 2 6 573.15556856 -0.00000000 1.26401445 -4 3 2 2 7 -3078.62502158 1556.55880962 3064.46377496 -4 3 2 2 8 2915.31007002 -0.82482299 1.09262266 -4 3 2 3 1 0.02142397 0.04284795 9477.92311967 -4 3 2 3 2 10.06926764 -8.89094909 -7.55195073 -4 3 2 3 3 0.02142397 0.06427192 9480.19406088 -4 3 2 3 4 -10.10140360 8.80525319 -7.64835861 -4 3 2 3 5 -0.02142397 -0.00000000 -9481.99367468 -4 3 2 3 6 -1.34971034 -1.15689458 -2.89223645 -4 3 2 3 7 0.02142397 -0.02142397 -9454.99946781 -4 3 2 3 8 1.37113432 1.27472644 -2.92437241 -4 1 3 1 1 1.11404663 539.33782607 1559.91166151 -4 1 3 1 2 -0.98550279 -539.63776170 -1558.30486348 -4 1 3 1 3 -74175.68856360 -72096.66330721 -72070.11900379 -4 1 3 1 4 74178.28086442 72099.64123955 72070.54748326 -4 1 3 1 5 -9476.48771343 -3068.94138546 -3067.31316346 -4 1 3 1 6 9473.11343757 3066.24196478 3063.99244754 -4 1 3 1 7 1.11404663 1560.60794065 540.18407303 -4 1 3 1 8 -0.23566371 -1560.57580469 -539.02717845 -4 1 3 2 1 -537.97740374 0.28922365 3074.46877068 -4 1 3 2 2 -1.09262266 537.79529996 -3073.51540385 -4 1 3 2 3 -72094.52090984 -67133.64983035 -80914.36382918 -4 1 3 2 4 67120.10987897 72106.92539061 80913.67826202 -4 1 3 2 5 3068.55575394 -888.51646152 94.58684391 -4 1 3 2 6 -0.68556716 -1558.31557547 -3077.59667084 -4 1 3 2 7 1556.83732128 -0.44990345 3075.21860976 -4 1 3 2 8 888.79497318 -3064.20668728 -92.28376674 -4 1 3 3 1 1558.65835905 3074.39378677 0.33207159 -4 1 3 3 2 893.40112752 -83.06074606 -3055.92632144 -4 1 3 3 3 -72063.34902810 -80910.63605775 -67096.92913942 -4 1 3 3 4 67082.62863697 80901.68083674 72061.67795815 -4 1 3 3 5 3067.69879499 95.29383505 -887.95943820 -4 1 3 3 6 -2.87081248 -3077.38243110 -1558.18703163 -4 1 3 3 7 -534.67811179 3079.12848496 0.28922365 -4 1 3 3 8 -1.41398226 -3079.39628463 536.61698141 -4 2 3 1 1 0.44990345 -538.82365070 3074.52233062 -4 2 3 1 2 537.61319618 -0.99621478 -3073.61181173 -4 2 3 1 3 -67120.24913480 -72104.89011311 -80914.06389354 -4 2 3 1 4 72093.68537486 67135.27805235 80912.26427975 -4 2 3 1 5 2.02456552 1559.72955773 3080.16754769 -4 2 3 1 6 -3065.11720616 889.43769239 -91.65175952 -4 2 3 1 7 -889.90901981 3060.92881930 89.74502586 -4 2 3 1 8 -1558.44411931 -0.73912709 -3077.48955097 -4 2 3 2 1 538.83436268 -0.52488736 1558.35842341 -4 2 3 2 2 -539.51992984 -1.10333465 -1558.17631964 -4 2 3 2 3 -72110.97452164 -74174.93872452 -72077.06037127 -4 2 3 2 4 72107.21461426 74175.66713963 72073.84677521 -4 2 3 2 5 1560.61865264 -1.07119869 538.29876334 -4 2 3 2 6 -1559.64386184 -0.85695895 -539.69132163 -4 2 3 2 7 -3062.98552077 -9470.47828881 -3059.66480485 -4 2 3 2 8 3066.37050862 9473.19913347 3063.87461568 -4 2 3 3 1 3074.61873850 1560.09376528 0.57844729 -4 2 3 3 2 -83.10359401 893.41183951 -3055.90489746 -4 2 3 3 3 -80911.79295233 -72070.01188392 -67095.21522152 -4 2 3 3 4 80901.47730899 67093.20136800 72061.07808688 -4 2 3 3 5 3081.31373028 -535.96355021 0.29993563 -4 2 3 3 6 -3079.41770861 -1.41398226 536.58484545 -4 2 3 3 7 94.20121239 3063.58539204 -889.24487662 -4 2 3 3 8 -3077.36100713 -2.88152446 -1558.19774361 -4 3 3 1 1 -893.35827957 82.96433818 3055.88347349 -4 3 3 1 2 -1559.57958992 -3074.39378677 -0.48203941 -4 3 3 1 3 -67084.21401103 -80901.08096548 -72060.94954304 -4 3 3 1 4 72063.67038770 80909.58628304 67096.45781200 -4 3 3 1 5 2.21738128 3079.48198053 1557.20152883 -4 3 3 1 6 -3066.55261240 -94.17978841 889.22345265 -4 3 3 1 7 2.67799671 3077.90731846 -536.87406909 -4 3 3 1 8 535.10659126 -3080.32822749 -0.23566371 -4 3 3 2 1 83.51064951 -893.69035117 3055.93703342 -4 3 3 2 2 -3074.40449876 -1559.57958992 -0.48203941 -4 3 3 2 3 -80901.88436449 -67087.65255881 -72061.63511020 -4 3 3 2 4 80909.41489125 72070.16185173 67094.65819821 -4 3 3 2 5 3081.80648168 -0.59987126 -536.92762902 -4 3 3 2 6 -3080.32822749 535.17086318 -0.27851166 -4 3 3 2 7 3076.03272076 2.72084466 1559.70813376 -4 3 3 2 8 -94.15836444 -3066.55261240 889.20202868 -4 3 3 3 1 -3055.52997792 -3055.10149845 -9478.78007862 -4 3 3 3 2 3055.93703342 3055.92632144 9477.76243987 -4 3 3 3 3 -72064.25954698 -72063.75608360 -74111.05243493 -4 3 3 3 4 72065.14864189 72062.25640544 74111.86654593 -4 3 3 3 5 1555.38049107 539.07002640 -1.69249392 -4 3 3 3 6 -1556.44097777 -538.29876334 2.63514877 -4 3 3 3 7 538.12737155 1556.36599386 -3.14932413 -4 3 3 3 8 -538.29876334 -1556.44097777 2.61372479 -4 1 4 1 1 -74167.86881320 -67132.10730425 67088.54165371 -4 1 4 1 2 2.12097340 -5.62379310 7.29486305 -4 1 4 1 3 74174.06034160 67119.38146386 67080.43267967 -4 1 4 1 4 -115.00389085 213.51132196 -123.83056802 -4 1 4 1 5 74170.60036985 -67112.39724844 -67088.53094173 -4 1 4 1 6 -1.14618259 3.74919540 -8.50531756 -4 1 4 1 7 -74062.48428654 66921.46679477 -66963.46849522 -4 1 4 1 8 -0.36420755 -7.75547848 8.25894186 -4 1 4 2 1 -72109.04636401 -72098.14156139 80899.57057533 -4 1 4 2 2 -1.04977471 2.06741346 11786.03492691 -4 1 4 2 3 72098.14156139 72106.94681459 80899.83837500 -4 1 4 2 4 224.35185265 -222.12375939 -329275.61390950 -4 1 4 2 5 -72115.45213215 72109.00351606 80901.80938058 -4 1 4 2 6 1.77818982 2.80654056 -2957.25821053 -4 1 4 2 7 71902.15504993 -71902.15504993 80705.06231805 -4 1 4 2 8 -0.74983908 1.71391790 -2959.42203188 -4 1 4 3 1 72071.85434566 80911.31091292 -72063.58469181 -4 1 4 3 2 -5.01320985 -2970.33754648 -6.90923152 -4 1 4 3 3 72067.01252760 80914.34240520 72060.00688820 -4 1 4 3 4 -122.05237820 -329280.77708716 -108.19106722 -4 1 4 3 5 -72081.31303005 80900.65248600 72062.59918902 -4 1 4 3 6 6.70570377 -2956.65833927 -0.27851166 -4 1 4 3 7 -71944.31743018 80700.02768423 -71944.98157337 -4 1 4 3 8 7.02706338 11781.39663660 1.52110213 -4 2 4 1 1 -72109.41057156 -72098.72000868 80899.81695103 -4 2 4 1 2 -0.42847947 1.36042233 11785.11369604 -4 2 4 1 3 72098.07728947 72106.58260703 80899.66698321 -4 2 4 1 4 223.35563787 -219.03870717 -329277.49921918 -4 2 4 1 5 -72115.58067599 72108.76785235 80901.98077237 -4 2 4 1 6 1.69249392 2.72084466 -2957.42960232 -4 2 4 1 7 71903.05485683 -71903.27980855 80708.00811444 -4 2 4 1 8 -0.79268703 1.81032578 -2959.59342367 -4 2 4 2 1 -67118.22456928 -74175.37791599 67079.97206423 -4 2 4 2 2 5.48453727 -1.55323809 7.11275927 -4 2 4 2 3 67135.19235646 74168.57580433 67091.05897063 -4 2 4 2 4 -220.20631374 114.48971549 -124.04480776 -4 2 4 2 5 67118.71732068 -74169.04713176 -67089.64498836 -4 2 4 2 6 6.95207947 0.57844729 6.55573595 -4 2 4 2 7 -66924.08051956 74057.52463663 -66964.67894973 -4 2 4 2 8 -3.83489129 4.91680197 -6.14868045 -4 2 4 3 1 80912.67133525 72070.05473187 -72065.10579394 -4 2 4 3 2 -2970.15544271 -4.95964991 10.48703513 -4 2 4 3 3 80912.01790406 72068.21227013 72057.73594698 -4 2 4 3 4 -329277.20999554 -122.99503305 112.11165440 -4 2 4 3 5 80896.86044266 -72079.95260772 -72061.65653417 -4 2 4 3 6 11782.30715548 7.66978259 1.11404663 -4 2 4 3 7 80700.12409211 -71944.87445350 71945.33506893 -4 2 4 3 8 -2956.48694748 6.60929589 -0.02142397 -4 3 4 1 1 72071.68295387 80911.37518484 -72063.56326783 -4 3 4 1 2 -4.97036190 -2970.33754648 -6.88780755 -4 3 4 1 3 72066.86255978 80914.12816547 72059.62125667 -4 3 4 1 4 -122.02024224 -329280.15579192 -108.46957887 -4 3 4 1 5 -72081.28089409 80900.58821408 72062.81342875 -4 3 4 1 6 6.69499178 -2956.65833927 -0.21423974 -4 3 4 1 7 -71943.97464660 80699.85629244 -71944.61736582 -4 3 4 1 8 7.09133530 11781.30022872 1.48896617 -4 3 4 2 1 80912.49994346 72069.87262809 -72065.06294599 -4 3 4 2 2 -2970.11259476 -4.95964991 10.51917109 -4 3 4 2 3 80912.02861604 72068.21227013 72057.77879493 -4 3 4 2 4 -329277.27426746 -122.84506523 111.29754340 -4 3 4 2 5 80896.81759471 -72079.84548785 -72061.42087046 -4 3 4 2 6 11782.24288356 7.77690246 0.96407882 -4 3 4 2 7 80700.35975583 -71944.96014939 71945.57073265 -4 3 4 2 8 -2956.50837145 6.59858390 -0.09640788 -4 3 4 3 1 -67096.30784418 -67097.92535420 74105.35365793 -4 3 4 3 2 4.34906666 -1.46754220 -7.12347126 -4 3 4 3 3 67094.73318212 67093.13709607 74109.12427730 -4 3 4 3 4 -107.88041960 110.91191188 4.58473037 -4 3 4 3 5 67086.95627966 -67087.33119920 -74078.23090722 -4 3 4 3 6 -0.88909491 -1.11404663 -5.99871264 -4 3 4 3 7 -66981.47534512 66981.07900160 -74121.55018205 -4 3 4 3 8 0.64271921 2.61372479 -5.98800065 -4 1 5 1 1 1.30686240 -1559.55816594 -536.92762902 -4 1 5 1 2 -0.21423974 540.80536827 1560.30800502 -4 1 5 1 3 -9477.32324841 3068.19154638 3067.05607578 -4 1 5 1 4 74173.47118233 -72113.84533412 -72079.65267209 -4 1 5 1 5 -74162.65207560 72101.22661361 72062.02074173 -4 1 5 1 6 9463.84756895 -3060.07186035 -3055.14434640 -4 1 5 1 7 0.55702332 -537.76316400 -1559.04399057 -4 1 5 1 8 1.04977471 1561.01499615 541.65161523 -4 1 5 2 1 -1560.00806939 0.37491954 3080.60673915 -4 1 5 2 2 0.23566371 539.92698534 -3074.61873850 -4 1 5 2 3 -3068.90924950 -888.08798204 94.95105147 -4 1 5 2 4 -67118.25670525 72109.47484348 80903.18051490 -4 1 5 2 5 72102.62988389 -67157.19477746 -80923.70468171 -4 1 5 2 6 0.73912709 -1552.98100601 -3070.56960747 -4 1 5 2 7 533.88542476 3.67421149 3077.27531124 -4 1 5 2 8 -890.38034723 -3055.08007448 -86.33861404 -4 1 5 3 1 537.95597976 3080.69243504 0.36420755 -4 1 5 3 2 -890.89452260 -81.12187644 -3057.53311947 -4 1 5 3 3 -3066.99180386 94.69396378 -888.06655807 -4 1 5 3 4 -67091.70168984 80902.47352377 72061.63511020 -4 1 5 3 5 72057.84306685 -80921.94791587 -67086.28142449 -4 1 5 3 6 7.01635139 -3071.96216576 -1561.50774755 -4 1 5 3 7 -1556.53738565 3074.92938612 -3.53495566 -4 1 5 3 8 3.23502003 -3077.67165475 534.88163954 -4 2 5 1 1 888.06655807 3068.93067348 94.88677954 -4 2 5 1 2 -540.16264905 -0.47132742 -3074.66158644 -4 2 5 1 3 -0.39634351 1559.98664542 3080.46748332 -4 2 5 1 4 -72109.92474693 67118.39596107 80902.75203543 -4 2 5 1 5 67159.65853443 -72100.92667798 -80924.24028106 -4 2 5 1 6 3054.27667546 889.54481225 -86.89563735 -4 2 5 1 7 -3.66349950 -533.89613675 3077.30744720 -4 2 5 1 8 1552.14547104 -1.60679803 -3069.96973620 -4 2 5 2 1 -3069.32701699 9475.36295481 3068.47005804 -4 2 5 2 2 -540.71967237 0.14996782 1560.14732522 -4 2 5 2 3 1560.64007661 -1.00692676 -536.15636597 -4 2 5 2 4 72113.71679028 -74171.01813734 -72081.98788522 -4 2 5 2 5 -72101.65509308 74162.74848349 72060.64960741 -4 2 5 2 6 -1560.04020535 -0.57844729 542.36931835 -4 2 5 2 7 537.74174003 -0.78197504 -1559.24751832 -4 2 5 2 8 3059.64338088 -9464.82235975 -3054.46949123 -4 2 5 3 1 94.67253981 -3066.99180386 888.12011800 -4 2 5 3 2 -81.13258843 -891.18374624 3057.27603178 -4 2 5 3 3 3080.62816312 537.97740374 -0.47132742 -4 2 5 3 4 80904.42310538 -67093.73696734 -72063.28475617 -4 2 5 3 5 -80923.98319337 72062.10643762 67085.91721694 -4 2 5 3 6 -3076.60045606 3.51353169 -534.09966450 -4 2 5 3 7 3074.96152208 -1556.52667366 3.55637964 -4 2 5 3 8 -3072.99051650 5.07748177 1562.87888187 -4 3 5 1 1 -1.58537405 3078.94638119 -537.81672393 -4 3 5 1 2 1560.58651668 -3074.75799433 -0.68556716 -4 3 5 1 3 -0.21423974 3080.31751550 1555.20909928 -4 3 5 1 4 -72075.29289344 80900.22400653 67090.52337128 -4 3 5 1 5 67095.81509279 -80906.99398222 -72056.42908459 -4 3 5 1 6 3062.98552077 -92.48729449 891.40869797 -4 3 5 1 7 889.60908418 93.36567741 3056.70829648 -4 3 5 1 8 -531.95726712 -3078.65715754 0.74983908 -4 3 5 2 1 3080.63887511 -0.43919146 -1554.99485954 -4 3 5 2 2 -3074.68301042 1560.53295675 0.50346338 -4 3 5 2 3 3080.78884292 -0.27851166 539.11287434 -4 3 5 2 4 80897.57814578 -72076.97467537 -67092.08732136 -4 3 5 2 5 -80907.37961375 67096.80059558 72055.31503796 -4 3 5 2 6 -3077.67165475 -531.48593970 -0.04284795 -4 3 5 2 7 93.68703702 889.83403590 -3056.89040025 -4 3 5 2 8 -92.91577396 3062.02144196 -890.78740273 -4 3 5 3 1 536.94905300 -1557.46932851 -2.79582857 -4 3 5 3 2 3057.07250403 -3056.72972045 -9482.87205760 -4 3 5 3 3 1557.45861652 -536.92762902 -2.78511658 -4 3 5 3 4 72065.11650593 -72064.76301036 -74082.62282182 -4 3 5 3 5 -72059.20348918 72057.02895585 74119.92196005 -4 3 5 3 6 -1553.81654099 540.29119290 -7.06991132 -4 3 5 3 7 -3064.09956741 3064.05671946 9465.71145466 -4 3 5 3 8 -539.43423395 1554.64136398 -7.60551067 -4 1 6 1 1 -9471.68874332 0.42847947 -1.88530969 -4 1 6 1 2 0.53559934 -0.61058325 -0.10711987 -4 1 6 1 3 9471.73159127 -0.44990345 -2.05670148 -4 1 6 1 4 -1.21045451 -1.39255829 6.94136748 -4 1 6 1 5 9461.21242018 1.22116650 5.87016880 -4 1 6 1 6 4.89537799 1.32828637 -6.87709556 -4 1 6 1 7 -9465.60433479 0.40705550 -1.94958161 -4 1 6 1 8 0.19281576 -0.89980690 0.14996782 -4 1 6 2 1 -3065.44927775 1558.55123918 -3077.98230237 -4 1 6 2 2 -0.66414318 -0.73912709 573.18770452 -4 1 6 2 3 3067.67737102 -1558.48696726 -3078.06799826 -4 1 6 2 4 1.92815763 2.44233300 -2958.47937704 -4 1 6 2 5 -3060.86454738 -1552.70249436 -3072.54061305 -4 1 6 2 6 -1.88530969 -6.91994351 11774.93730853 -4 1 6 2 7 3059.62195690 1557.82282407 -3075.45427347 -4 1 6 2 8 -0.44990345 0.17139179 2914.44239908 -4 1 6 3 1 3061.65723440 -3078.00372634 1559.04399057 -4 1 6 3 2 -1.11404663 2913.81039186 0.54631133 -4 1 6 3 3 3065.94202915 -3078.08942224 -1558.97971865 -4 1 6 3 4 -6.56644794 -2960.02190314 -1.64964598 -4 1 6 3 5 -3056.66544853 -3070.33394376 -1562.62179418 -4 1 6 3 6 -6.72712774 11773.54475024 4.77754614 -4 1 6 3 7 -3056.96538416 -3075.53996937 1557.26580076 -4 1 6 3 8 0.51417537 574.76236659 1.45683021 -4 2 6 1 1 3065.89918120 1561.14354000 -3079.48198053 -4 2 6 1 2 -0.02142397 -0.17139179 2915.20295015 -4 2 6 1 3 -3065.87775722 -1561.07926808 -3079.48198053 -4 2 6 1 4 -0.07498391 7.00563940 11783.82825762 -4 2 6 1 5 3053.62324426 -1560.28658105 -3077.03964753 -4 2 6 1 6 3.81346732 -2.39948506 -2963.36404304 -4 2 6 1 7 -3057.15819993 1555.16625133 -3074.08313915 -4 2 6 1 8 -0.23566371 0.70699113 574.67667069 -4 2 6 2 1 -890.70170683 -0.17139179 -1.15689458 -4 2 6 2 2 0.57844729 0.02142397 -0.55702332 -4 2 6 2 3 886.26694428 0.08569589 -1.15689458 -4 2 6 2 4 5.06676978 0.83553497 6.96279145 -4 2 6 2 5 889.07348483 -0.40705550 3.29929195 -4 2 6 2 6 0.43919146 -0.44990345 -6.87709556 -4 2 6 2 7 -891.34442605 -0.17139179 -1.07119869 -4 2 6 2 8 0.59987126 0.20352775 0.62129524 -4 2 6 3 1 -90.70910467 -539.02717845 -536.64911737 -4 2 6 3 2 3371.64070996 -0.82482299 -0.77126305 -4 2 6 3 3 -90.77337659 -539.15572229 536.62769339 -4 2 6 3 4 -2961.93934879 6.98421543 -0.96407882 -4 2 6 3 5 -87.04560517 542.28362245 -534.31390423 -4 2 6 3 6 -2965.24935273 -5.74162495 -0.53559934 -4 2 6 3 7 -89.98068957 535.36367894 537.80601195 -4 2 6 3 8 2914.02463160 0.11783186 -1.01763875 -4 3 6 1 1 -3065.06364622 -3080.70314703 1556.38741783 -4 3 6 1 2 -0.72841511 573.31624836 -0.78197504 -4 3 6 1 3 -3067.16319565 -3080.68172306 -1556.40884181 -4 3 6 1 4 5.81660886 11784.47097683 -0.34278358 -4 3 6 1 5 3064.78513457 -3078.00372634 -1554.78061981 -4 3 6 1 6 5.73091297 -2961.15737375 -2.91366042 -4 3 6 1 7 3055.67994574 -3072.94766855 1559.92237350 -4 3 6 1 8 0.81411100 2915.69570154 -1.17831855 -4 3 6 2 1 -96.57927347 535.49222279 538.19164347 -4 3 6 2 2 2915.50288578 -0.24637570 -1.30686240 -4 3 6 2 3 -94.41545212 535.55649471 -538.21306745 -4 3 6 2 4 -2955.74782039 6.42719211 -2.48518095 -4 3 6 2 5 -95.87228234 -531.74302739 539.49850587 -4 3 6 2 6 -2958.95070446 -7.62693464 0.89980690 -4 3 6 2 7 -88.56670730 -538.77009076 -536.00639816 -4 3 6 2 8 3374.57579436 0.98550279 -0.43919146 -4 3 6 3 1 -885.38856136 -0.10711987 2.42090903 -4 3 6 3 2 -0.89980690 0.91051888 -1.99242955 -4 3 6 3 3 887.57380667 0.19281576 2.61372479 -4 3 6 3 4 -0.18210378 -1.24259047 -3.96343514 -4 3 6 3 5 892.20138499 -0.59987126 -7.41269490 -4 3 6 3 6 -1.61751001 0.10711987 3.87773924 -4 3 6 3 7 -892.13711307 -0.08569589 2.44233300 -4 3 6 3 8 0.55702332 0.74983908 1.96029359 -4 1 7 1 1 9469.50349801 -3060.32894803 3063.82105575 -4 1 7 1 2 0.64271921 -536.16707796 1555.77683458 -4 1 7 1 3 0.87838292 1556.77304936 -534.87092755 -4 1 7 1 4 -74060.30975321 71902.24074582 -71939.98978750 -4 1 7 1 5 1.09262266 534.61383986 -1556.60165757 -4 1 7 1 6 -9463.10844185 3057.22247185 -3060.00758843 -4 1 7 1 7 74050.93676471 -71899.38064533 71936.81903939 -4 1 7 1 8 0.34278358 -1555.12340339 535.12801523 -4 1 7 2 1 3064.20668728 890.15539551 93.68703702 -4 1 7 2 2 -0.38563153 -535.46008683 -3078.36793390 -4 1 7 2 3 1561.08998006 -0.51417537 3079.05350105 -4 1 7 2 4 66920.29918820 -71901.25524303 80698.90292561 -4 1 7 2 5 -537.74174003 2.07812545 3074.42592273 -4 1 7 2 6 -0.11783186 1557.43719255 -3075.00437002 -4 1 7 2 7 -71897.54889558 66928.76165781 -80701.76302610 -4 1 7 2 8 890.23037941 3058.80784590 -90.81622454 -4 1 7 3 1 -3059.57910895 90.83764851 889.48054033 -4 1 7 3 2 -884.51017843 -101.45322749 3065.36358186 -4 1 7 3 3 540.19478501 3075.30430566 0.47132742 -4 1 7 3 4 -66970.30274283 80708.32947404 -71949.58772772 -4 1 7 3 5 -1559.75098171 3079.71764424 -1.64964598 -4 1 7 3 6 -2.21738128 -3075.60424129 1556.98728910 -4 1 7 3 7 71936.66907157 -80703.77687963 66976.95488667 -4 1 7 3 8 -0.47132742 -3073.19404425 -537.62390817 -4 2 7 1 1 -0.44990345 -1561.74341126 3079.73906821 -4 2 7 1 2 535.81358239 0.53559934 -3078.19654211 -4 2 7 1 3 -890.35892326 -3064.14241535 93.70846099 -4 2 7 1 4 71905.44362989 -66921.68103450 80700.27405993 -4 2 7 1 5 -2.24951724 537.65604413 3074.40449876 -4 2 7 1 6 -3056.98680814 -889.00921291 -92.10166296 -4 2 7 1 7 -66934.21405912 71898.48083844 -80702.48072922 -4 2 7 1 8 -1557.05156102 -0.05355993 -3075.19718579 -4 2 7 2 1 -1555.93751439 -0.06427192 -535.36367894 -4 2 7 2 2 536.02782213 -0.58915928 1555.58401882 -4 2 7 2 3 3061.16448301 -9468.73223495 3064.35665509 -4 2 7 2 4 -71906.13990904 74059.80628983 -71941.46804168 -4 2 7 2 5 -534.33532821 -0.81411100 -1556.58023360 -4 2 7 2 6 1554.09505265 -0.74983908 535.89927829 -4 2 7 2 7 71901.76941840 -74052.84349837 71936.95829522 -4 2 7 2 8 -3056.81541635 9464.09394464 -3059.30059730 -4 2 7 3 1 3076.31123242 540.66611244 -1.14618259 -4 2 7 3 2 -101.95669087 -884.86367400 -3065.44927775 -4 2 7 3 3 90.40916904 -3060.60745969 -890.20895544 -4 2 7 3 4 80704.86950229 -66967.82827387 71949.52345579 -4 2 7 3 5 3079.81405212 -1559.81525363 1.90673366 -4 2 7 3 6 -3074.95081009 -1.90673366 538.83436268 -4 2 7 3 7 -80698.02454269 71937.30107879 -66975.86226401 -4 2 7 3 8 -3076.54689613 -2.86010049 -1557.45861652 -4 3 7 1 1 5.48453727 3079.31058874 -1557.96207990 -4 3 7 1 2 1556.96586512 -3078.74285344 -0.55702332 -4 3 7 1 3 2.77440459 3075.30430566 537.95597976 -4 3 7 1 4 -71947.45604233 80700.16694006 -66984.34615759 -4 3 7 1 5 891.07662637 93.36567741 -3062.70700912 -4 3 7 1 6 3057.27603178 -88.43816346 -890.61601094 -4 3 7 1 7 66971.77028503 -80709.42209670 71957.31107024 -4 3 7 1 8 -537.80601195 -3071.57653423 0.99621478 -4 3 7 2 1 3075.56139334 2.24951724 -538.30947533 -4 3 7 2 2 -3078.64644555 1557.10512095 0.46061543 -4 3 7 2 3 3077.35029514 2.72084466 1556.10890618 -4 3 7 2 4 80699.50279688 -71939.83981968 66983.63916646 -4 3 7 2 5 93.09787774 890.53031505 3062.98552077 -4 3 7 2 6 -3071.65151814 -537.67746810 -0.87838292 -4 3 7 2 7 -80707.36539523 66966.68209127 -71955.26508075 -4 3 7 2 8 -87.73117233 3058.17583868 891.34442605 -4 3 7 3 1 -1559.30107826 537.32397254 -2.94579638 -4 3 7 3 2 -3067.63452307 3067.61309909 -9457.99882413 -4 3 7 3 3 -534.90306351 1561.78625921 -1.28543842 -4 3 7 3 4 -71944.41383807 71937.89023807 -74124.67808221 -4 3 7 3 5 3058.44363835 -3057.56525543 9466.09708619 -4 3 7 3 6 1560.44726085 -535.77073444 2.18524532 -4 3 7 3 7 71951.70870111 -71950.78747024 74116.21561260 -4 3 7 3 8 535.79215842 -1560.43654886 2.24951724 -4 1 8 1 1 -0.19281576 -886.43833607 -1.15689458 -4 1 8 1 2 -0.00000000 0.23566371 -0.35349557 -4 1 8 1 3 0.10711987 886.37406415 -1.37113432 -4 1 8 1 4 -0.81411100 -1.41398226 8.20538193 -4 1 8 1 5 0.42847947 -891.19445823 3.34213990 -4 1 8 1 6 -0.20352775 0.19281576 0.34278358 -4 1 8 1 7 0.23566371 888.98778894 -1.09262266 -4 1 8 1 8 0.38563153 3.27786798 -8.23751789 -4 1 8 2 1 1561.14354000 3065.96345312 -3079.41770861 -4 1 8 2 2 0.06427192 -0.09640788 2915.23508611 -4 1 8 2 3 -1561.14354000 -3065.96345312 -3079.39628463 -4 1 8 2 4 -6.39505615 -0.72841511 11784.34243299 -4 1 8 2 5 1560.30800502 -3053.68751619 -3076.99679958 -4 1 8 2 6 -0.68556716 0.06427192 574.69809467 -4 1 8 2 7 -1555.14482736 3059.10778153 -3074.08313915 -4 1 8 2 8 1.84246174 -4.65971428 -2964.22100199 -4 1 8 3 1 -538.98433050 -90.73052865 -536.60626942 -4 1 8 3 2 -0.81411100 3371.73711784 0.61058325 -4 1 8 3 3 -539.09145037 -90.75195262 536.62769339 -4 1 8 3 4 6.39505615 -2961.07167785 0.34278358 -4 1 8 3 5 542.24077450 -87.06702914 534.14251244 -4 1 8 3 6 0.10711987 2914.21744736 1.17831855 -4 1 8 3 7 535.29940702 -92.12308694 -537.76316400 -4 1 8 3 8 -5.14175369 -2964.29598590 1.31757438 -4 2 8 1 1 1558.50839123 -3065.49212570 -3078.08942224 -4 2 8 1 2 1.00692676 0.31064762 573.34838433 -4 2 8 1 3 -1558.55123918 3067.63452307 -3077.93945442 -4 2 8 1 4 -3.79204335 -3.79204335 -2957.10824272 -4 2 8 1 5 1552.70249436 3058.59360616 -3072.54061305 -4 2 8 1 6 -0.40705550 -0.02142397 2914.30314325 -4 2 8 1 7 -1557.73712818 -3057.43671158 -3075.58281731 -4 2 8 1 8 8.29107782 0.14996782 11773.71614203 -4 2 8 2 1 0.42847947 -9471.62447140 -1.92815763 -4 2 8 2 2 0.89980690 -0.31064762 -0.23566371 -4 2 8 2 3 -0.42847947 9473.93826056 -1.97100558 -4 2 8 2 4 -0.57844729 2.14239737 6.25580032 -4 2 8 2 5 -1.17831855 -9463.44051345 5.65592906 -4 2 8 2 6 0.69627915 -0.14996782 0.36420755 -4 2 8 2 7 -0.32135961 9463.56905729 -1.97100558 -4 2 8 2 8 0.72841511 -4.01699507 -6.23437635 -4 2 8 3 1 -3078.11084621 3061.63581043 1558.97971865 -4 2 8 3 2 2913.91751173 -0.94265484 -1.18903054 -4 2 8 3 3 -3078.02515032 3065.98487709 -1558.80832686 -4 2 8 3 4 -2960.77174222 -5.76304893 -2.87081248 -4 2 8 3 5 -3070.37679170 -3054.45877924 1562.49325034 -4 2 8 3 6 574.69809467 0.70699113 -0.79268703 -4 2 8 3 7 -3075.45427347 -3061.29302685 -1557.33007268 -4 2 8 3 8 11774.25174137 -5.83803283 -0.42847947 -4 3 8 1 1 535.47079881 -96.60069744 538.38445924 -4 3 8 1 2 -0.44990345 2915.17081419 0.94265484 -4 3 8 1 3 535.53507073 -94.47972404 -538.25591539 -4 3 8 1 4 7.70191855 -2957.60099411 -0.02142397 -4 3 8 1 5 -531.87157123 -91.58748759 -539.45565792 -4 3 8 1 6 1.18903054 3374.34013065 0.92123087 -4 3 8 1 7 -538.70581884 -88.48101141 536.02782213 -4 3 8 1 8 -8.86952511 -2960.78245421 1.60679803 -4 3 8 2 1 -3080.68172306 -3064.99937430 1556.28029797 -4 3 8 2 2 573.32696035 -0.81411100 1.18903054 -4 3 8 2 3 -3080.63887511 -3067.18461962 -1556.40884181 -4 3 8 2 4 11784.55667272 5.76304893 2.93508440 -4 3 8 2 5 -3078.04657429 3062.59988925 1554.60922802 -4 3 8 2 6 2915.72783750 0.92123087 0.79268703 -4 3 8 2 7 -3072.92624457 3057.97231093 -1559.92237350 -4 3 8 2 8 -2961.24306964 5.69877701 0.25708768 -4 3 8 3 1 -0.10711987 -885.36713738 2.48518095 -4 3 8 3 2 -0.85695895 0.19281576 -2.08883744 -4 3 8 3 3 0.12854384 887.61665462 2.52802890 -4 3 8 3 4 0.54631133 -2.54945287 -4.62757832 -4 3 8 3 5 0.38563153 -890.08041160 -7.36984695 -4 3 8 3 6 -0.84624696 -1.09262266 2.01385353 -4 3 8 3 7 0.23566371 892.22280897 2.52802890 -4 3 8 3 8 0.57844729 -1.04977471 4.59544236 -5 1 1 1 1 -0.02142397 -0.03213596 -9.10518883 -5 1 1 1 2 -0.83553497 -890.29465133 -0.14996782 -5 1 1 1 3 0.03213596 -0.04284795 0.87838292 -5 1 1 1 4 0.88909491 890.14468352 -0.29993563 -5 1 1 1 5 -0.11783186 -0.06427192 13.28286370 -5 1 1 1 6 -0.62129524 -889.56623623 -2.35663711 -5 1 1 1 7 0.06427192 0.04284795 0.43919146 -5 1 1 1 8 0.53559934 889.50196431 -2.49589294 -5 1 1 2 1 1.24259047 -1.84246174 2959.80766341 -5 1 1 2 2 1560.54366873 -3071.70507807 3080.36036345 -5 1 1 2 3 -0.16067980 -0.34278358 -573.00560075 -5 1 1 2 4 -1560.55438072 3071.70507807 3080.42463537 -5 1 1 2 5 -1.24259047 -1.82103777 -11776.28701887 -5 1 1 2 6 1553.15239780 3059.42914114 3071.76934999 -5 1 1 2 7 0.14996782 -0.32135961 -2914.66735081 -5 1 1 2 8 -1553.10954986 -3055.03722653 3071.87646986 -5 1 1 3 1 -13.11147191 2961.20022170 0.61058325 -5 1 1 3 2 -536.04924610 94.73681173 538.23449142 -5 1 1 3 3 -0.22495172 -2914.47453504 0.17139179 -5 1 1 3 4 -536.15636597 94.75823570 -538.17021950 -5 1 1 3 5 17.32128274 2964.45666570 -0.68556716 -5 1 1 3 6 534.67811179 87.36696477 -537.69889208 -5 1 1 3 7 -1.24259047 -3373.61171554 -0.07498391 -5 1 1 3 8 534.72095973 85.31026330 537.84885989 -5 2 1 1 1 -1.30686240 1.78890180 -11786.34557453 -5 2 1 1 2 1560.86502834 3071.46941436 3081.45298611 -5 2 1 1 3 0.17139179 0.34278358 -2915.31007002 -5 2 1 1 4 -1560.79004443 -3071.38371847 3081.45298611 -5 2 1 1 5 1.31757438 1.73534187 2966.06346373 -5 2 1 1 6 1558.07991176 -3056.30124098 3073.65465968 -5 2 1 1 7 -0.19281576 0.36420755 -574.32317513 -5 2 1 1 8 -1558.05848778 3051.86647842 3073.59038776 -5 2 1 2 1 -0.00000000 -0.04284795 -8.81596518 -5 2 1 2 2 0.79268703 -9474.68809964 0.85695895 -5 2 1 2 3 -0.04284795 -0.04284795 -0.17139179 -5 2 1 2 4 -0.80339901 9474.62382772 1.11404663 -5 2 1 2 5 -0.00000000 -0.00000000 13.36855959 -5 2 1 2 6 -0.12854384 -9456.11351444 -2.91366042 -5 2 1 2 7 -0.06427192 0.02142397 -0.20352775 -5 2 1 2 8 0.06427192 9456.19921033 -2.96722036 -5 2 1 3 1 -11784.51382478 -4.48832249 -0.02142397 -5 2 1 3 2 3081.75292174 3064.99937430 1556.30172194 -5 2 1 3 3 -573.29482439 1.69249392 0.02142397 -5 2 1 3 4 3081.80648168 3065.04222225 -1556.32314591 -5 2 1 3 5 2961.16808574 -4.32764269 -0.04284795 -5 2 1 3 6 3074.46877068 -3061.35729877 1557.35149665 -5 2 1 3 7 -2915.73854949 -0.08569589 0.01071199 -5 2 1 3 8 3074.53304260 -3061.34658679 -1557.33007268 -5 3 1 1 1 -12.21166501 2959.22921612 -0.58915928 -5 3 1 1 2 538.27733937 94.05124457 -536.52057352 -5 3 1 1 3 1.39255829 -3372.17630930 -0.10711987 -5 3 1 1 4 538.19164347 94.00839662 536.45630160 -5 3 1 1 5 13.76490311 2962.50708409 0.64271921 -5 3 1 1 6 -539.45565792 87.28126888 536.07067008 -5 3 1 1 7 -0.29993563 -2914.66735081 0.07498391 -5 3 1 1 8 -539.54135382 89.50936214 -536.02782213 -5 3 1 2 1 2958.07232153 10.61557897 -0.03213596 -5 3 1 2 2 3081.15305048 -3064.33523112 1558.27272752 -5 3 1 2 3 -2913.56401616 1.26401445 0.02142397 -5 3 1 2 4 3081.17447445 -3064.24953522 -1558.29415149 -5 3 1 2 5 -11771.71300049 13.11147191 0.02142397 -5 3 1 2 6 3069.81976839 3052.95910108 1560.60794065 -5 3 1 2 7 -574.99803030 -2.23880525 0.03213596 -5 3 1 2 8 3069.84119236 3052.93767711 -1560.51153277 -5 3 1 3 1 0.04284795 0.02142397 8.22680590 -5 3 1 3 2 -0.10711987 -886.33121620 -1.94958161 -5 3 1 3 3 0.02142397 0.06427192 2.63514877 -5 3 1 3 4 0.12854384 886.43833607 -2.05670148 -5 3 1 3 5 0.04284795 0.04284795 -10.32635533 -5 3 1 3 6 0.14996782 -891.30157810 2.91366042 -5 3 1 3 7 0.02142397 -0.03213596 -2.23880525 -5 3 1 3 8 -0.21423974 891.24801816 2.94579638 -5 1 2 1 1 -1.30686240 1559.55816594 -536.94905300 -5 1 2 1 2 -74173.54616623 72114.10242181 -72080.03830361 -5 1 2 1 3 9477.33396039 -3068.19154638 3067.09892373 -5 1 2 1 4 0.21423974 -540.82679224 1560.32942900 -5 1 2 1 5 74162.80204342 -72101.41942937 72062.32067736 -5 1 2 1 6 -1.03906272 -1561.01499615 541.68375119 -5 1 2 1 7 -0.49275140 537.69889208 -1559.06541455 -5 1 2 1 8 -9463.82614497 3060.06114836 -3055.20861832 -5 1 2 2 1 -888.13082999 -3068.93067348 94.91891551 -5 1 2 2 2 72109.71050720 -67118.04246551 80902.60206761 -5 1 2 2 3 0.37491954 -1560.07234131 3080.55317921 -5 1 2 2 4 540.15193707 0.51417537 -3074.64016247 -5 1 2 2 5 -67159.40144675 72100.60531837 -80923.96176940 -5 1 2 2 6 -1552.13475905 1.52110213 -3069.96973620 -5 1 2 2 7 3.68492348 533.86400078 3077.29673521 -5 1 2 2 8 -3054.28738745 -889.59837219 -86.90634934 -5 1 2 3 1 -0.96407882 3079.87832404 538.44873116 -5 1 2 3 2 -72076.78185961 80900.02047878 -67092.25871315 -5 1 2 3 3 -0.25708768 3080.53175524 -1555.10197941 -5 1 2 3 4 1560.81146840 -3074.42592273 0.47132742 -5 1 2 3 5 67095.39732530 -80910.50751391 72055.91490922 -5 1 2 3 6 -530.69325268 -3076.84683176 0.42847947 -5 1 2 3 7 889.67335610 93.55849317 -3056.79399237 -5 1 2 3 8 3062.79270501 -92.16593488 -891.29086611 -5 2 2 1 1 1560.02949336 -0.34278358 3080.55317921 -5 2 2 1 2 67116.25356370 -72107.95374135 80901.40232508 -5 2 2 1 3 3068.87711354 888.06655807 94.95105147 -5 2 2 1 4 -0.61058325 -540.11980111 -3074.89725015 -5 2 2 1 5 -72098.23796928 67157.04480964 -80923.70468171 -5 2 2 1 6 889.99471570 3055.25146627 -86.12437430 -5 2 2 1 7 -533.88542476 -3.66349950 3077.27531124 -5 2 2 1 8 -2.57087684 1551.70627958 -3069.28416904 -5 2 2 2 1 3068.21297036 -9477.30182443 3067.09892373 -5 2 2 2 2 -72113.95245399 74173.65328610 -72080.02759163 -5 2 2 2 3 -1559.56887793 1.30686240 -536.92762902 -5 2 2 2 4 540.81608025 -0.23566371 1560.30800502 -5 2 2 2 5 72101.40871738 -74162.81275541 72062.36352530 -5 2 2 2 6 -3060.07186035 9463.84756895 -3055.18719435 -5 2 2 2 7 -537.67746810 0.50346338 -1559.04399057 -5 2 2 2 8 1560.97214821 1.01763875 541.68375119 -5 2 2 3 1 3080.48890729 -0.29993563 1555.09126742 -5 2 2 3 2 80900.03119077 -72076.84613153 67092.29084911 -5 2 2 3 3 3079.86761205 -0.96407882 -538.42730718 -5 2 2 3 4 -3074.40449876 1560.80075642 -0.40705550 -5 2 2 3 5 -80910.51822590 67095.42946126 -72055.91490922 -5 2 2 3 6 -92.09095098 3062.81412898 891.23730618 -5 2 2 3 7 93.55849317 889.69478007 3056.82612833 -5 2 2 3 8 -3076.91110368 -530.67182870 -0.46061543 -5 3 2 1 1 537.91313182 3080.69243504 -0.37491954 -5 3 2 1 2 -67092.62292071 80902.98769914 -72062.15999755 -5 3 2 1 3 -3066.97037988 94.71538776 888.08798204 -5 3 2 1 4 -891.09805035 -81.21828432 3057.39386364 -5 3 2 1 5 72060.04973614 -80922.01218779 67086.06718475 -5 3 2 1 6 3.08505221 -3077.55382289 -534.82807960 -5 3 2 1 7 -1556.55880962 3074.97223406 3.57780361 -5 3 2 1 8 6.06298456 -3072.57274901 1562.17189073 -5 3 2 2 1 94.73681173 -3066.95966790 -888.13082999 -5 3 2 2 2 80903.00912311 -67092.44081693 72062.20284550 -5 3 2 2 3 3080.67101107 537.89170784 0.40705550 -5 3 2 2 4 -81.22899631 -891.04449041 -3057.41528761 -5 3 2 2 5 -80922.00147580 72060.00688820 -67086.04576078 -5 3 2 2 6 -3072.59417298 6.06298456 -1562.15046676 -5 3 2 2 7 3075.00437002 -1556.56952161 -3.54566765 -5 3 2 2 8 -3077.53239892 3.07434023 534.81736761 -5 3 2 3 1 -536.86335710 1557.44790453 -2.81725254 -5 3 2 3 2 -72066.28411249 72066.61618409 -74083.90826025 -5 3 2 3 3 -1557.44790453 536.94905300 -2.82796453 -5 3 2 3 4 -3056.81541635 3057.09392801 -9483.02202541 -5 3 2 3 5 72059.08565733 -72061.33517457 74120.22189568 -5 3 2 3 6 540.68753641 -1552.85246217 -6.34149622 -5 3 2 3 7 3064.03529549 -3064.05671946 9465.72216665 -5 3 2 3 8 1553.68799715 -539.86271342 -6.89851953 -5 1 3 1 1 -0.06427192 0.02142397 -0.26779967 -5 1 3 1 2 9474.66667567 -0.81411100 0.81411100 -5 1 3 1 3 -0.04284795 -0.02142397 -8.76240525 -5 1 3 1 4 -9474.62382772 0.70699113 0.47132742 -5 1 3 1 5 0.05355993 -0.02142397 13.47567946 -5 1 3 1 6 -9456.19921033 -0.02142397 -2.82796453 -5 1 3 1 7 0.04284795 0.05355993 -0.14996782 -5 1 3 1 8 9456.13493841 -0.00000000 -3.07434023 -5 1 3 2 1 -0.00000000 -0.01071199 -2915.58858168 -5 1 3 2 2 -3069.28416904 -1560.73648450 3081.34586624 -5 1 3 2 3 -0.02142397 -0.00000000 -11786.27059062 -5 1 3 2 4 3069.24132110 1560.77933244 3081.23874637 -5 1 3 2 5 -0.04284795 -0.00000000 2965.97776783 -5 1 3 2 6 -3056.27981700 1558.10133573 3073.61181173 -5 1 3 2 7 0.02142397 0.06427192 -574.32317513 -5 1 3 2 8 3056.32266495 -1558.04777580 3073.62252372 -5 1 3 3 1 0.77126305 -573.03773671 0.02142397 -5 1 3 3 2 3069.30559302 3081.73149777 -1556.32314591 -5 1 3 3 3 -9.03020492 -11786.35628651 0.55702332 -5 1 3 3 4 3069.30559302 3081.79576969 1556.28029797 -5 1 3 3 5 -8.85881313 2963.14980330 -0.62129524 -5 1 3 3 6 -3059.15062948 3074.46877068 1557.26580076 -5 1 3 3 7 -0.85695895 -2916.01706115 -0.02142397 -5 1 3 3 8 -3061.44299467 3074.31880286 -1557.37292062 -5 2 3 1 1 -0.00000000 -0.01071199 -573.01631273 -5 2 3 1 2 3069.39128891 -1560.56509271 3080.57460319 -5 2 3 1 3 0.05355993 -0.06427192 2959.63627162 -5 2 3 1 4 -3069.53054474 1560.45797284 3080.51033127 -5 2 3 1 5 0.04284795 -0.04284795 -11776.37271477 -5 2 3 1 6 3059.40771717 1553.10954986 3071.94074178 -5 2 3 1 7 0.04284795 -0.00000000 -2914.74233471 -5 2 3 1 8 -3059.38629319 -1553.09883787 3071.76934999 -5 2 3 2 1 0.08569589 -0.05355993 1.00692676 -5 2 3 2 2 890.20895544 0.85695895 -0.19281576 -5 2 3 2 3 -0.00000000 -0.14996782 -7.88402232 -5 2 3 2 4 -890.19824345 -0.92123087 0.17139179 -5 2 3 2 5 -0.06427192 -0.04284795 12.08312117 -5 2 3 2 6 -887.48811078 -0.40705550 -2.52802890 -5 2 3 2 7 0.08569589 0.02142397 0.21423974 -5 2 3 2 8 887.38099091 0.57844729 -2.46375698 -5 2 3 3 1 -2915.01013439 -0.34278358 -0.03213596 -5 2 3 3 2 94.77965968 -536.09209405 -538.29876334 -5 2 3 3 3 2958.49008902 -11.20473825 0.12854384 -5 2 3 3 4 94.80108365 -536.11351802 538.29876334 -5 2 3 3 5 2961.76795700 15.44668504 -0.04284795 -5 2 3 3 6 89.61648201 534.74238371 -537.78458797 -5 2 3 3 7 -3374.10446694 -0.95336683 -0.00000000 -5 2 3 3 8 89.70217791 534.71024775 537.74174003 -5 3 3 1 1 1.92815763 -2913.87466378 0.02142397 -5 3 3 1 2 -3068.74856970 3081.11020253 -1558.22987957 -5 3 3 1 3 14.19338258 2960.87886209 -0.06427192 -5 3 3 1 4 -3068.67358579 3081.21732240 1558.16560765 -5 3 3 1 5 16.67856353 -11774.20889342 -0.00000000 -5 3 3 1 6 3053.08764492 3069.84119236 1560.65078860 -5 3 3 1 7 -1.47825419 -574.68738268 -0.05355993 -5 3 3 1 8 3052.98052505 3069.83048037 -1560.55438072 -5 3 3 2 1 -3372.13346135 1.29615041 -0.00000000 -5 3 3 2 2 94.05124457 538.27733937 536.60626942 -5 3 3 2 3 2959.32562400 -12.16881707 0.72841511 -5 3 3 2 4 94.01910861 538.25591539 -536.54199750 -5 3 3 2 5 2962.52850807 13.71134317 -0.57844729 -5 3 3 2 6 89.53078612 -539.47708190 536.02782213 -5 3 3 2 7 -2914.64592683 -0.31064762 -0.10711987 -5 3 3 2 8 87.38838875 -539.54135382 -536.04924610 -5 3 3 3 1 0.14996782 -0.11783186 2.69942069 -5 3 3 3 2 886.39548812 0.10711987 -2.03527750 -5 3 3 3 3 0.97479080 0.66414318 8.84810114 -5 3 3 3 4 -888.46290158 -0.02142397 -1.84246174 -5 3 3 3 5 0.92123087 -0.59987126 -10.92622659 -5 3 3 3 6 -891.32300207 0.08569589 2.95650837 -5 3 3 3 7 0.14996782 0.07498391 -2.28165320 -5 3 3 3 8 891.28015412 -0.08569589 2.81725254 -5 1 4 1 1 1.28543842 -1559.56887793 -536.91691704 -5 1 4 1 2 -0.34278358 540.64468846 1560.22230913 -5 1 4 1 3 -9477.33396039 3068.19154638 3067.09892373 -5 1 4 1 4 74173.97464571 -72114.61659717 -72080.20969540 -5 1 4 1 5 -74162.52353176 72103.32616303 72061.87077391 -5 1 4 1 6 9463.94397683 -3060.22182817 -3055.10149845 -5 1 4 1 7 0.53559934 -537.76316400 -1559.02256660 -5 1 4 1 8 0.36420755 1560.10447727 542.32647040 -5 1 4 2 1 888.04513410 3068.93067348 94.89749153 -5 1 4 2 2 -540.16264905 -0.53559934 -3074.64016247 -5 1 4 2 3 -0.35349557 1560.05091734 3080.46748332 -5 1 4 2 4 -72109.66765925 67117.96748160 80902.68776351 -5 1 4 2 5 67159.33717483 -72100.41250261 -80923.76895363 -5 1 4 2 6 3054.26596348 889.56623623 -86.89563735 -5 1 4 2 7 -3.64207553 -533.89613675 3077.28602322 -5 1 4 2 8 1552.14547104 -1.56395008 -3070.03400812 -5 1 4 3 1 -0.89980690 3079.84618808 -538.47015513 -5 1 4 3 2 1560.86502834 -3074.46877068 -0.46061543 -5 1 4 3 3 -0.28922365 3080.53175524 1555.08055544 -5 1 4 3 4 -72076.52477192 80899.60271129 67091.98020149 -5 1 4 3 5 67095.01169377 -80910.10045841 -72055.57212564 -5 1 4 3 6 3062.79270501 -92.12308694 891.23730618 -5 1 4 3 7 889.73762802 93.55849317 3056.79399237 -5 1 4 3 8 -530.71467665 -3076.86825574 -0.49275140 -5 2 4 1 1 -1560.00806939 0.36420755 3080.55317921 -5 2 4 1 2 0.64271921 540.07695316 -3074.81155426 -5 2 4 1 3 -3068.90924950 -888.04513410 94.86535557 -5 2 4 1 4 -67116.39281953 72107.97516533 80901.33805316 -5 2 4 1 5 72098.30224120 -67157.10908156 -80923.87607350 -5 2 4 1 6 2.58158883 -1551.67414362 -3069.24132110 -5 2 4 1 7 533.94969668 3.65278752 3077.29673521 -5 2 4 1 8 -890.01613968 -3055.26217825 -86.18864622 -5 2 4 2 1 -3068.25581831 9477.33396039 3067.09892373 -5 2 4 2 2 -540.65540045 0.28922365 1560.21159714 -5 2 4 2 3 1559.59030190 -1.30686240 -536.97047697 -5 2 4 2 4 72115.03436466 -74174.42454916 -72080.83099064 -5 2 4 2 5 -72103.56182674 74162.87702733 72062.02074173 -5 2 4 2 6 -1560.14732522 -0.40705550 542.28362245 -5 2 4 2 7 537.76316400 -0.54631133 -1559.03327859 -5 2 4 2 8 3060.22182817 -9463.93326484 -3055.06936249 -5 2 4 3 1 3080.48890729 -0.29993563 -1555.11269140 -5 2 4 3 2 -3074.68301042 1560.55438072 0.46061543 -5 2 4 3 3 3079.88903603 -0.92123087 538.47015513 -5 2 4 3 4 80899.31348765 -72076.63189179 -67091.89450560 -5 2 4 3 5 -80907.86165316 67097.03625929 72055.50785372 -5 2 4 3 6 -3077.70379071 -531.46451573 -0.00000000 -5 2 4 3 7 93.62276510 889.69478007 -3056.79399237 -5 2 4 3 8 -92.91577396 3062.00001798 -890.76597876 -5 3 4 1 1 537.91313182 3080.66029908 0.43919146 -5 3 4 1 2 -891.15161028 -81.20757233 -3057.43671158 -5 3 4 1 3 -3066.95966790 94.71538776 -888.10940602 -5 3 4 1 4 -67092.34440905 80902.83773132 72062.17070954 -5 3 4 1 5 72059.95332826 -80921.90506792 -67086.06718475 -5 3 4 1 6 6.06298456 -3072.60488497 -1562.19331471 -5 3 4 1 7 -1556.51596168 3074.95081009 -3.55637964 -5 3 4 1 8 3.10647619 -3077.56453488 534.79594364 -5 3 4 2 1 94.73681173 -3066.94895591 888.10940602 -5 3 4 2 2 -81.19686035 -891.10876234 3057.44742357 -5 3 4 2 3 3080.68172306 537.95597976 -0.38563153 -5 3 4 2 4 80902.84844331 -67092.36583302 -72062.02074173 -5 3 4 2 5 -80921.91577991 72059.92119230 67085.89579296 -5 3 4 2 6 -3077.54311091 3.10647619 -534.74238371 -5 3 4 2 7 3074.96152208 -1556.56952161 3.53495566 -5 3 4 2 8 -3072.60488497 6.08440853 1562.17189073 -5 3 4 3 1 536.88478108 -1557.44790453 -2.76369261 -5 3 4 3 2 3057.02965608 -3056.72972045 -9482.85063362 -5 3 4 3 3 1557.44790453 -536.88478108 -2.82796453 -5 3 4 3 4 72064.98796208 -72064.74158639 -74082.62282182 -5 3 4 3 5 -72059.06423335 72056.85756406 74120.05050389 -5 3 4 3 6 -1553.84867695 540.24834495 -7.11275927 -5 3 4 3 7 -3064.05671946 3064.03529549 9465.70074267 -5 3 4 3 8 -539.39138600 1554.68421192 -7.66978259 -5 1 5 1 1 0.77126305 -1.06048670 16.05726829 -5 1 5 1 2 74158.14232914 -67155.81293115 67095.98648458 -5 1 5 1 3 -0.26779967 0.04284795 -8.09826206 -5 1 5 1 4 -74157.97093735 67155.84506711 67095.77224484 -5 1 5 1 5 -2.11026141 -1.92815763 -387.68822819 -5 1 5 1 6 -73990.13552734 -66819.74576761 -66907.41266802 -5 1 5 1 7 1.37113432 1.03906272 8.13039802 -5 1 5 1 8 73990.15695131 66821.92030094 -66912.20092614 -5 1 5 2 1 -0.00000000 0.08569589 2959.14352022 -5 1 5 2 2 -72101.71936500 72101.71936500 -80905.50501605 -5 1 5 2 3 0.01071199 -0.06427192 2959.10067227 -5 1 5 2 4 72101.88004481 -72101.89075679 -80905.79423969 -5 1 5 2 5 -0.06427192 0.29993563 328882.97674338 -5 1 5 2 6 -71808.43587695 -71808.42516497 -80608.60087644 -5 1 5 2 7 0.06427192 -0.08569589 -11773.06271083 -5 1 5 2 8 71808.40374099 71808.26448516 -80608.27951684 -5 1 5 3 1 14.41833430 -11771.85225631 -1.25330246 -5 1 5 3 2 72062.59918902 -80922.22642753 72055.34717392 -5 1 5 3 3 12.57587257 2960.87886209 -0.19281576 -5 1 5 3 4 72062.17070954 -80921.94791587 -72054.97225438 -5 1 5 3 5 -387.76321210 328883.51234273 1.00692676 -5 1 5 3 6 -71879.94910118 -80593.49697498 -71890.75749592 -5 1 5 3 7 -4.11340295 2953.94820660 0.07498391 -5 1 5 3 8 -71879.85269330 -80588.96580454 71890.48969625 -5 2 5 1 1 -0.00000000 0.02142397 2959.18636817 -5 2 5 1 2 -72101.74078898 72101.63366911 -80905.55857598 -5 2 5 1 3 -0.01071199 -0.04284795 2959.16494419 -5 2 5 1 4 72101.86933282 -72101.91218077 -80905.62284790 -5 2 5 1 5 -0.09640788 0.25708768 328883.16955915 -5 2 5 1 6 -71808.35018106 -71808.53228483 -80608.51518055 -5 2 5 1 7 0.02142397 -0.08569589 -11773.00915089 -5 2 5 1 8 71808.42516497 71808.39302900 -80608.39734869 -5 2 5 2 1 0.12854384 -0.09640788 -7.85188636 -5 2 5 2 2 67156.12357877 -74158.05663324 67095.99719656 -5 2 5 2 3 -0.22495172 0.10711987 18.08183381 -5 2 5 2 4 -67155.74865923 74157.99236132 67095.85794074 -5 2 5 2 5 -1.47825419 -1.02835074 -389.61638582 -5 2 5 2 6 -66817.62479421 -73990.13552734 -66907.71260365 -5 2 5 2 7 1.37113432 1.30686240 7.93758226 -5 2 5 2 8 66817.64621819 73990.07125541 -66912.26519806 -5 2 5 3 1 2965.52786438 18.09254579 0.05355993 -5 2 5 3 2 -80923.68325774 72056.15057293 -72055.21863007 -5 2 5 3 3 -11768.79934006 15.44668504 -0.00000000 -5 2 5 3 4 -80923.01911455 72055.52927769 72054.52235093 -5 2 5 3 5 328878.97046030 -384.32466432 0.29993563 -5 2 5 3 6 -80591.86875298 -71878.63152680 -71889.60060134 -5 2 5 3 7 2955.18008508 -3.02078029 -0.01071199 -5 2 5 3 8 -80592.25438450 -71879.03858230 71889.96480889 -5 3 5 1 1 14.50403020 -11771.85225631 -1.28543842 -5 3 5 1 2 72062.38494928 -80922.01218779 72055.16507014 -5 3 5 1 3 12.51160064 2960.90028606 -0.19281576 -5 3 5 1 4 72062.24569345 -80921.92649189 -72055.10079822 -5 3 5 1 5 -387.61324428 328883.38379888 1.52110213 -5 3 5 1 6 -71880.03479708 -80593.66836677 -71890.67180002 -5 3 5 1 7 -4.09197898 2954.00176653 0.22495172 -5 3 5 1 8 -71879.80984535 -80588.98722851 71890.51112022 -5 3 5 2 1 2965.48501644 18.11396977 0.02142397 -5 3 5 2 2 -80923.81180158 72056.08630101 -72055.24005405 -5 3 5 2 3 -11768.74578013 15.55380491 0.06427192 -5 3 5 2 4 -80922.76202687 72055.05795027 72054.09387145 -5 3 5 2 5 328878.61696473 -384.17469650 0.59987126 -5 3 5 2 6 -80591.80448106 -71878.58867885 -71889.34351365 -5 3 5 2 7 2955.26578098 -3.03149228 -0.00000000 -5 3 5 2 8 -80592.34008040 -71879.08143025 71889.85768902 -5 3 5 3 1 0.85695895 -1.04977471 -9.97285976 -5 3 5 3 2 67081.95378180 -67081.96449379 74113.44120800 -5 3 5 3 3 -0.27851166 -0.04284795 -9.23373267 -5 3 5 3 4 -67081.82523796 67081.99662975 74113.32337615 -5 3 5 3 5 -2.04598949 -1.90673366 28.47246106 -5 3 5 3 6 -66906.80208477 -66906.72710086 -74110.49541162 -5 3 5 3 7 1.39255829 1.07119869 -10.62629096 -5 3 5 3 8 66906.83422073 66909.01946604 -74114.80163033 -5 1 6 1 1 -0.96407882 1553.77369304 534.26034430 -5 1 6 1 2 -0.62129524 -1552.55252654 -531.60377156 -5 1 6 1 3 -9459.56277421 -3053.08764492 -3057.90803901 -5 1 6 1 4 9463.10844185 3055.52997792 3062.21425772 -5 1 6 1 5 -73991.82802126 -71805.44723262 -71878.37443912 -5 1 6 1 6 73991.34598185 71801.89085298 71869.24782632 -5 1 6 1 7 -0.92123087 533.96040867 1555.38049107 -5 1 6 1 8 -0.70699113 -533.93898469 -1553.50589337 -5 1 6 2 1 -890.89452260 3056.08700124 90.58056083 -5 1 6 2 2 -1559.83667760 0.82482299 -3077.51097495 -5 1 6 2 3 0.64271921 1557.43719255 3074.04029121 -5 1 6 2 4 -3059.60053293 889.52338828 -93.55849317 -5 1 6 2 5 -66822.94865168 -71804.35460996 -80591.07606595 -5 1 6 2 6 71802.79065988 66839.32727958 80599.21717596 -5 1 6 2 7 -2.67799671 -537.82743592 3077.45741501 -5 1 6 2 8 532.68568223 -1.10333465 -3079.13919695 -5 1 6 3 1 -3.89916321 3073.27974014 -538.95219454 -5 1 6 3 2 542.86206974 -3070.77313522 -0.07498391 -5 1 6 3 3 -4.30621871 3075.06864194 1558.01563984 -5 1 6 3 4 -3054.25525149 -87.21699696 890.10183557 -5 1 6 3 5 -66913.49707655 -80606.32993523 -71895.12798655 -5 1 6 3 6 71873.00773370 80595.38228466 66916.28219313 -5 1 6 3 7 -885.60280109 101.50678742 3068.98423341 -5 1 6 3 8 -1554.43783623 -3080.94952273 0.49275140 -5 2 6 1 1 1558.31557547 -0.20352775 3074.65087446 -5 2 6 1 2 889.73762802 -3059.54697299 -93.65490106 -5 2 6 1 3 3057.00823211 -891.79432949 90.02353751 -5 2 6 1 4 1.69249392 -1560.52224476 -3078.06799826 -5 2 6 1 5 -71806.19707170 -66823.21645135 -80591.16176184 -5 2 6 1 6 66838.00970519 71805.74716825 80599.73135133 -5 2 6 1 7 -537.52750029 -2.93508440 3077.40385508 -5 2 6 1 8 -0.85695895 532.57856236 -3079.06421304 -5 2 6 2 1 -3053.13049287 -9459.53063825 -3057.89732702 -5 2 6 2 2 3055.44428203 9463.12986583 3062.19283375 -5 2 6 2 3 1553.78440503 -0.87838292 534.27105629 -5 2 6 2 4 -1552.57395051 -0.66414318 -531.59305957 -5 2 6 2 5 -71806.10066382 -73992.47074047 -71878.76007064 -5 2 6 2 6 71802.52286021 73992.02083702 71869.80484963 -5 2 6 2 7 534.01396860 -0.86767094 1555.41262703 -5 2 6 2 8 -533.92827271 -0.72841511 -1553.47375741 -5 2 6 3 1 3074.68301042 -4.55259441 1558.21916759 -5 2 6 3 2 -87.23842093 -3054.21240354 890.11254756 -5 2 6 3 3 3071.41585443 -2.61372479 -537.65604413 -5 2 6 3 4 -3070.77313522 542.81922179 -0.06427192 -5 2 6 3 5 -80608.76155624 -66915.48950610 -71896.92760035 -5 2 6 3 6 80600.23481471 71873.74686080 66916.92491234 -5 2 6 3 7 101.05688397 -885.42069732 3068.80212964 -5 2 6 3 8 -3080.91738677 -1554.39498828 0.50346338 -5 3 6 1 1 -539.32711408 3069.44484885 0.35349557 -5 3 6 1 2 3.77061937 -3073.14048431 539.64847369 -5 3 6 1 3 3053.62324426 86.55285377 -891.32300207 -5 3 6 1 4 5.84874482 -3077.12534342 -1554.86631570 -5 3 6 1 5 -71877.87097573 -80588.71942884 -66910.19778460 -5 3 6 1 6 66912.12594223 80611.81447250 71886.60124502 -5 3 6 1 7 1558.22987957 3080.91738677 2.52802890 -5 3 6 1 8 883.63179551 -109.74430531 -3072.56203702 -5 3 6 2 1 86.55285377 3053.75178811 -891.32300207 -5 3 6 2 2 -3076.48262421 4.88466601 -1554.29858040 -5 3 6 2 3 3069.41271289 -539.32711408 0.34278358 -5 3 6 2 4 -3073.23689219 3.59922758 539.73416958 -5 3 6 2 5 -80588.69800487 -71875.71786638 -66910.32632844 -5 3 6 2 6 80611.33243309 66911.16186341 71885.95852581 -5 3 6 2 7 3080.85311485 1558.15489566 2.54945287 -5 3 6 2 8 -109.64789743 883.39613180 -3072.64773292 -5 3 6 3 1 536.17778994 1560.17946118 3.10647619 -5 3 6 3 2 -533.47836926 -1563.91794459 -6.05227257 -5 3 6 3 3 1560.20088515 536.24206187 3.04220427 -5 3 6 3 4 -1563.11454558 -534.27105629 -6.64143185 -5 3 6 3 5 -71893.03914912 -71890.90746373 -74117.05114757 -5 3 6 3 6 71886.49412515 71886.21561349 74133.84754296 -5 3 6 3 7 -3064.48519893 -3064.43163900 -9458.98432692 -5 3 6 3 8 3071.12663078 3070.84811912 9448.22949211 -5 1 7 1 1 -0.12854384 0.06427192 -0.77126305 -5 1 7 1 2 -0.77126305 2.42090903 890.08041160 -5 1 7 1 3 0.10711987 -0.12854384 -0.98550279 -5 1 7 1 4 0.76055107 -2.37806108 889.82332391 -5 1 7 1 5 0.62129524 0.59987126 -4.90608998 -5 1 7 1 6 -0.83553497 -2.22809327 -886.52403196 -5 1 7 1 7 -0.64271921 -0.68556716 -2.32450115 -5 1 7 1 8 0.81411100 2.39948506 -884.39234658 -5 1 7 2 1 -0.08569589 -0.05355993 -3374.52223442 -5 1 7 2 2 537.95597976 534.74238371 91.58748759 -5 1 7 2 3 0.07498391 0.06427192 -2915.86709333 -5 1 7 2 4 -537.92384380 -534.74238371 93.70846099 -5 1 7 2 5 0.65343120 -0.55702332 2950.74532253 -5 1 7 2 6 533.99254463 -537.27041260 101.93526689 -5 1 7 2 7 -0.59987126 0.64271921 2950.69176259 -5 1 7 2 8 -534.05681655 537.23827664 102.05309875 -5 1 7 3 1 0.38563153 -2914.59236690 0.18210378 -5 1 7 3 2 -1558.95829468 3078.60359761 -3060.97166725 -5 1 7 3 3 0.32135961 -574.37673506 0.17139179 -5 1 7 3 4 -1558.94758269 3078.60359761 3060.92881930 -5 1 7 3 5 11.74033759 -11775.06585237 0.77126305 -5 1 7 3 6 1555.18767531 3076.61116805 3068.55575394 -5 1 7 3 7 -4.79897011 2953.48759116 0.85695895 -5 1 7 3 8 1555.12340339 3076.76113587 -3070.80527118 -5 2 7 1 1 -0.06427192 -0.09640788 -2915.96350122 -5 2 7 1 2 -534.69953576 -537.97740374 91.35182388 -5 2 7 1 3 0.05355993 0.08569589 -3374.53294641 -5 2 7 1 4 534.78523165 537.99882771 93.40852536 -5 2 7 1 5 0.56773530 -0.62129524 2950.78817047 -5 2 7 1 6 -537.29183658 534.03539257 101.89241895 -5 2 7 1 7 -0.62129524 0.67485517 2950.67033862 -5 2 7 1 8 537.33468452 -533.96040867 102.01025080 -5 2 7 2 1 -0.08569589 0.16067980 -0.97479080 -5 2 7 2 2 -2.39948506 0.77126305 890.27322736 -5 2 7 2 3 0.11783186 -0.04284795 -0.77126305 -5 2 7 2 4 2.37806108 -0.66414318 890.16610749 -5 2 7 2 5 0.66414318 0.64271921 -4.92751395 -5 2 7 2 6 -2.39948506 -0.77126305 -886.43833607 -5 2 7 2 7 -0.53559934 -0.68556716 -2.41019704 -5 2 7 2 8 2.39948506 0.74983908 -884.39234658 -5 2 7 3 1 -574.50527891 0.34278358 0.17139179 -5 2 7 3 2 3078.51790171 -1558.95829468 3060.99309122 -5 2 7 3 3 -2914.61379087 0.42847947 0.08569589 -5 2 7 3 4 3078.57146165 -1558.87259878 -3060.97166725 -5 2 7 3 5 -11775.08727634 11.74033759 0.85695895 -5 2 7 3 6 3076.71828792 1555.14482736 3068.59860189 -5 2 7 3 7 2953.40189527 -4.77754614 0.87838292 -5 2 7 3 8 3076.80398381 1555.13411537 -3070.77313522 -5 3 7 1 1 -0.66414318 -574.54812685 0.23566371 -5 3 7 1 2 -1556.28029797 3074.74728234 3062.49276938 -5 3 7 1 3 -1.67106995 -2914.36741517 0.21423974 -5 3 7 1 4 -1556.21602604 3074.83297823 -3062.68558514 -5 3 7 1 5 -4.23123481 2952.11645684 0.83553497 -5 3 7 1 6 1557.90851997 3080.51033127 -3066.84183604 -5 3 7 1 7 3.27786798 -11773.74827799 0.84624696 -5 3 7 1 8 1557.88709599 3080.63887511 3064.72086264 -5 3 7 2 1 -2914.41026312 -1.83174975 0.23566371 -5 3 7 2 2 3074.68301042 -1556.25887399 -3062.62131322 -5 3 7 2 3 -574.67667069 -0.70699113 0.12854384 -5 3 7 2 4 3074.69372240 -1556.21602604 3062.34280156 -5 3 7 2 5 2952.10574486 -4.13482693 0.89980690 -5 3 7 2 6 3080.57460319 1557.92994394 -3066.92753194 -5 3 7 2 7 -11773.71614203 3.32071592 0.94265484 -5 3 7 2 8 3080.55317921 1557.96207990 3064.77442258 -5 3 7 3 1 -0.21423974 0.16067980 -3.01006831 -5 3 7 3 2 3.10647619 -3.14932413 9467.72530819 -5 3 7 3 3 0.16067980 -0.23566371 -2.84938850 -5 3 7 3 4 -3.13861215 3.12790016 9467.55391640 -5 3 7 3 5 1.24259047 1.28543842 -13.28286370 -5 3 7 3 6 3.08505221 3.08505221 -9459.36995844 -5 3 7 3 7 -1.19974253 -1.19974253 -1.88530969 -5 3 7 3 8 -3.10647619 -3.01006831 -9455.16014761 -5 1 8 1 1 0.29993563 -1552.85246217 534.90306351 -5 1 8 1 2 -9463.14057781 -3055.46570600 3062.19283375 -5 1 8 1 3 9459.61633414 3053.30188466 -3057.77949516 -5 1 8 1 4 0.66414318 1552.59537449 -531.55021162 -5 1 8 1 5 73992.54572438 71806.34703952 -71878.82434256 -5 1 8 1 6 0.74983908 533.94969668 -1553.49518138 -5 1 8 1 7 0.77126305 -533.75688092 1555.30550716 -5 1 8 1 8 -73991.44238973 -71804.18321817 71869.36565817 -5 1 8 2 1 891.73005757 -3056.94396019 90.00211354 -5 1 8 2 2 3059.64338088 -889.53410027 -93.55849317 -5 1 8 2 3 0.16067980 -1558.27272752 3074.66158644 -5 1 8 2 4 1559.89023753 -0.83553497 -3077.46812700 -5 1 8 2 5 66823.24858731 71804.11894625 -80591.20460979 -5 1 8 2 6 -532.71781819 1.04977471 -3079.09634900 -5 1 8 2 7 2.97793235 537.58106022 3077.42527905 -5 1 8 2 8 -71804.91163328 -66837.13132227 80599.13148006 -5 1 8 3 1 -2.54945287 3071.42656641 537.67746810 -5 1 8 3 2 -3054.22311553 -87.21699696 -890.12325954 -5 1 8 3 3 -4.50974647 3074.70443439 -1558.20845560 -5 1 8 3 4 542.84064577 -3070.80527118 0.08569589 -5 1 8 3 5 -66915.05031464 -80608.23666889 71896.43484895 -5 1 8 3 6 -1554.41641225 -3080.96023471 -0.47132742 -5 1 8 3 7 -885.38856136 101.15329185 -3068.78070566 -5 1 8 3 8 71873.33980530 80600.00986299 -66916.57141678 -5 2 8 1 1 -1557.48004049 -0.55702332 3074.13669909 -5 2 8 1 2 -1.60679803 1560.71506052 -3078.04657429 -5 2 8 1 3 -3056.10842521 890.85167465 90.53771288 -5 2 8 1 4 -890.38034723 3060.41464393 -93.06574178 -5 2 8 1 5 71806.51843131 66820.70984643 -80591.14033787 -5 2 8 1 6 0.78197504 -532.42859455 -3079.13919695 -5 2 8 1 7 537.78458797 2.71013267 3077.41456707 -5 2 8 1 8 -66839.56294329 -71802.41574034 80599.13148006 -5 2 8 2 1 3052.48777366 9460.41973315 -3057.34030370 -5 2 8 2 2 1552.57395051 0.66414318 -531.61448355 -5 2 8 2 3 -1553.69870913 1.13547061 534.35675218 -5 2 8 2 4 -3055.44428203 -9463.16200179 3062.19283375 -5 2 8 2 5 71806.12208779 73992.68498021 -71878.86719051 -5 2 8 2 6 533.92827271 0.72841511 -1553.49518138 -5 2 8 2 7 -534.01396860 1.06048670 1555.32693114 -5 2 8 2 8 -71801.91227696 -73993.55265114 71869.18355440 -5 2 8 3 1 3073.37614802 -2.74226863 -1556.89088122 -5 2 8 3 2 -3070.76242323 542.81922179 0.07498391 -5 2 8 3 3 3071.64080615 -2.22809327 537.84885989 -5 2 8 3 4 -87.23842093 -3054.24453950 -890.08041160 -5 2 8 3 5 -80607.18689418 -66913.32568476 71895.51361808 -5 2 8 3 6 -3080.93881074 -1554.39498828 -0.47132742 -5 2 8 3 7 100.94976410 -885.04577778 -3068.96280944 -5 2 8 3 8 80600.09555888 71869.11928247 -66916.71067260 -5 3 8 1 1 -539.28426613 3069.38057693 -0.37491954 -5 3 8 1 2 5.84874482 -3077.11463143 1554.90916365 -5 3 8 1 3 3053.63395625 86.57427775 891.30157810 -5 3 8 1 4 3.77061937 -3073.14048431 -539.66989766 -5 3 8 1 5 -71877.63531202 -80588.44091718 66910.15493665 -5 3 8 1 6 883.57823558 -109.71216935 3072.58346099 -5 3 8 1 7 1558.20845560 3080.87453882 -2.54945287 -5 3 8 1 8 66911.91170249 80611.54667283 -71886.24774945 -5 3 8 2 1 86.57427775 3053.65538023 891.34442605 -5 3 8 2 2 -3073.16190828 3.58851560 -539.77701753 -5 3 8 2 3 3069.42342487 -539.28426613 -0.29993563 -5 3 8 2 4 -3076.52547216 4.92751395 1554.28786841 -5 3 8 2 5 -80588.40878122 -71875.54647459 66910.24063255 -5 3 8 2 6 -109.64789743 883.37470783 3072.66915689 -5 3 8 2 7 3080.89596279 1558.16560765 -2.57087684 -5 3 8 2 8 80610.91466560 66911.06545553 -71885.70143812 -5 3 8 3 1 -536.75623723 -1559.35463819 3.94201116 -5 3 8 3 2 1563.15739352 534.28176827 -6.59858390 -5 3 8 3 3 -1560.15803721 -535.98497418 3.40641182 -5 3 8 3 4 533.47836926 1563.90723260 -6.17010443 -5 3 8 3 5 71893.06057309 71891.14312744 -74116.75121194 -5 3 8 3 6 -3071.10520681 -3070.80527118 9448.22949211 -5 3 8 3 7 3064.97795033 3065.21361404 -9458.15950393 -5 3 8 3 8 -71886.55839707 -71888.36872285 74131.80155347 -6 1 1 1 1 74113.83755151 -72001.92649548 72006.23271419 -6 1 1 1 2 0.49275140 -1558.28343951 535.74931047 -6 1 1 1 3 -0.62129524 537.95597976 -1559.68670978 -6 1 1 1 4 -9472.03152690 3065.23503801 -3066.41335657 -6 1 1 1 5 -0.95336683 1557.77997612 -539.79844150 -6 1 1 1 6 -74107.15327172 71997.17037332 -71995.04939992 -6 1 1 1 7 9466.41844579 -3061.80720222 3061.16448301 -6 1 1 1 8 -0.02142397 -536.08138206 1557.85496003 -6 1 1 2 1 -72004.34740451 67024.50539631 -80796.18919021 -6 1 1 2 2 889.35199649 3066.01701305 -95.09030729 -6 1 1 2 3 -537.75245201 0.34278358 3077.44670303 -6 1 1 2 4 1.77818982 1561.95765100 -3081.64580187 -6 1 1 2 5 1553.42019748 0.21423974 3070.14112799 -6 1 1 2 6 67035.67799859 -72006.46837791 80811.55017936 -6 1 1 2 7 3061.33587480 889.93044378 90.86978447 -6 1 1 2 8 0.57844729 -536.67054134 -3076.99679958 -6 1 1 3 1 72007.83951222 -80795.30009530 67033.78197692 -6 1 1 3 2 -1.39255829 -3078.06799826 -538.18093149 -6 1 1 3 3 -1558.04777580 3077.53239892 0.27851166 -6 1 1 3 4 -2.86010049 -3080.14612371 1557.13725691 -6 1 1 3 5 536.22063789 3076.67543997 1.88530969 -6 1 1 3 6 -67028.31886363 80799.95980959 -72006.42552996 -6 1 1 3 7 -3061.97859401 91.88742323 890.48746710 -6 1 1 3 8 -891.51581784 -92.55156641 3061.18590698 -6 2 1 1 1 -67017.46762094 72015.89492634 -80796.97116525 -6 2 1 1 2 -1561.78625921 -1.85317373 -3081.82790565 -6 2 1 1 3 -0.57844729 538.57727500 3077.33958316 -6 2 1 1 4 -3065.10649417 -888.70927728 -95.70089055 -6 2 1 1 5 -891.71934559 -3053.55897234 86.16722225 -6 2 1 1 6 71999.35561863 -67052.19588232 80811.67872320 -6 2 1 1 7 0.44990345 -1557.58716036 3076.32194441 -6 2 1 1 8 536.88478108 -0.51417537 -3076.93252766 -6 2 1 2 1 72011.80294736 -74112.61638501 72011.03168430 -6 2 1 2 2 -3064.61374278 9472.93133380 -3065.78134934 -6 2 1 2 3 -537.46322837 -0.70699113 -1558.44411931 -6 2 1 2 4 1558.21916759 -0.34278358 535.87785431 -6 2 1 2 5 3056.94396019 -9458.51299949 3054.97295461 -6 2 1 2 6 -72002.16215919 74100.51183987 -71998.43438777 -6 2 1 2 7 -1558.82975084 -1.47825419 -537.10973280 -6 2 1 2 8 536.13494200 0.16067980 1557.81211209 -6 2 1 3 1 -80798.84576295 72015.87350236 -67033.67485705 -6 2 1 3 2 -3080.18897166 -2.88152446 -1557.11583294 -6 2 1 3 3 3077.13605541 -1559.92237350 -0.25708768 -6 2 1 3 4 -3078.10013422 -1.41398226 538.17021950 -6 2 1 3 5 89.61648201 -3058.44363835 -892.09426513 -6 2 1 3 6 80806.74049726 -67036.98486099 72006.25413817 -6 2 1 3 7 3076.16126460 535.37439093 -0.02142397 -6 2 1 3 8 -92.57299038 -891.53724181 -3061.19661897 -6 3 1 1 1 67029.91494967 -80801.69515146 72004.17601272 -6 3 1 1 2 -540.07695316 -3079.37486066 -0.85695895 -6 3 1 1 3 888.90209304 90.36632109 -3062.66416117 -6 3 1 1 4 3063.45684820 -93.02289383 -888.81639715 -6 3 1 1 5 -2.19595730 3073.89032339 536.15636597 -6 3 1 1 6 -71997.19179729 80810.32901286 -67028.00821601 -6 3 1 1 7 -0.51417537 3076.69686395 -1559.55816594 -6 3 1 1 8 1557.71570420 -3077.29673521 -0.34278358 -6 3 1 2 1 -80804.71593175 67032.88217003 -72004.62591617 -6 3 1 2 2 -92.80865410 3063.38186429 888.76283721 -6 3 1 2 3 90.61269679 889.00921291 3062.72843309 -6 3 1 2 4 -3078.46434178 -539.45565792 0.19281576 -6 3 1 2 5 3072.49776510 -1.86388571 1561.55059550 -6 3 1 2 6 80813.09270547 -72002.07646330 67026.70135361 -6 3 1 2 7 3076.97537560 0.19281576 -535.59934265 -6 3 1 2 8 -3077.12534342 1557.80140010 0.42847947 -6 3 1 3 1 71999.93406592 -71999.81623407 74099.97624053 -6 3 1 3 2 536.34918173 -1559.29036627 2.34592512 -6 3 1 3 3 3062.88911289 -3062.70700912 9469.33210622 -6 3 1 3 4 1559.34392621 -536.30633379 2.33521313 -6 3 1 3 5 -537.06688485 1558.74405494 3.72777142 -6 3 1 3 6 -72001.54086395 72000.79102487 -74115.23010981 -6 3 1 3 7 -1558.61551110 537.17400472 2.88152446 -6 3 1 3 8 -3061.33587480 3061.33587480 -9465.43294300 -6 1 2 1 1 0.14996782 886.35264017 -1.09262266 -6 1 2 1 2 0.17139179 2.39948506 8.77311723 -6 1 2 1 3 -0.25708768 -886.41691209 -1.02835074 -6 1 2 1 4 0.13925583 -0.00000000 -0.36420755 -6 1 2 1 5 -0.40705550 891.28015412 3.25644400 -6 1 2 1 6 0.13925583 -2.29236519 -8.82667717 -6 1 2 1 7 -0.12854384 -891.36585002 -1.09262266 -6 1 2 1 8 0.12854384 0.08569589 0.29993563 -6 1 2 2 1 -1558.50839123 3063.32830435 -3078.06799826 -6 1 2 2 2 1.82103777 4.73469819 -2955.21222105 -6 1 2 2 3 1558.67978302 -3063.28545641 -3078.11084621 -6 1 2 2 4 -0.66414318 -0.06427192 573.69116790 -6 1 2 2 5 -1552.65964641 -3060.80027546 -3072.41206920 -6 1 2 2 6 -6.35220820 0.70699113 11771.70228850 -6 1 2 2 7 1557.65143228 3055.29431421 -3075.62566526 -6 1 2 2 8 0.06427192 0.11783186 2914.09961550 -6 1 2 3 1 535.49222279 -92.25163078 -538.25591539 -6 1 2 3 2 6.34149622 -2959.42203188 -1.27472644 -6 1 2 3 3 535.57791868 -94.50114802 538.08452360 -6 1 2 3 4 -0.18210378 2914.83874260 -1.07119869 -6 1 2 3 5 -531.85014726 -91.52321567 539.58420176 -6 1 2 3 6 -7.61622265 -2962.63562793 -0.38563153 -6 1 2 3 7 -538.77009076 -88.52385935 -536.00639816 -6 1 2 3 8 0.92123087 3373.89022720 -0.63200722 -6 2 2 1 1 -1561.14354000 -3065.92060517 -3079.61052437 -6 2 2 1 2 6.34149622 0.83553497 11784.49240080 -6 2 2 1 3 1561.16496397 3065.96345312 -3079.56767642 -6 2 2 1 4 -0.13925583 0.08569589 2915.24579810 -6 2 2 1 5 -1560.30800502 3053.53754837 -3077.08249547 -6 2 2 1 6 -1.69249392 4.64900229 -2964.13530609 -6 2 2 1 7 1555.20909928 -3059.30059730 -3074.14741108 -6 2 2 1 8 0.70699113 -0.11783186 574.59097480 -6 2 2 2 1 -0.36420755 9473.85256467 -1.99242955 -6 2 2 2 2 -0.68556716 -4.01699507 6.33078423 -6 2 2 2 3 0.44990345 -9471.66731935 -1.88530969 -6 2 2 2 4 -0.66414318 -0.02142397 -0.23566371 -6 2 2 2 5 1.15689458 9463.50478537 5.74162495 -6 2 2 2 6 0.51417537 2.16382134 -6.27722430 -6 2 2 2 7 0.51417537 -9463.48336139 -1.99242955 -6 2 2 2 8 -0.81411100 -0.31064762 0.29993563 -6 2 2 3 1 -3080.68172306 -3067.16319565 -1556.43026578 -6 2 2 3 2 11785.79926320 7.56266272 -2.91366042 -6 2 2 3 3 -3080.70314703 -3069.36986494 1556.28029797 -6 2 2 3 4 573.11272061 -0.32135961 -1.13547061 -6 2 2 3 5 -3078.08942224 3062.57846527 -1554.60922802 -6 2 2 3 6 -2962.35711628 7.47696682 -0.19281576 -6 2 2 3 7 -3072.96909252 3057.82234311 1559.83667760 -6 2 2 3 8 2915.93136525 1.29615041 -0.76055107 -6 3 2 1 1 -539.07002640 -90.75195262 536.56342147 -6 3 2 1 2 6.47004006 -2961.05025388 -0.42847947 -6 3 2 1 3 -538.98433050 -90.88049646 -536.54199750 -6 3 2 1 4 -0.78197504 3371.83352572 -0.62129524 -6 3 2 1 5 542.24077450 -87.02418119 -534.18536039 -6 3 2 1 6 -5.08819376 -2964.28527391 -1.26401445 -6 3 2 1 7 535.19228715 -92.16593488 537.72031605 -6 3 2 1 8 0.04284795 2914.21744736 -1.08191067 -6 3 2 2 1 -3078.13227018 3061.57153851 -1558.97971865 -6 3 2 2 2 -2959.55057572 -3.88845123 1.52110213 -6 3 2 2 3 -3078.11084621 3061.48584261 1558.93687070 -6 3 2 2 4 2913.72469596 -0.53559934 0.96407882 -6 3 2 2 5 -3070.33394376 -3054.39450732 -1562.53609829 -6 3 2 2 6 11772.94487897 -3.98485911 1.60679803 -6 3 2 2 7 -3075.47569744 -3061.44299467 1557.33007268 -6 3 2 2 8 574.69809467 1.08191067 1.01763875 -6 3 2 3 1 0.10711987 885.32428943 2.57087684 -6 3 2 3 2 -1.22116650 1.61751001 -3.87773924 -6 3 2 3 3 -0.12854384 -885.40998533 2.48518095 -6 3 2 3 4 0.97479080 -0.47132742 -1.90673366 -6 3 2 3 5 -0.47132742 890.10183557 -7.32699901 -6 3 2 3 6 0.07498391 0.19281576 3.94201116 -6 3 2 3 7 -0.21423974 -892.26565692 2.42090903 -6 3 2 3 8 0.74983908 0.86767094 1.98171757 -6 1 3 1 1 -0.87838292 -537.30254856 -1558.04777580 -6 1 3 1 2 -0.14996782 1558.30486348 536.01711014 -6 1 3 1 3 -74115.85140504 72014.97369547 72011.54585967 -6 1 3 1 4 9472.87777386 -3064.69943867 -3065.55639762 -6 1 3 1 5 -9460.51614104 3056.00130535 3053.43042850 -6 1 3 1 6 74104.26103527 -72005.99705048 -71997.49173292 -6 1 3 1 7 -0.49275140 -1556.81589731 -538.58798699 -6 1 3 1 8 0.85695895 535.47079881 1558.76547892 -6 1 3 2 1 538.57727500 -0.53559934 3077.28602322 -6 1 3 2 2 -889.24487662 -3065.89918120 -94.94033948 -6 1 3 2 3 72016.10916607 -67015.60373523 -80799.33851435 -6 1 3 2 4 -1.82103777 -1562.04334689 -3081.53868200 -6 1 3 2 5 -3053.55897234 -891.70863360 86.21007019 -6 1 3 2 6 -67052.36727411 71999.33419466 80812.21432255 -6 1 3 2 7 -1557.60858433 0.46061543 3076.39692831 -6 1 3 2 8 0.02142397 536.01711014 -3076.11841666 -6 1 3 3 1 -1559.77240568 3077.32887117 -0.17139179 -6 1 3 3 2 -1.39255829 -3078.07871025 538.40588321 -6 1 3 3 3 72015.19864719 -80797.75314029 -67035.14239925 -6 1 3 3 4 -2.93508440 -3080.21039563 -1556.92301718 -6 1 3 3 5 -3058.52933424 89.85214572 -892.13711307 -6 1 3 3 6 -67037.62758020 80805.05871533 72006.91828135 -6 1 3 3 7 536.04924610 3077.13605541 -0.62129524 -6 1 3 3 8 -890.83025068 -93.24784556 -3060.23254015 -6 2 3 1 1 0.19281576 -537.87028387 3077.59667084 -6 2 3 1 2 1561.91480305 1.73534187 -3081.77434571 -6 2 3 1 3 67023.36992570 -72003.36190172 -80795.28938332 -6 2 3 1 4 3066.00630107 889.37342047 -95.07959531 -6 2 3 1 5 -0.65343120 1552.78819025 3069.58410468 -6 2 3 1 6 -72004.07960484 67035.39948694 80811.31451565 -6 2 3 1 7 889.78047597 3061.44299467 90.73052865 -6 2 3 1 8 -536.64911737 0.59987126 -3077.00751156 -6 2 3 2 1 538.02025168 -0.68556716 -1559.64386184 -6 2 3 2 2 3064.65659072 -9472.86706188 -3065.59924557 -6 2 3 2 3 -72001.80866362 74115.74428517 72003.72610927 -6 2 3 2 4 -1558.27272752 0.19281576 536.02782213 -6 2 3 2 5 1557.71570420 -0.98550279 -539.84128945 -6 2 3 2 6 71996.88114967 -74107.15327172 -71994.57807250 -6 2 3 2 7 -3061.87147414 9466.45058175 3061.14305904 -6 2 3 2 8 -535.47079881 -0.83553497 1558.78690289 -6 2 3 3 1 3076.99679958 -1558.28343951 0.49275140 -6 2 3 3 2 -3080.36036345 -2.81725254 1556.80518532 -6 2 3 3 3 -80795.66430286 72009.53200615 67037.97036378 -6 2 3 3 4 -3078.92495721 -1.99242955 -539.02717845 -6 2 3 3 5 3073.98673127 534.33532821 -0.00000000 -6 2 3 3 6 80806.00137017 -67027.96536806 -72006.76831354 -6 2 3 3 7 91.39467183 -3061.70008235 890.16610749 -6 2 3 3 8 -93.42994933 -890.94808253 3060.32894803 -6 3 3 1 1 888.40934165 91.44823176 3061.93574606 -6 3 3 1 2 -539.88413740 -3079.44984457 0.89980690 -6 3 3 1 3 67030.78262060 -80802.25217477 -72004.92585180 -6 3 3 1 4 3064.35665509 -92.35875065 889.48054033 -6 3 3 1 5 -1.83174975 3072.77627676 1561.29350781 -6 3 3 1 6 -72000.46966527 80809.45062994 67027.53688859 -6 3 3 1 7 0.74983908 3077.80019859 -536.42416564 -6 3 3 1 8 1557.86567202 -3077.22175130 0.24637570 -6 3 3 2 1 91.00904030 888.22723787 -3061.72150633 -6 3 3 2 2 -92.80865410 3063.37115230 -888.78426119 -6 3 3 2 3 -80804.21246837 67030.08634146 72004.66876411 -6 3 3 2 4 -3078.46434178 -539.41280997 -0.17139179 -6 3 3 2 5 3073.79391551 -2.31378916 536.32775776 -6 3 3 2 6 80810.86461220 -71997.42746100 -67030.32200517 -6 3 3 2 7 3076.78255984 -0.37491954 -1559.40819813 -6 3 3 2 8 -3077.08249547 1557.77997612 -0.41776749 -6 3 3 3 1 -3062.42849746 3063.36044031 9469.44993807 -6 3 3 3 2 -536.30633379 1559.32250223 2.37806108 -6 3 3 3 3 -72000.33040944 72001.32662422 74100.83319948 -6 3 3 3 4 -1559.31179024 536.30633379 2.31378916 -6 3 3 3 5 1559.47247005 -536.04924610 4.15625090 -6 3 3 3 6 71998.75574737 -72005.97562651 -74115.16583788 -6 3 3 3 7 538.66297089 -1556.82660929 1.63893399 -6 3 3 3 8 3061.33587480 -3061.34658679 -9465.37938307 -6 1 4 1 1 -9471.60304743 0.40705550 -2.03527750 -6 1 4 1 2 0.14996782 -0.62129524 -0.07498391 -6 1 4 1 3 9473.91683659 -0.40705550 -1.88530969 -6 1 4 1 4 -3.07434023 -1.43540624 6.87709556 -6 1 4 1 5 9463.41908947 1.26401445 5.82732085 -6 1 4 1 6 3.12790016 1.30686240 -6.85567159 -6 1 4 1 7 -9465.73287863 0.42847947 -2.03527750 -6 1 4 1 8 -0.10711987 -0.95336683 0.19281576 -6 1 4 2 1 3066.00630107 1561.10069205 -3079.50340450 -6 1 4 2 2 -0.08569589 -0.05355993 2915.09583028 -6 1 4 2 3 -3063.82105575 -1561.12211602 -3079.52482848 -6 1 4 2 4 -0.03213596 5.76304893 11783.78540967 -6 1 4 2 5 3053.64466824 -1560.37227694 -3077.03964753 -6 1 4 2 6 3.79204335 -1.11404663 -2963.51401086 -6 1 4 2 7 -3059.21490140 1555.18767531 -3074.08313915 -6 1 4 2 8 -0.21423974 0.61058325 574.69809467 -6 1 4 3 1 -3065.02079828 -3080.63887511 1556.40884181 -6 1 4 3 2 -0.49275140 573.36980830 -0.94265484 -6 1 4 3 3 -3067.18461962 -3080.70314703 -1556.36599386 -6 1 4 3 4 6.69499178 11783.80683364 -0.98550279 -6 1 4 3 5 3062.64273719 -3078.04657429 -1554.69492391 -6 1 4 3 6 6.63071986 -2960.45038262 -2.07812545 -6 1 4 3 7 3055.57282587 -3072.92624457 1559.90094952 -6 1 4 3 8 1.15689458 2915.63142962 -1.06048670 -6 2 4 1 1 -3065.47070172 1558.52981520 -3078.11084621 -6 2 4 1 2 -0.36420755 -0.83553497 573.34838433 -6 2 4 1 3 3065.38500583 -1558.46554328 -3078.02515032 -6 2 4 1 4 2.83867652 3.06362824 -2957.81523385 -6 2 4 1 5 -3060.86454738 -1552.59537449 -3072.75485278 -6 2 4 1 6 -0.93194286 -7.69120656 11774.29458932 -6 2 4 1 7 3059.60053293 1557.73712818 -3075.58281731 -6 2 4 1 8 -0.21423974 0.27851166 2914.35670319 -6 2 4 2 1 -886.37406415 -0.14996782 -1.22116650 -6 2 4 2 2 -0.08569589 0.09640788 -0.26779967 -6 2 4 2 3 886.35264017 0.10711987 -1.11404663 -6 2 4 2 4 2.36734909 0.21423974 8.76240525 -6 2 4 2 5 891.21588220 -0.47132742 3.29929195 -6 2 4 2 6 -2.32450115 0.23566371 -8.80525319 -6 2 4 2 7 -891.25873015 -0.17139179 -1.00692676 -6 2 4 2 8 0.08569589 0.07498391 0.27851166 -6 2 4 3 1 -96.62212141 535.49222279 538.29876334 -6 2 4 3 2 2915.35291796 -0.07498391 -1.41398226 -6 2 4 3 3 -92.25163078 535.49222279 -538.34161129 -6 2 4 3 4 -2956.61549132 5.80589687 -3.23502003 -6 2 4 3 5 -95.85085836 -531.78587534 539.45565792 -6 2 4 3 6 -2959.88264731 -7.04848735 1.47825419 -6 2 4 3 7 -88.45958743 -538.77009076 -536.02782213 -6 2 4 3 8 3374.40440257 0.86767094 -0.29993563 -6 3 4 1 1 3061.50726659 -3078.17511813 1558.95829468 -6 3 4 1 2 -0.96407882 2913.74611994 0.69627915 -6 3 4 1 3 3063.73535985 -3078.06799826 -1558.89402276 -6 3 4 1 4 -5.72020098 -2959.44345585 -1.00692676 -6 3 4 1 5 -3056.57975264 -3070.26967183 -1562.62179418 -6 3 4 1 6 -5.83803283 11772.90203103 4.11340295 -6 3 4 1 7 -3056.92253622 -3075.51854539 1557.35149665 -6 3 4 1 8 0.70699113 574.76236659 1.43540624 -6 3 4 2 1 -90.75195262 -539.04860242 -536.49914955 -6 3 4 2 2 3371.42647022 -0.93194286 -0.61058325 -6 3 4 2 3 -90.75195262 -539.02717845 536.71338929 -6 3 4 2 4 -2962.88200363 7.66978259 -0.53559934 -6 3 4 2 5 -84.83893588 542.26219848 -534.18536039 -6 3 4 2 6 -2966.17058360 -6.32007224 -1.28543842 -6 3 4 2 7 -90.00211354 535.23513510 537.82743592 -6 3 4 2 8 2913.85323981 0.23566371 -1.19974253 -6 3 4 3 1 -885.30286546 -0.10711987 2.42090903 -6 3 4 3 2 -0.77126305 0.97479080 -2.08883744 -6 3 4 3 3 887.53095873 0.17139179 2.48518095 -6 3 4 3 4 -0.21423974 -1.13547061 -3.81346732 -6 3 4 3 5 892.30850486 -0.47132742 -7.45554285 -6 3 4 3 6 -1.61751001 0.12854384 3.92058719 -6 3 4 3 7 -892.28708089 -0.17139179 2.44233300 -6 3 4 3 8 0.42847947 0.79268703 1.96029359 -6 1 5 1 1 -0.87838292 1553.68799715 534.31390423 -6 1 5 1 2 -0.64271921 -1552.60608647 -531.60377156 -6 1 5 1 3 -9459.57348619 -3053.10906890 -3057.90803901 -6 1 5 1 4 9463.14057781 3055.44428203 3062.17140977 -6 1 5 1 5 -73991.75303735 -71805.36153673 -71877.94595964 -6 1 5 1 6 73991.22814999 71801.93370093 71869.20497837 -6 1 5 1 7 -0.89980690 533.93898469 1555.42333902 -6 1 5 1 8 -0.70699113 -533.93898469 -1553.49518138 -6 1 5 2 1 1558.37984739 -0.21423974 3074.67229843 -6 1 5 2 2 889.58766020 -3059.58982094 -93.55849317 -6 1 5 2 3 3056.93324820 -891.81575347 90.04496149 -6 1 5 2 4 0.81411100 -1559.85810157 -3077.48955097 -6 1 5 2 5 -71803.86185857 -66823.04505956 -80590.94752211 -6 1 5 2 6 66836.87423459 71804.78308944 80598.87439238 -6 1 5 2 7 -537.57034824 -2.94579638 3077.39314309 -6 1 5 2 8 -1.04977471 532.70710620 -3079.16062092 -6 1 5 3 1 -539.11287434 3069.48769679 0.32135961 -6 1 5 3 2 3.79204335 -3073.15119630 539.62704971 -6 1 5 3 3 3054.56589911 85.93155854 -892.00856923 -6 1 5 3 4 5.83803283 -3077.14676739 -1554.97343557 -6 1 5 3 5 -71877.08900069 -80588.14098155 -66909.68360923 -6 1 5 3 6 66910.07995274 80611.85732045 71886.68694091 -6 1 5 3 7 1558.37984739 3080.79955491 2.63514877 -6 1 5 3 8 883.56752359 -109.74430531 -3072.59417298 -6 2 5 1 1 -890.91594657 3056.14056118 90.54842487 -6 2 5 1 2 -1560.11518926 0.74983908 -3077.40385508 -6 2 5 1 3 0.61058325 1557.50146447 3074.06171518 -6 2 5 1 4 -3060.48962784 890.18753147 -92.89434999 -6 2 5 1 5 -66820.81696630 -71804.46172983 -80591.11891390 -6 2 5 1 6 71801.78373312 66838.74883229 80598.74584854 -6 2 5 1 7 -2.72084466 -537.81672393 3077.43599104 -6 2 5 1 8 532.53571441 -0.95336683 -3079.24631682 -6 2 5 2 1 -3053.30188466 -9459.64847010 -3057.79020715 -6 2 5 2 2 3055.46570600 9463.12986583 3062.20354573 -6 2 5 2 3 1552.85246217 -0.25708768 534.91377550 -6 2 5 2 4 -1552.61679846 -0.64271921 -531.63590752 -6 2 5 2 5 -71806.62555117 -73992.68498021 -71879.01715833 -6 2 5 2 6 71804.30105003 73991.54950960 71869.63345784 -6 2 5 2 7 533.75688092 -0.81411100 1555.32693114 -6 2 5 2 8 -533.94969668 -0.70699113 -1553.49518138 -6 2 5 3 1 86.42430993 3053.54826036 -891.22659419 -6 2 5 3 2 -3076.28980845 4.97036190 -1554.36285232 -6 2 5 3 3 3068.44863407 -538.68439487 0.94265484 -6 2 5 3 4 -3072.30494934 2.95650837 539.17714626 -6 2 5 3 5 -80591.60095331 -71876.12492188 -66910.66911202 -6 2 5 3 6 80614.12826166 66911.76173468 71886.42985323 -6 2 5 3 7 3080.70314703 1558.29415149 2.47446896 -6 2 5 3 8 -109.49792961 883.28901193 -3072.56203702 -6 3 5 1 1 -3.87773924 3073.26902815 -538.97361851 -6 3 5 1 2 542.84064577 -3070.80527118 -0.04284795 -6 3 5 1 3 -4.34906666 3075.02579400 1558.05848778 -6 3 5 1 4 -3054.26596348 -87.23842093 890.16610749 -6 3 5 1 5 -66913.88270808 -80606.67271881 -71895.51361808 -6 3 5 1 6 71873.55404503 80595.83218811 66916.83921645 -6 3 5 1 7 -885.58137712 101.47465146 3069.01636937 -6 3 5 1 8 -1554.41641225 -3080.92809875 0.49275140 -6 3 5 2 1 3073.91174736 -3.68492348 1557.70499222 -6 3 5 2 2 -87.21699696 -3054.24453950 890.14468352 -6 3 5 2 3 3070.64459137 -1.75676584 -537.09902081 -6 3 5 2 4 -3070.79455919 542.81922179 -0.04284795 -6 3 5 2 5 -80608.42948465 -66914.67539510 -71896.45627292 -6 3 5 2 6 80602.07727645 71871.11171203 66916.53928081 -6 3 5 2 7 100.88549218 -885.18503361 3068.82355361 -6 3 5 2 8 -3080.93881074 -1554.38427629 0.47132742 -6 3 5 3 1 535.34225497 1561.00428417 2.81725254 -6 3 5 3 2 -533.45694528 -1563.89652062 -6.07369655 -6 3 5 3 3 1559.45104607 536.92762902 3.81346732 -6 3 5 3 4 -1563.13596955 -534.27105629 -6.53431198 -6 3 5 3 5 -71892.86775733 -71890.20047260 -74116.23703657 -6 3 5 3 6 71888.96859411 71884.39457573 74132.30501685 -6 3 5 3 7 -3065.29930993 -3064.78513457 -9458.09523201 -6 3 5 3 8 3071.21232668 3070.83740714 9448.26162808 -6 1 6 1 1 -74108.86718962 67033.99621666 -67027.94394409 -6 1 6 1 2 0.94265484 -7.85188636 -8.58030147 -6 1 6 1 3 74100.05122443 -67048.70377461 -67036.38498973 -6 1 6 1 4 3.67421149 3.17074811 5.16317766 -6 1 6 1 5 73986.62199565 66835.49238828 66912.55442171 -6 1 6 1 6 120.60625998 218.71734757 126.29432500 -6 1 6 1 7 -74102.76135711 -67030.26844523 67035.78511846 -6 1 6 1 8 -0.29993563 -4.61686633 -6.82353563 -6 1 6 2 1 71997.72739663 -72005.91135459 80806.21560991 -6 1 6 2 2 -3.70634745 1.02835074 -2960.10759904 -6 1 6 2 3 -72005.90064260 71997.66312471 80804.07321254 -6 1 6 2 4 -2.50660492 -0.59987126 -2960.06475109 -6 1 6 2 5 71805.62933640 71801.24813377 80611.08605739 -6 1 6 2 6 219.38149075 221.69527991 -328882.41972007 -6 1 6 2 7 -72008.63219925 -72012.83129810 80808.80791073 -6 1 6 2 8 -2.24951724 -2.37806108 11772.36643168 -6 1 6 3 1 -71994.25671289 80814.11034422 -72003.69397331 -6 1 6 3 2 -9.12661280 11771.12384121 -0.88909491 -6 1 6 3 3 -71997.77024458 80814.46383978 72003.19050993 -6 1 6 3 4 -7.32699901 -2964.62805749 -1.41398226 -6 1 6 3 5 71865.99138231 80595.68222030 71885.44435044 -6 1 6 3 6 126.64782056 -328878.02780546 115.13243470 -6 1 6 3 7 72010.58178086 80799.48848216 -72005.41860319 -6 1 6 3 8 5.09890574 -2952.14859281 7.96971822 -6 2 6 1 1 71997.98448432 -72006.48980188 80806.76192124 -6 2 6 1 2 -3.64207553 0.99621478 -2960.13973500 -6 2 6 1 3 -72005.86850664 71997.29891716 80803.90182075 -6 2 6 1 4 -2.47446896 -0.57844729 -2960.08617506 -6 2 6 1 5 71805.05088911 71800.43402277 80610.40049023 -6 2 6 1 6 219.60644248 223.98764510 -328882.22690430 -6 2 6 1 7 -72008.73931912 -72013.22764161 80809.01143848 -6 2 6 1 8 -2.29236519 -2.41019704 11772.27002380 -6 2 6 2 1 -67051.63885901 74101.29381491 -67037.45618841 -6 2 6 2 2 3.59922758 3.70634745 5.31314548 -6 2 6 2 3 67035.00314342 -74109.18854922 -67028.58666330 -6 2 6 2 4 -6.14868045 1.09262266 -7.28415106 -6 2 6 2 5 66839.43439945 73988.12167381 66914.09694781 -6 2 6 2 6 218.62093968 117.68188757 125.30882221 -6 2 6 2 7 -67034.73534375 -74102.69708519 67035.95651025 -6 2 6 2 8 -4.11340295 -0.34278358 -7.03777536 -6 2 6 3 1 80810.80034028 -71998.15587611 72003.28691781 -6 2 6 3 2 -2964.13530609 -7.68049457 -1.53181412 -6 2 6 3 3 80812.82490580 -71994.81373621 -72004.45452438 -6 2 6 3 4 11774.00536567 -7.19845517 -1.58537405 -6 2 6 3 5 80596.59273918 71866.76264537 71886.21561349 -6 2 6 3 6 -328878.56340480 124.62325505 115.75372993 -6 2 6 3 7 80800.32401714 72011.14951616 -72006.03989843 -6 2 6 3 8 -2951.62370545 5.37741740 8.05541411 -6 3 6 1 1 -71993.80680944 80814.76377542 -72003.28691781 -6 3 6 1 2 -8.95522101 11771.27380902 -0.73912709 -6 3 6 1 3 -71996.84901371 80814.72092747 72001.17665640 -6 3 6 1 4 -7.53052676 -2964.67090544 -1.24259047 -6 3 6 1 5 71869.04429857 80598.61730469 71888.22946702 -6 3 6 1 6 121.34538707 -328881.92696867 111.68317493 -6 3 6 1 7 72011.16022815 80800.04550548 -72004.90442782 -6 3 6 1 8 5.76304893 -2952.74846407 8.92308505 -6 3 6 2 1 80810.54325260 -71997.84522849 72003.58685344 -6 3 6 2 2 -2964.26384994 -7.83046239 -1.66035796 -6 3 6 2 3 80812.81419381 -71994.98512800 -72001.81937561 -6 3 6 2 4 11774.05892561 -7.06991132 -1.73534187 -6 3 6 2 5 80597.86746561 71868.09093174 71888.01522728 -6 3 6 2 6 -328877.37437426 124.04480776 110.18349677 -6 3 6 2 7 80798.52440335 72009.45702224 -72003.74753324 -6 3 6 2 8 -2952.30927261 6.09512052 7.20916715 -6 3 6 3 1 -67028.88659893 67027.62258448 -74118.59367368 -6 3 6 3 2 -1.15689458 3.41712381 3.37427586 -6 3 6 3 3 67026.88345739 -67030.23630927 -74119.04357713 -6 3 6 3 4 5.25958554 -1.58537405 4.49903448 -6 3 6 3 5 66910.30490447 66909.74788115 74140.36043096 -6 3 6 3 6 108.66239464 110.80479201 -4.97036190 -6 3 6 3 7 -67020.57409713 -67018.93516314 74089.93910885 -6 3 6 3 8 -0.53559934 -0.84624696 4.67042627 -6 1 7 1 1 9466.54698963 3061.53940255 -3062.02144196 -6 1 7 1 2 -0.32135961 1557.50146447 -538.84507467 -6 1 7 1 3 -1.54252611 -1556.58023360 536.17778994 -6 1 7 1 4 -9464.88663167 -3057.84376708 3056.60117661 -6 1 7 1 5 -1.51039015 -537.67746810 1557.05156102 -6 1 7 1 6 -74103.55404414 -72014.41667215 72011.99576312 -6 1 7 1 7 74104.92517845 72008.84643899 -72003.20122192 -6 1 7 1 8 0.19281576 538.52371507 -1557.84424805 -6 1 7 2 1 -3060.65030764 889.20202868 91.95169515 -6 1 7 2 2 -890.29465133 3057.07250403 -88.71667512 -6 1 7 2 3 -1557.69428023 1.24259047 3076.82540779 -6 1 7 2 4 0.97479080 1554.78061981 -3072.62630894 -6 1 7 2 5 533.77830489 -2.69942069 3080.03900384 -6 1 7 2 6 -67034.12476050 -72011.84579531 80799.93838561 -6 1 7 2 7 72008.20371978 67050.69620416 -80809.91124537 -6 1 7 2 8 -0.21423974 -538.32018732 -3077.42527905 -6 1 7 3 1 3060.37179598 91.28755196 889.26630060 -6 1 7 3 2 -1.13547061 -3075.53996937 -535.94212623 -6 1 7 3 3 -538.63083493 3076.54689613 -0.17139179 -6 1 7 3 4 -2.08883744 -3073.89032339 1559.83667760 -6 1 7 3 5 1553.95579682 3075.92560089 1.67106995 -6 1 7 3 6 67039.09512240 80805.25153109 -71999.59128235 -6 1 7 3 7 -72000.44824129 -80809.11855834 67022.12733523 -6 1 7 3 8 888.70927728 -90.38774507 3062.77128104 -6 2 7 1 1 1.24259047 -1557.94065593 3076.79327183 -6 2 7 1 2 1554.67349994 0.87838292 -3072.77627676 -6 2 7 1 3 889.84474789 -3061.44299467 91.33039991 -6 2 7 1 4 3056.18340912 -889.60908418 -89.33797035 -6 2 7 1 5 -2.62443678 533.54264118 3080.12469974 -6 2 7 1 6 -72012.83129810 -67032.50725049 80800.36686509 -6 2 7 1 7 67052.02449053 72007.28248891 -80809.11855834 -6 2 7 1 8 -538.51300308 -0.13925583 -3077.35029514 -6 2 7 2 1 -1558.42269534 -0.23566371 534.83879159 -6 2 7 2 2 -3057.97231093 -9464.96161558 3056.54761668 -6 2 7 2 3 3061.10021109 9466.39702182 -3062.10713785 -6 2 7 2 4 1556.60165757 0.32135961 -539.45565792 -6 2 7 2 5 -538.03096367 -1.37113432 1557.26580076 -6 2 7 2 6 -72011.13880417 -74104.51812295 72013.10980975 -6 2 7 2 7 72009.48915820 74104.06821950 -72002.17287118 -6 2 7 2 8 538.34161129 0.26779967 -1557.80140010 -6 2 7 3 1 3075.79705705 -537.82743592 -0.69627915 -6 2 7 3 2 -3074.14741108 -2.16382134 1559.78311767 -6 2 7 3 3 90.50557692 3061.27160288 889.86617186 -6 2 7 3 4 -3076.40764030 -0.57844729 -536.54199750 -6 2 7 3 5 3075.63637725 1554.20217252 1.67106995 -6 2 7 3 6 80806.34415375 67036.08505410 -71998.84144327 -6 2 7 3 7 -80807.22253667 -71999.84837003 67021.89167151 -6 2 7 3 8 -90.53771288 888.81639715 3062.85697693 -6 3 7 1 1 -1.24259047 3077.84304654 -1557.54431241 -6 3 7 1 2 534.95662344 -3075.06864194 0.04284795 -6 3 7 1 3 -0.22495172 3076.84683176 538.12737155 -6 3 7 1 4 -3059.61124492 -90.79480057 -890.89452260 -6 3 7 1 5 -885.96700865 100.47843668 -3064.52804688 -6 3 7 1 6 72010.33540516 80798.86718693 -67021.60244787 -6 3 7 1 7 -67039.12725836 -80811.10027591 71996.83830172 -6 3 7 1 8 -1559.02256660 -3077.14676739 -0.44990345 -6 3 7 2 1 3075.94702487 0.40705550 537.43109241 -6 3 7 2 2 -90.98761633 -3059.70765280 -890.93737055 -6 3 7 2 3 3077.62880680 -1.28543842 -1557.65143228 -6 3 7 2 4 -3075.94702487 535.59934265 -0.59987126 -6 3 7 2 5 100.25348496 -885.90273672 -3064.48519893 -6 3 7 2 6 80800.01336952 72009.38203833 -67020.80976084 -6 3 7 2 7 -80809.60059775 -67039.59858578 71997.30962915 -6 3 7 2 8 -3077.29673521 -1558.91544673 -0.33207159 -6 3 7 3 1 -1560.54366873 -534.96733543 1.55323809 -6 3 7 3 2 536.39202968 1559.38677415 3.96343514 -6 3 7 3 3 -536.60626942 -1558.85117481 2.69942069 -6 3 7 3 4 1557.76926414 538.02025168 2.91366042 -6 3 7 3 5 3070.62316740 3071.12663078 -9457.27040902 -6 3 7 3 6 -71998.86286724 -72002.82630238 74085.98638570 -6 3 7 3 7 71993.69968958 71989.92907020 -74110.13120406 -6 3 7 3 8 -3062.42849746 -3061.86076215 9470.25333708 -6 1 8 1 1 0.02142397 0.08569589 -890.03756365 -6 1 8 1 2 0.34278358 0.38563153 1.22116650 -6 1 8 1 3 -0.06427192 -0.06427192 -894.32235839 -6 1 8 1 4 -0.29993563 -0.27851166 1.17831855 -6 1 8 1 5 -0.08569589 -0.04284795 883.56752359 -6 1 8 1 6 -3.35285189 -0.42847947 5.50596124 -6 1 8 1 7 0.06427192 -0.04284795 887.53095873 -6 1 8 1 8 3.40641182 0.47132742 5.53809720 -6 1 8 2 1 -536.49914955 -536.39202968 -91.28755196 -6 1 8 2 2 -0.02142397 0.19281576 3374.16873886 -6 1 8 2 3 536.52057352 536.37060571 -93.32282946 -6 1 8 2 4 -0.77126305 0.66414318 2915.58858168 -6 1 8 2 5 -533.30697747 533.28555349 -110.29061664 -6 1 8 2 6 -5.42026535 -0.29993563 -2952.50208837 -6 1 8 2 7 537.87028387 -537.97740374 -89.42366625 -6 1 8 2 8 1.54252611 4.15625090 -2952.57707228 -6 1 8 3 1 1557.56573639 -3076.71828792 3060.67173161 -6 1 8 3 2 0.40705550 2914.32456723 -1.03906272 -6 1 8 3 3 1557.63000831 -3076.76113587 -3058.65787809 -6 1 8 3 4 0.47132742 574.74094262 -1.26401445 -6 1 8 3 5 -1554.39498828 -3080.38178742 -3071.16947873 -6 1 8 3 6 -6.22366436 11773.20196666 6.08440853 -6 1 8 3 7 -1558.63693507 -3077.03964753 3064.37807907 -6 1 8 3 8 3.08505221 -2951.43088969 0.69627915 -6 2 8 1 1 536.37060571 536.39202968 -91.37324786 -6 2 8 1 2 0.85695895 -0.58915928 2915.58858168 -6 2 8 1 3 -536.43487763 -536.30633379 -93.53706920 -6 2 8 1 4 -0.06427192 -0.06427192 3374.14731488 -6 2 8 1 5 533.24270555 -533.30697747 -110.29061664 -6 2 8 1 6 -1.49967816 -4.24194679 -2952.58778427 -6 2 8 1 7 -537.91313182 537.91313182 -89.40224228 -6 2 8 1 8 5.42026535 0.28922365 -2952.45924042 -6 2 8 2 1 0.02142397 0.02142397 -889.97329173 -6 2 8 2 2 -0.17139179 0.05355993 1.19974253 -6 2 8 2 3 0.08569589 0.02142397 -894.49375018 -6 2 8 2 4 0.01071199 0.10711987 1.30686240 -6 2 8 2 5 0.02142397 -0.02142397 883.48182770 -6 2 8 2 6 -3.05291625 -0.68556716 5.42026535 -6 2 8 2 7 -0.02142397 -0.06427192 887.48811078 -6 2 8 2 8 3.06362824 0.74983908 5.54880919 -6 2 8 3 1 -3076.76113587 1557.60858433 -3060.80027546 -6 2 8 3 2 574.71951864 0.39634351 -0.87838292 -6 2 8 3 3 -3076.67543997 1557.65143228 3058.61503014 -6 2 8 3 4 2914.34599120 0.42847947 -0.70699113 -6 2 8 3 5 -3080.42463537 -1554.35214033 -3070.91239105 -6 2 8 3 6 11773.14840672 -6.34149622 8.05541411 -6 2 8 3 7 -3076.88967971 -1558.72263097 3064.44235099 -6 2 8 3 8 -2951.45231366 3.14932413 2.53874088 -6 3 8 1 1 1557.63000831 -3076.67543997 -3060.69315559 -6 3 8 1 2 0.32135961 574.65524672 1.09262266 -6 3 8 1 3 1557.71570420 -3076.69686395 3060.62888367 -6 3 8 1 4 0.55702332 2914.36741517 0.89980690 -6 3 8 1 5 -1554.43783623 -3080.42463537 3071.08378284 -6 3 8 1 6 3.80275533 -2952.05218492 -1.49967816 -6 3 8 1 7 -1558.72263097 -3076.99679958 -3064.42092701 -6 3 8 1 8 -6.89851953 11773.72685401 -7.03777536 -6 3 8 2 1 -3076.71828792 1557.60858433 3060.75742751 -6 3 8 2 2 2914.45311107 0.51417537 0.73912709 -6 3 8 2 3 -3076.80398381 1557.56573639 -3060.58603572 -6 3 8 2 4 574.58026281 0.34278358 1.09262266 -6 3 8 2 5 -3080.36036345 -1554.39498828 3071.21232668 -6 3 8 2 6 -2952.08432088 3.83489129 -1.56395008 -6 3 8 2 7 -3076.91110368 -1558.55123918 -3064.39950304 -6 3 8 2 8 11773.75898997 -6.91994351 -6.98421543 -6 3 8 3 1 -0.02142397 -0.06427192 -9469.88912953 -6 3 8 3 2 -1.69249392 0.93194286 2.36734909 -6 3 8 3 3 -0.02142397 -0.04284795 -9461.16957223 -6 3 8 3 4 1.69249392 -0.96407882 2.39948506 -6 3 8 3 5 0.04284795 0.08569589 9444.71596043 -6 3 8 3 6 11.97600130 6.87709556 4.90608998 -6 3 8 3 7 -0.00000000 -0.14996782 9471.79586319 -6 3 8 3 8 -11.99742528 -6.80211165 4.92751395 -7 1 1 1 1 -0.02142397 -0.03213596 -5.18460164 -7 1 1 1 2 -9468.73223495 0.06427192 3.06362824 -7 1 1 1 3 0.02142397 0.02142397 0.51417537 -7 1 1 1 4 9468.76437091 -0.02142397 2.93508440 -7 1 1 1 5 -0.02142397 0.02142397 -0.14996782 -7 1 1 1 6 9470.91748027 0.66414318 -0.85695895 -7 1 1 1 7 0.08569589 -0.03213596 0.38563153 -7 1 1 1 8 -9470.85320835 -0.77126305 -0.83553497 -7 1 1 2 1 0.04284795 0.07498391 -11783.73184973 -7 1 1 2 2 3060.43606790 1561.33635576 3077.53239892 -7 1 1 2 3 -0.02142397 0.08569589 -2915.16010220 -7 1 1 2 4 -3060.43606790 -1561.29350781 3077.61809482 -7 1 1 2 5 -0.02142397 -0.04284795 -574.71951864 -7 1 1 2 6 3060.80027546 -1557.43719255 3077.51097495 -7 1 1 2 7 -0.00000000 0.05355993 2963.54614682 -7 1 1 2 8 -3060.82169943 1557.50146447 3077.36100713 -7 1 1 3 1 -1.77818982 -11783.18553841 0.04284795 -7 1 1 3 2 3062.94267283 3079.61052437 1556.34456989 -7 1 1 3 3 0.73912709 -573.58404804 0.02142397 -7 1 1 3 4 3062.94267283 3079.63194834 -1556.21602604 -7 1 1 3 5 -0.80339901 -2915.61000565 -0.00000000 -7 1 1 3 6 -3061.18590698 3076.58974408 -1557.39434460 -7 1 1 3 7 -1.67106995 2959.93620725 0.02142397 -7 1 1 3 8 -3061.20733096 3076.62188004 1557.31936069 -7 2 1 1 1 -0.06427192 -0.05355993 2957.22607457 -7 2 1 1 2 -3063.52112012 1556.38741783 3075.68993718 -7 2 1 1 3 -0.00000000 0.02142397 -573.36980830 -7 2 1 1 4 3063.47827217 -1556.38741783 3075.45427347 -7 2 1 1 5 0.10711987 -0.00000000 -2914.26029531 -7 2 1 1 6 -3061.07878711 -1557.15868089 3076.43977626 -7 2 1 1 7 -0.04284795 -0.01071199 -11773.64115812 -7 2 1 1 8 3061.05736314 1557.21224082 3076.40764030 -7 2 1 2 1 -0.04284795 0.02142397 -2.08883744 -7 2 1 2 2 -888.96636496 0.53559934 2.46375698 -7 2 1 2 3 0.04284795 0.02142397 0.72841511 -7 2 1 2 4 889.03063689 -0.55702332 2.31378916 -7 2 1 2 5 -0.04284795 -0.00000000 -1.97100558 -7 2 1 2 6 888.62358139 -0.92123087 -0.00000000 -7 2 1 2 7 -0.02142397 0.03213596 -1.86388571 -7 2 1 2 8 -888.60215741 0.92123087 0.29993563 -7 2 1 3 1 2960.34326275 -1.68178194 -0.06427192 -7 2 1 3 2 92.01596707 -534.87092755 538.25591539 -7 2 1 3 3 -2914.67806279 0.70699113 -0.02142397 -7 2 1 3 4 92.02667905 -534.93519947 -538.12737155 -7 2 1 3 5 -3373.81524329 -1.07119869 0.19281576 -7 2 1 3 6 90.40916904 535.83500637 537.78458797 -7 2 1 3 7 2963.47116291 -0.05355993 0.03213596 -7 2 1 3 8 90.30204917 535.93141425 -537.81672393 -7 3 1 1 1 -1.02835074 2959.38989592 -0.02142397 -7 3 1 1 2 -3058.87211782 3075.02579400 1559.60101389 -7 3 1 1 3 0.26779967 -2913.70327199 -0.10711987 -7 3 1 1 4 -3058.88282981 3074.94009810 -1559.53674197 -7 3 1 1 5 0.40705550 -574.91233441 0.02142397 -7 3 1 1 6 3060.65030764 3076.03272076 -1559.23680634 -7 3 1 1 7 -3.19217208 -11772.98772692 -0.04284795 -7 3 1 1 8 3060.67173161 3076.07556871 1559.22609435 -7 3 1 2 1 2962.05718064 -2.52802890 0.03213596 -7 3 1 2 2 89.53078612 539.75559355 -536.47772558 -7 3 1 2 3 -3371.54430208 0.55702332 -0.02142397 -7 3 1 2 4 89.61648201 539.75559355 536.62769339 -7 3 1 2 5 -2914.04605557 0.10711987 0.04284795 -7 3 1 2 6 89.59505804 -538.04167566 -536.13494200 -7 3 1 2 7 2965.18508081 -1.56395008 -0.03213596 -7 3 1 2 8 89.61648201 -537.96669175 536.02782213 -7 3 1 3 1 -0.17139179 -0.06427192 4.86324203 -7 3 1 3 2 -890.85167465 -0.14996782 -2.89223645 -7 3 1 3 3 0.04284795 0.02142397 2.16382134 -7 3 1 3 4 890.84096266 0.27851166 -2.74226863 -7 3 1 3 5 -0.05355993 -0.02142397 -2.46375698 -7 3 1 3 6 888.94494099 -0.12854384 1.92815763 -7 3 1 3 7 0.04284795 -0.04284795 -2.71013267 -7 3 1 3 8 -889.00921291 0.11783186 2.02456552 -7 1 2 1 1 -9469.63204185 3060.52176380 3063.70322389 -7 1 2 1 2 74061.56305567 -71906.32201282 -71941.36092181 -7 1 2 1 3 -0.23566371 -1555.85181849 -535.47079881 -7 1 2 1 4 -0.86767094 535.79215842 1555.63757875 -7 1 2 1 5 -0.97479080 -534.48529602 -1556.49453770 -7 1 2 1 6 -1.63893399 1553.28094165 536.41345366 -7 1 2 1 7 -74051.57948392 71904.77948671 71937.50460655 -7 1 2 1 8 9463.26912166 -3057.64023933 -3059.86833260 -7 1 2 2 1 0.32135961 1561.90409106 3079.65337232 -7 1 2 2 2 -71903.50476027 66918.12465487 80698.69939786 -7 1 2 2 3 890.95879452 3065.06364622 93.13001370 -7 1 2 2 4 -535.43866285 -0.36420755 -3078.30366197 -7 1 2 2 5 2.35663711 -537.50607631 3074.53304260 -7 1 2 2 6 1557.34078466 -0.10711987 -3075.02579400 -7 1 2 2 7 66929.13657735 -71897.27038392 -80701.79516206 -7 1 2 2 8 3058.78642193 890.25180339 -90.83764851 -7 1 2 3 1 3.68492348 3078.04657429 1556.69806545 -7 1 2 3 2 -71942.56066434 80699.36354105 66983.76771030 -7 1 2 3 3 2.42090903 3075.49712142 -538.23449142 -7 1 2 3 4 1556.83732128 -3078.92495721 0.47132742 -7 1 2 3 5 890.72313081 93.15143767 3062.87840091 -7 1 2 3 6 -538.50229109 -3072.51918907 -0.27851166 -7 1 2 3 7 66969.97067124 -80706.03710886 -71956.21844758 -7 1 2 3 8 3057.35101569 -88.59884326 890.78740273 -7 2 2 1 1 -3064.22811125 -890.16610749 93.64418907 -7 2 2 1 2 -66921.18828311 71901.97294615 80699.45994893 -7 2 2 1 3 -1561.08998006 0.51417537 3079.07492503 -7 2 2 1 4 0.19281576 535.29940702 -3078.23939005 -7 2 2 1 5 537.73102804 -2.05670148 3074.49019465 -7 2 2 1 6 -890.45533114 -3058.76499795 -90.85907249 -7 2 2 1 7 71899.94838064 -66928.81521775 -80701.81658604 -7 2 2 1 8 -0.79268703 -1558.05848778 -3075.65780122 -7 2 2 2 1 1555.76612260 0.38563153 -535.53507073 -7 2 2 2 2 71905.39006996 -74063.19127767 -71940.86817042 -7 2 2 2 3 -3059.85762061 9470.53184874 3063.07121667 -7 2 2 2 4 -535.97426219 0.70699113 1555.65900273 -7 2 2 2 5 534.53885596 1.19974253 -1556.40884181 -7 2 2 2 6 3057.52240748 -9463.20484974 -3059.96474048 -7 2 2 2 7 -71903.18340067 74052.50071479 71938.10447781 -7 2 2 2 8 -1554.22359649 0.98550279 535.76002246 -7 2 2 3 1 3075.47569744 2.39948506 538.19164347 -7 2 2 3 2 80699.20286125 -71942.28215268 -66983.64987845 -7 2 2 3 3 3077.99301436 3.59922758 -1556.68735347 -7 2 2 3 4 -3078.87139728 1556.77304936 -0.40705550 -7 2 2 3 5 93.18357364 890.76597876 -3062.89982488 -7 2 2 3 6 -88.57741929 3057.37243966 -890.74455478 -7 2 2 3 7 -80705.80144515 66969.91711130 71955.92922393 -7 2 2 3 8 -3072.49776510 -538.48086712 0.32135961 -7 3 2 1 1 -3059.60053293 90.86978447 -889.53410027 -7 3 2 1 2 -66971.23468569 80709.01504120 71950.68035037 -7 3 2 1 3 540.17336104 3075.26145771 -0.38563153 -7 3 2 1 4 -884.69228221 -101.54963537 -3065.25646199 -7 3 2 1 5 -1559.77240568 3079.73906821 1.69249392 -7 3 2 1 6 -0.59987126 -3073.16190828 537.57034824 -7 3 2 1 7 71938.87574086 -80703.88399950 -66977.13699044 -7 3 2 1 8 -3.10647619 -3076.24696050 -1557.69428023 -7 3 2 2 1 3075.43284950 540.00196925 0.51417537 -7 3 2 2 2 80709.48636862 -66969.98138322 -71951.36591753 -7 3 2 2 3 90.28062520 -3060.50033982 890.10183557 -7 3 2 2 4 -101.67817921 -884.85296201 3065.21361404 -7 3 2 2 5 3079.64266033 -1559.92237350 -1.77818982 -7 3 2 2 6 -3076.85754375 -4.00628308 1558.33699944 -7 3 2 2 7 -80703.46623201 71940.03263544 66976.52640719 -7 3 2 2 8 -3072.99051650 -0.78197504 -537.44180439 -7 3 2 3 1 1559.00114263 -536.80979717 -3.22430804 -7 3 2 3 2 71946.00992411 -71945.95636417 -74125.82426480 -7 3 2 3 3 536.80979717 -1559.06541455 -3.19217208 -7 3 2 3 4 3067.75235492 -3067.67737102 -9458.21306386 -7 3 2 3 5 -3058.12227874 3058.14370272 9466.35417387 -7 3 2 3 6 -536.25277385 1559.38677415 2.97793235 -7 3 2 3 7 -71955.67213625 71955.71498420 74118.09021030 -7 3 2 3 8 -1559.40819813 536.26348584 3.02078029 -7 1 3 1 1 -0.12854384 -0.02142397 0.63200722 -7 1 3 1 2 -0.55702332 889.00921291 2.37806108 -7 1 3 1 3 -0.03213596 -0.00000000 -2.22809327 -7 1 3 1 4 0.50346338 -889.00921291 2.52802890 -7 1 3 1 5 0.01071199 0.08569589 -1.97100558 -7 1 3 1 6 -0.87838292 888.70927728 0.29993563 -7 1 3 1 7 -0.00000000 0.04284795 -1.91744565 -7 1 3 1 8 0.85695895 -888.58073344 0.26779967 -7 1 3 2 1 -0.00000000 -0.06427192 -573.47692817 -7 1 3 2 2 -1556.45168975 3063.47827217 3075.73278513 -7 1 3 2 3 -0.00000000 -0.02142397 2957.12966669 -7 1 3 2 4 1556.44097777 -3063.58539204 3075.75420910 -7 1 3 2 5 -0.03213596 -0.04284795 -2914.34599120 -7 1 3 2 6 -1557.22295281 -3061.05736314 3076.31123242 -7 1 3 2 7 -0.12854384 0.02142397 -11773.73756600 -7 1 3 2 8 1557.26580076 3061.05736314 3076.41835229 -7 1 3 3 1 0.62129524 -2914.64592683 -0.01071199 -7 1 3 3 2 -534.89235152 91.97311912 -538.21306745 -7 1 3 3 3 -1.74605386 2960.32183877 -0.06427192 -7 1 3 3 4 -534.96733543 91.86599925 538.38445924 -7 1 3 3 5 -1.04977471 -3373.76168336 0.04284795 -7 1 3 3 6 535.89927829 90.36632109 537.61319618 -7 1 3 3 7 -0.10711987 2963.59970675 -0.00000000 -7 1 3 3 8 536.00639816 90.23777725 -537.87028387 -7 2 3 1 1 -0.00000000 0.03213596 -2914.98871041 -7 2 3 1 2 -1561.29350781 -3058.29367053 3077.46812700 -7 2 3 1 3 0.03213596 -0.08569589 -11782.43569933 -7 2 3 1 4 1561.28279583 3058.35794245 3077.63951879 -7 2 3 1 5 0.05355993 -0.06427192 -574.97660633 -7 2 3 1 6 -1557.45861652 3060.80027546 3077.33958316 -7 2 3 1 7 0.04284795 0.06427192 2962.26070839 -7 2 3 1 8 1557.39434460 -3060.82169943 3077.31815918 -7 2 3 2 1 -0.04284795 0.05355993 0.65343120 -7 2 3 2 2 -0.08569589 9468.66796303 3.06362824 -7 2 3 2 3 -0.00000000 0.02142397 -3.92058719 -7 2 3 2 4 0.05355993 -9468.77508290 2.87081248 -7 2 3 2 5 0.02142397 0.02142397 -0.29993563 -7 2 3 2 6 0.81411100 9468.58226714 -1.02835074 -7 2 3 2 7 0.08569589 -0.02142397 -0.85695895 -7 2 3 2 8 -0.77126305 -9468.67867502 -0.89980690 -7 2 3 3 1 -573.51977611 0.71770312 -0.04284795 -7 2 3 3 2 3079.65337232 3062.89982488 -1556.32314591 -7 2 3 3 3 -11783.20696238 -1.82103777 -0.10711987 -7 2 3 3 4 3079.66408430 3062.87840091 1556.40884181 -7 2 3 3 5 -2915.64214161 -0.77126305 -0.00000000 -7 2 3 3 6 3076.58974408 -3061.14305904 -1557.22295281 -7 2 3 3 7 2959.89335930 -1.59608604 0.05355993 -7 2 3 3 8 3076.54689613 -3061.28231486 1557.22295281 -7 3 3 1 1 0.59987126 -3372.01562950 0.05355993 -7 3 3 1 2 539.75559355 91.84457528 536.45630160 -7 3 3 1 3 -3.70634745 2960.27899083 0.08569589 -7 3 3 1 4 539.74488157 91.78030336 -536.58484545 -7 3 3 1 5 -0.18210378 -2914.51738299 0.02142397 -7 3 3 1 6 -537.95597976 89.53078612 -535.94212623 -7 3 3 1 7 -0.21423974 2963.36404304 0.05355993 -7 3 3 1 8 -538.02025168 89.56292208 536.15636597 -7 3 3 2 1 -2913.72469596 0.19281576 -0.04284795 -7 3 3 2 2 3075.02579400 -3058.89354180 -1559.70813376 -7 3 3 2 3 2959.58271168 -1.04977471 0.08569589 -7 3 3 2 4 3075.01508201 -3058.82926988 1559.62243786 -7 3 3 2 5 -574.90162242 0.53559934 0.04284795 -7 3 3 2 6 3076.07556871 3060.62888367 -1559.19395839 -7 3 3 2 7 -11772.92345500 -3.19217208 0.02142397 -7 3 3 2 8 3075.98987281 3060.59674771 1559.15111044 -7 3 3 3 1 -0.06427192 0.02142397 2.28165320 -7 3 3 3 2 0.17139179 890.78740273 -2.97793235 -7 3 3 3 3 0.01071199 -0.02142397 4.73469819 -7 3 3 3 4 -0.11783186 -890.74455478 -2.78511658 -7 3 3 3 5 -0.03213596 0.10711987 -2.46375698 -7 3 3 3 6 -0.14996782 888.90209304 2.14239737 -7 3 3 3 7 0.04284795 -0.06427192 -2.74226863 -7 3 3 3 8 0.10711987 -889.04134887 2.03527750 -7 1 4 1 1 9469.61061787 -3060.53247578 3063.70322389 -7 1 4 1 2 0.83553497 -535.79215842 1555.59473081 -7 1 4 1 3 0.23566371 1555.85181849 -535.38510292 -7 1 4 1 4 -74061.54163170 71906.24702891 -71941.29664989 -7 1 4 1 5 0.98550279 534.44244807 -1556.49453770 -7 1 4 1 6 -9463.22627371 3057.65095132 -3059.94331651 -7 1 4 1 7 74051.42951611 -71904.56524697 71937.45104661 -7 1 4 1 8 1.62822200 -1553.29165363 536.41345366 -7 1 4 2 1 -0.19281576 -1561.79697119 3079.83547609 -7 1 4 2 2 535.40652689 0.37491954 -3078.38935787 -7 1 4 2 3 -891.06591439 -3065.14934212 93.32282946 -7 1 4 2 4 71903.59045617 -66918.33889461 80696.65340837 -7 1 4 2 5 -2.97793235 538.14879553 3075.36857758 -7 1 4 2 6 -3058.87211782 -890.29465133 -90.75195262 -7 1 4 2 7 -66928.62240198 71896.98116028 -80701.09888292 -7 1 4 2 8 -1557.43719255 0.14996782 -3075.02579400 -7 1 4 3 1 3.57780361 3077.92874243 -1556.90159320 -7 1 4 3 2 1556.81589731 -3078.90353324 -0.46061543 -7 1 4 3 3 2.48518095 3075.53996937 537.99882771 -7 1 4 3 4 -71942.22859275 80699.11716535 -66981.23968141 -7 1 4 3 5 891.35513803 92.55156641 -3063.82105575 -7 1 4 3 6 3057.34030370 -88.56670730 -890.85167465 -7 1 4 3 7 66969.11371229 -80705.05160607 71954.96514512 -7 1 4 3 8 -538.49157911 -3072.49776510 0.32135961 -7 2 4 1 1 3064.33523112 890.27322736 93.85842881 -7 2 4 1 2 -0.17139179 -535.35296696 -3078.27152601 -7 2 4 1 3 1561.03642013 -0.55702332 3079.22489284 -7 2 4 1 4 66921.22041907 -71902.04793006 80697.25327964 -7 2 4 1 5 -538.40588321 2.74226863 3075.41142552 -7 2 4 1 6 0.81411100 1558.03706381 -3075.66851321 -7 2 4 1 7 -71899.32708540 66928.17249854 -80700.88464318 -7 2 4 1 8 890.44461915 3058.66859007 -90.93405640 -7 2 4 2 1 -1555.72327465 -0.40705550 -535.54578272 -7 2 4 2 2 535.94212623 -0.77126305 1555.66971471 -7 2 4 2 3 3059.91118055 -9470.51042477 3063.11406462 -7 2 4 2 4 -71905.26152612 74062.84849409 -71940.58965876 -7 2 4 2 5 -534.53885596 -1.15689458 -1556.40884181 -7 2 4 2 6 1554.25573245 -0.94265484 535.74931047 -7 2 4 2 7 71902.90488901 -74052.17935519 71937.87952608 -7 2 4 2 8 -3057.43671158 9463.18342576 -3059.95402849 -7 2 4 3 1 3075.49712142 2.47446896 -537.96669175 -7 2 4 3 2 -3078.90353324 1556.82660929 0.47132742 -7 2 4 3 3 3077.96087839 3.55637964 1556.88016923 -7 2 4 3 4 80699.42781297 -71942.41069652 66981.71100883 -7 2 4 3 5 92.54085442 891.32300207 3063.75678383 -7 2 4 3 6 -3072.45491715 -538.47015513 -0.29993563 -7 2 4 3 7 -80705.37296567 66969.40293593 -71955.20080883 -7 2 4 3 8 -88.60955525 3057.35101569 890.78740273 -7 3 4 1 1 -3059.60053293 90.88049646 889.51267629 -7 3 4 1 2 -884.66014625 -101.53892338 3065.24575000 -7 3 4 1 3 540.16264905 3075.32572963 0.29993563 -7 3 4 1 4 -66971.19183774 80708.95076928 -71950.53038256 -7 3 4 1 5 -1559.74026972 3079.69622027 -1.75676584 -7 3 4 1 6 -3.09576420 -3076.22553652 1557.65143228 -7 3 4 1 7 71938.79004497 -80704.01254334 66977.15841442 -7 3 4 1 8 -0.62129524 -3073.09763636 -537.49536433 -7 3 4 2 1 3075.34715360 540.05552919 -0.50346338 -7 3 4 2 2 -101.54963537 -884.67085824 -3065.24575000 -7 3 4 2 3 90.23777725 -3060.47891585 -890.20895544 -7 3 4 2 4 80709.01504120 -66968.96374447 71950.61607845 -7 3 4 2 5 3079.61052437 -1559.90094952 1.82103777 -7 3 4 2 6 -3073.14048431 -0.62129524 537.48465234 -7 3 4 2 7 -80703.29484022 71937.99735794 -66976.47284726 -7 3 4 2 8 -3076.24696050 -3.10647619 -1557.70499222 -7 3 4 3 1 -1559.06541455 536.82050916 -3.22430804 -7 3 4 3 2 -3067.69879499 3067.69879499 -9458.20235188 -7 3 4 3 3 -536.78837320 1559.04399057 -3.21359606 -7 3 4 3 4 -71945.75283642 71945.79568437 -74125.70643295 -7 3 4 3 5 3058.11156676 -3058.16512669 9466.39702182 -7 3 4 3 6 1559.46175806 -536.19921392 2.99935632 -7 3 4 3 7 71955.58644035 -71955.57572837 74117.97237844 -7 3 4 3 8 536.19921392 -1559.44033409 2.95650837 -7 1 5 1 1 0.04284795 -0.00000000 -0.63200722 -7 1 5 1 2 -0.77126305 2.33521313 890.12325954 -7 1 5 1 3 0.03213596 -0.08569589 -0.83553497 -7 1 5 1 4 0.81411100 -2.33521313 890.03756365 -7 1 5 1 5 -0.03213596 -0.02142397 -4.00628308 -7 1 5 1 6 -0.74983908 -2.35663711 -886.69542375 -7 1 5 1 7 -0.02142397 0.03213596 -1.41398226 -7 1 5 1 8 0.72841511 2.42090903 -886.62043984 -7 1 5 2 1 -0.02142397 -0.10711987 -2915.89922929 -7 1 5 2 2 -534.76380768 -537.93455579 91.37324786 -7 1 5 2 3 0.12854384 0.14996782 -3374.53294641 -7 1 5 2 4 534.72095973 537.99882771 93.49422125 -7 1 5 2 5 0.62129524 -0.64271921 2950.72389855 -7 1 5 2 6 -537.24898863 533.90684873 101.89241895 -7 1 5 2 7 -0.59987126 0.61058325 2950.72389855 -7 1 5 2 8 537.14186876 -534.06752853 101.95669087 -7 1 5 3 1 -0.83553497 -574.62311076 0.02142397 -7 1 5 3 2 -1556.13033015 3074.79013029 3062.57846527 -7 1 5 3 3 -1.64964598 -2914.51738299 -0.00000000 -7 1 5 3 4 -1556.22673803 3074.81155426 -3062.68558514 -7 1 5 3 5 -3.57780361 2952.82344798 -0.04284795 -7 1 5 3 6 1557.90851997 3080.63887511 -3066.84183604 -7 1 5 3 7 2.72084466 -11774.38028521 -0.01071199 -7 1 5 3 8 1557.88709599 3080.61745113 3066.88468399 -7 2 5 1 1 -0.08569589 -0.16067980 -3374.50081045 -7 2 5 1 2 537.95597976 534.78523165 91.56606362 -7 2 5 1 3 0.05355993 0.08569589 -2915.93136525 -7 2 5 1 4 -537.99882771 -534.76380768 93.57991715 -7 2 5 1 5 0.66414318 -0.70699113 2950.72389855 -7 2 5 1 6 533.94969668 -537.37753247 101.97811484 -7 2 5 1 7 -0.57844729 0.59987126 2950.61677869 -7 2 5 1 8 -533.97112065 537.25970062 102.01025080 -7 2 5 2 1 -0.00000000 0.09640788 -0.80339901 -7 2 5 2 2 -2.39948506 0.83553497 890.16610749 -7 2 5 2 3 -0.06427192 0.02142397 -0.62129524 -7 2 5 2 4 2.37806108 -0.77126305 890.03756365 -7 2 5 2 5 -0.01071199 -0.08569589 -3.98485911 -7 2 5 2 6 -2.42090903 -0.81411100 -886.65257580 -7 2 5 2 7 -0.00000000 -0.03213596 -1.43540624 -7 2 5 2 8 2.44233300 0.74983908 -886.55616792 -7 2 5 3 1 -2914.58165491 -1.71391790 0.03213596 -7 2 5 3 2 3074.68301042 -1556.19460207 -3062.55704130 -7 2 5 3 3 -574.54812685 -0.79268703 0.02142397 -7 2 5 3 4 3074.75799433 -1556.32314591 3062.51419335 -7 2 5 3 5 2952.75917606 -3.51353169 -0.04284795 -7 2 5 3 6 3080.63887511 1557.95136791 -3066.84183604 -7 2 5 3 7 -11774.33743726 2.71013267 0.01071199 -7 2 5 3 8 3080.63887511 1557.91923195 3066.88468399 -7 3 5 1 1 0.38563153 -2914.49595902 -0.10711987 -7 3 5 1 2 -1559.02256660 3078.58217363 -3060.92881930 -7 3 5 1 3 0.37491954 -574.59097480 -0.04284795 -7 3 5 1 4 -1558.92615872 3078.56074966 3061.05736314 -7 3 5 1 5 12.29736091 -11774.44455713 0.06427192 -7 3 5 1 6 1555.10197941 3076.71828792 3068.59860189 -7 3 5 1 7 -5.42026535 2952.75917606 -0.04284795 -7 3 5 1 8 1555.20909928 3076.77184785 -3068.51290599 -7 3 5 2 1 -574.54812685 0.43919146 0.05355993 -7 3 5 2 2 3078.66786953 -1559.00114263 3060.84312340 -7 3 5 2 3 -2914.45311107 0.29993563 0.04284795 -7 3 5 2 4 3078.66786953 -1558.89402276 -3061.10021109 -7 3 5 2 5 -11774.39099720 12.38305680 0.04284795 -7 3 5 2 6 3076.73971189 1555.12340339 3068.64144983 -7 3 5 2 7 2952.69490413 -5.43097733 0.03213596 -7 3 5 2 8 3076.78255984 1555.15553935 -3068.51290599 -7 3 5 3 1 -0.00000000 -0.04284795 -2.49589294 -7 3 5 3 2 3.08505221 -3.04220427 9467.74673216 -7 3 5 3 3 0.01071199 -0.04284795 -2.52802890 -7 3 5 3 4 -3.09576420 3.02078029 9467.51106845 -7 3 5 3 5 -0.03213596 -0.00000000 -11.44040196 -7 3 5 3 6 3.04220427 3.08505221 -9459.49850228 -7 3 5 3 7 -0.04284795 -0.02142397 -0.16067980 -7 3 5 3 8 -3.04220427 -3.04220427 -9459.30568652 -7 1 6 1 1 9466.46129374 3061.60367447 -3061.80720222 -7 1 6 1 2 -0.32135961 1557.51217645 -538.83436268 -7 1 6 1 3 -1.45683021 -1556.70877744 536.30633379 -7 1 6 1 4 -9464.87591968 -3057.82234311 3056.51548071 -7 1 6 1 5 -0.89980690 -536.97047697 1557.95136791 -7 1 6 1 6 -74103.85397977 -72014.58806394 72010.34611715 -7 1 6 1 7 74104.53954693 72008.48223143 -72002.55850270 -7 1 6 1 8 0.23566371 538.51300308 -1557.86567202 -7 1 6 2 1 1.17831855 -1557.84424805 3076.75042388 -7 1 6 2 2 1554.37356431 0.81411100 -3072.79770073 -7 1 6 2 3 889.83403590 -3061.52869056 91.39467183 -7 1 6 2 4 3055.25146627 -889.07348483 -90.02353751 -7 1 6 2 5 -2.58158883 533.54264118 3080.08185179 -7 1 6 2 6 -72014.05246460 -67033.49275328 80801.22382403 -7 1 6 2 7 67054.63821532 72007.59313652 -80809.37564603 -7 1 6 2 8 -538.72724282 -0.11783186 -3077.32887117 -7 1 6 3 1 -1.26401445 3077.80019859 -1557.50146447 -7 1 6 3 2 534.95662344 -3075.09006592 0.02142397 -7 1 6 3 3 -0.25708768 3076.88967971 538.12737155 -7 1 6 3 4 -3059.62195690 -90.79480057 -890.89452260 -7 1 6 3 5 -885.97772063 100.47843668 -3064.57089483 -7 1 6 3 6 72010.31398119 80799.03857872 -67021.49532800 -7 1 6 3 7 -67039.25580220 -80811.22881975 71996.92399762 -7 1 6 3 8 -1559.06541455 -3077.14676739 -0.46061543 -7 2 6 1 1 -3061.55011454 889.89830782 91.34111190 -7 2 6 1 2 -890.38034723 3057.09392801 -88.71667512 -7 2 6 1 3 -1557.85496003 1.15689458 3076.73971189 -7 2 6 1 4 0.99621478 1554.73777186 -3072.64773292 -7 2 6 1 5 533.62833707 -2.57087684 3080.16754769 -7 2 6 1 6 -67031.98236313 -72012.08145902 80799.78841780 -7 2 6 1 7 72007.32533685 67050.06419694 -80809.27923815 -7 2 6 1 8 -0.21423974 -538.32018732 -3077.45741501 -7 2 6 2 1 -1557.50146447 -0.88909491 535.51364676 -7 2 6 2 2 -3057.97231093 -9464.96161558 3056.47263277 -7 2 6 2 3 3061.38943473 9466.41844579 -3062.12856183 -7 2 6 2 4 1556.56952161 0.38563153 -539.51992984 -7 2 6 2 5 -537.79529996 -1.39255829 1557.05156102 -7 2 6 2 6 -72013.51686525 -74104.45385103 72013.23835360 -7 2 6 2 7 72010.49608496 74104.67880276 -72002.91199827 -7 2 6 2 8 538.34161129 0.31064762 -1557.75855215 -7 2 6 3 1 3076.93252766 -0.22495172 538.12737155 -7 2 6 3 2 -91.00904030 -3059.71836478 -890.94808253 -7 2 6 3 3 3077.84304654 -1.24259047 -1557.52288844 -7 2 6 3 4 -3075.94702487 535.53507073 -0.59987126 -7 2 6 3 5 100.45701271 -885.96700865 -3064.57089483 -7 2 6 3 6 80798.04236394 72009.78909383 -67021.04542455 -7 2 6 3 7 -80808.89360662 -67039.12725836 71996.89186166 -7 2 6 3 8 -3077.27531124 -1558.94758269 -0.34278358 -7 3 6 1 1 3061.33587480 90.66625672 889.93044378 -7 3 6 1 2 -1.17831855 -3075.56139334 -535.97426219 -7 3 6 1 3 -538.45944314 3076.69686395 -0.04284795 -7 3 6 1 4 -2.03527750 -3073.95459531 1559.90094952 -7 3 6 1 5 1554.11647662 3075.83990500 1.58537405 -7 3 6 1 6 67036.67421337 80805.08013930 -71999.39846658 -7 3 6 1 7 -71999.18422685 -80808.28302337 67021.28108826 -7 3 6 1 8 888.70927728 -90.40916904 3062.74985706 -7 3 6 2 1 3076.69686395 -538.44873116 0.02142397 -7 3 6 2 2 -3074.14741108 -2.17453333 1559.80454164 -7 3 6 2 3 90.59127282 3061.27160288 889.97329173 -7 3 6 2 4 -3076.40764030 -0.57844729 -536.62769339 -7 3 6 2 5 3075.76492109 1554.13790059 1.58537405 -7 3 6 2 6 80804.25531631 67036.27786986 -71998.77717134 -7 3 6 2 7 -80806.15133799 -71999.23778678 67021.30251224 -7 3 6 2 8 -90.60198480 888.82710914 3062.82484097 -7 3 6 3 1 -1559.47247005 -535.66361458 2.04598949 -7 3 6 3 2 536.34918173 1559.47247005 3.84560328 -7 3 6 3 3 -536.53128551 -1558.72263097 2.54945287 -7 3 6 3 4 1557.88709599 537.97740374 2.74226863 -7 3 6 3 5 3070.17326395 3070.41963965 -9458.21306386 -7 3 6 3 6 -72000.45895328 -72002.03361535 74086.95046451 -7 3 6 3 7 71995.11367184 71991.04311684 -74109.46706088 -7 3 6 3 8 -3063.04979270 -3062.49276938 9469.33210622 -7 1 7 1 1 -0.02142397 0.01071199 -2.65657274 -7 1 7 1 2 -74052.67210658 66926.62997243 66965.96438815 -7 1 7 1 3 0.03213596 -0.02142397 0.08569589 -7 1 7 1 4 74052.53285075 -66926.73709230 66966.00723610 -7 1 7 1 5 -0.09640788 0.02142397 3.55637964 -7 1 7 1 6 74102.02223002 67046.64707313 -67035.09955130 -7 1 7 1 7 0.12854384 -0.06427192 137.28482351 -7 1 7 1 8 -74102.14006187 -67046.68992108 -67035.15311124 -7 1 7 2 1 0.17139179 0.05355993 2964.03889821 -7 1 7 2 2 71893.37122071 -71893.38193270 -80701.97726584 -7 1 7 2 3 0.08569589 -0.00000000 2964.02818623 -7 1 7 2 4 -71893.46762859 71893.45691661 -80702.13794564 -7 1 7 2 5 0.03213596 -0.00000000 -11772.30215976 -7 1 7 2 6 72009.09281468 72009.08210270 -80812.21432255 -7 1 7 2 7 0.21423974 0.03213596 328872.88605177 -7 1 7 2 8 -72009.03925475 -72009.10352667 -80812.11791466 -7 1 7 3 1 -4.94893793 2963.50329887 0.28922365 -7 1 7 3 2 71939.49703610 -80703.33768817 -71955.35077664 -7 1 7 3 3 -3.37427586 -11772.17361592 0.21423974 -7 1 7 3 4 71939.37920424 -80703.18772035 71953.01556351 -7 1 7 3 5 -2.88152446 2953.63755898 0.94265484 -7 1 7 3 6 -71999.40917857 -80812.08577870 71993.89250534 -7 1 7 3 7 131.20041498 328885.77257195 1.11404663 -7 1 7 3 8 -71999.54843440 -80812.07506672 -71993.93535329 -7 2 7 1 1 0.02142397 -0.08569589 2964.02818623 -7 2 7 1 2 71893.41406866 -71893.46762859 -80702.11652167 -7 2 7 1 3 0.06427192 0.04284795 2963.96391430 -7 2 7 1 4 -71893.42478064 71893.37122071 -80702.15936962 -7 2 7 1 5 0.04284795 -0.04284795 -11772.34500771 -7 2 7 1 6 72008.95355886 72009.12495064 -80812.04293076 -7 2 7 1 7 -0.06427192 -0.03213596 328872.57540415 -7 2 7 1 8 -72008.88928693 -72008.85715097 -80811.95723486 -7 2 7 2 1 -0.96407882 0.58915928 0.81411100 -7 2 7 2 2 -66929.43651299 74053.48621758 66966.64995531 -7 2 7 2 3 -0.17139179 -0.06427192 -2.44233300 -7 2 7 2 4 66928.85806570 -74052.35074698 66965.79299637 -7 2 7 2 5 -0.19281576 0.12854384 3.51353169 -7 2 7 2 6 67049.45361369 74102.69708519 -67035.95651025 -7 2 7 2 7 -0.74983908 -2.74226863 136.74922417 -7 2 7 2 8 -67046.88273684 -74101.88297419 -67035.29236707 -7 2 7 3 1 -11768.59581231 -0.77126305 -0.27851166 -7 2 7 3 2 -80707.08688357 71938.37227748 71954.81517730 -7 2 7 3 3 2964.18886603 -5.46311330 -0.17139179 -7 2 7 3 4 -80707.04403562 71938.38298947 -71952.47996417 -7 2 7 3 5 2954.39811004 -2.52802890 -1.00692676 -7 2 7 3 6 -80812.59995407 -72000.57678514 71994.38525674 -7 2 7 3 7 328889.12542384 132.78578903 -0.97479080 -7 2 7 3 8 -80812.51425818 -72000.38396937 -71994.21386495 -7 3 7 1 1 -4.99178587 2963.49258688 0.16067980 -7 3 7 1 2 71939.21852444 -80703.08060049 -71954.99728108 -7 3 7 1 3 -3.27786798 -11772.19503989 0.23566371 -7 3 7 1 4 71939.62557994 -80703.61619983 71953.35834709 -7 3 7 1 5 -2.84938850 2953.70183090 1.00692676 -7 3 7 1 6 -71999.86979400 -80812.27859447 71994.10674508 -7 3 7 1 7 131.39323074 328885.95467573 -0.00000000 -7 3 7 1 8 -71999.46273850 -80812.05364274 -71993.76396150 -7 3 7 2 1 -11768.46726847 -0.86767094 -0.24637570 -7 3 7 2 2 -80706.82979588 71938.14732576 71954.52595365 -7 3 7 2 3 2964.21029000 -5.29172151 -0.14996782 -7 3 7 2 4 -80707.33325927 71938.64007715 -71952.95129159 -7 3 7 2 5 2954.45166998 -2.44233300 -0.85695895 -7 3 7 2 6 -80813.00700957 -72000.94099269 71994.68519237 -7 3 7 2 7 328889.61817523 133.25711645 -0.78197504 -7 3 7 2 8 -80812.62137805 -72000.46966527 -71994.25671289 -7 3 7 3 1 -0.92123087 0.59987126 -1.52110213 -7 3 7 3 2 -66970.35630276 66970.27060687 74116.12991670 -7 3 7 3 3 -0.09640788 -0.08569589 -0.98550279 -7 3 7 3 4 66969.92782329 -66969.67073561 74117.73671473 -7 3 7 3 5 0.42847947 -0.57844729 -2.99935632 -7 3 7 3 6 67024.37685246 67022.41655887 -74107.68887106 -7 3 7 3 7 -1.09262266 -0.42847947 -12.96150409 -7 3 7 3 8 -67022.30943900 -67022.36299894 -74107.73171901 -7 1 8 1 1 -9466.52556566 -3061.57153851 -3062.05357792 -7 1 8 1 2 9464.87591968 3057.76878318 3056.61188860 -7 1 8 1 3 1.46754220 1556.64450552 536.19921392 -7 1 8 1 4 0.29993563 -1557.48004049 -538.89863461 -7 1 8 1 5 1.55323809 537.67746810 1557.09440897 -7 1 8 1 6 -0.23566371 -538.53442705 -1557.82282407 -7 1 8 1 7 -74105.52504972 -72009.39275032 -72003.72610927 -7 1 8 1 8 74103.98252361 72014.89871156 72012.72417823 -7 1 8 2 1 -1.19974253 1557.89780798 3076.75042388 -7 1 8 2 2 -3055.27289024 889.05206086 -89.99140155 -7 1 8 2 3 -889.87688385 3061.52869056 91.39467183 -7 1 8 2 4 -1554.42712424 -0.72841511 -3072.88339663 -7 1 8 2 5 2.61372479 -533.64976105 3080.16754769 -7 1 8 2 6 538.73795480 0.04284795 -3077.21103932 -7 1 8 2 7 -67054.57394340 -72007.56100056 -80809.35422206 -7 1 8 2 8 72014.05246460 67033.43919334 80801.09528019 -7 1 8 3 1 -1.17831855 3077.85375853 1557.53360043 -7 1 8 3 2 -3059.64338088 -90.81622454 890.87309862 -7 1 8 3 3 -0.25708768 3076.91110368 -538.17021950 -7 1 8 3 4 534.92448748 -3075.04721797 -0.04284795 -7 1 8 3 5 -885.96700865 100.43558873 3064.57089483 -7 1 8 3 6 -1558.99043064 -3077.08249547 0.42847947 -7 1 8 3 7 -67039.02013849 -80811.04671598 -71996.72046987 -7 1 8 3 8 72010.21757330 80798.76006706 67021.50603999 -7 2 8 1 1 3061.46441864 -889.86617186 91.37324786 -7 2 8 1 2 -0.96407882 -1554.76990782 -3072.63702093 -7 2 8 1 3 1557.86567202 -1.17831855 3076.69686395 -7 2 8 1 4 890.36963524 -3057.09392801 -88.69525114 -7 2 8 1 5 -533.60691310 2.59230082 3080.12469974 -7 2 8 1 6 0.26779967 538.34161129 -3077.53239892 -7 2 8 1 7 -72007.04682520 -67049.91422912 -80809.05428642 -7 2 8 1 8 67031.82168333 72011.88864325 80799.62773799 -7 2 8 2 1 1556.58023360 1.55323809 536.14565398 -7 2 8 2 2 -1556.60165757 -0.32135961 -539.44494594 -7 2 8 2 3 -3061.47513063 -9466.54698963 -3062.00001798 -7 2 8 2 4 3057.98302291 9464.98303955 3056.51548071 -7 2 8 2 5 537.63462016 1.49967816 1557.11583294 -7 2 8 2 6 -538.33089930 -0.36420755 -1557.75855215 -7 2 8 2 7 -72011.71725146 -74105.63216959 -72003.80109318 -7 2 8 2 8 72015.85207839 74104.74307468 72013.35618545 -7 2 8 3 1 3076.88967971 -0.26779967 -538.13808354 -7 2 8 3 2 -3075.96844884 535.57791868 0.61058325 -7 2 8 3 3 3077.86447051 -1.24259047 1557.56573639 -7 2 8 3 4 -90.99832832 -3059.79334869 890.91594657 -7 2 8 3 5 100.46772470 -885.98843262 3064.54947085 -7 2 8 3 6 -3077.27531124 -1558.93687070 0.29993563 -7 2 8 3 7 -80809.00072649 -67039.17010631 -71996.87043768 -7 2 8 3 8 80797.98880400 72009.68197396 67020.93830468 -7 3 8 1 1 3061.33587480 90.63412076 -889.89830782 -7 3 8 1 2 -2.07812545 -3073.96530730 -1559.90094952 -7 3 8 1 3 -538.43801917 3076.65401600 0.08569589 -7 3 8 1 4 -1.16760657 -3075.53996937 535.94212623 -7 3 8 1 5 1554.07362867 3075.77563308 -1.56395008 -7 3 8 1 6 888.71998927 -90.28062520 -3062.77128104 -7 3 8 1 7 -71999.24849877 -80808.37943125 -67021.17396840 -7 3 8 1 8 67036.70634933 80805.06942731 71999.41989056 -7 3 8 2 1 3076.69686395 -538.44873116 0.01071199 -7 3 8 2 2 -3076.39692831 -0.52488736 536.62769339 -7 3 8 2 3 90.66625672 3061.27160288 -889.99471570 -7 3 8 2 4 -3074.17954704 -2.18524532 -1559.77240568 -7 3 8 2 5 3075.79705705 1554.11647662 -1.56395008 -7 3 8 2 6 -90.54842487 888.88066907 -3062.83555296 -7 3 8 2 7 -80805.93709825 -71999.17351486 -67021.20610436 -7 3 8 2 8 80804.11606048 67036.09576608 71998.86286724 -7 3 8 3 1 1559.49389402 535.68503855 2.06741346 -7 3 8 3 2 -1557.84424805 -537.94526778 2.73155665 -7 3 8 3 3 536.47772558 1558.70120699 2.50660492 -7 3 8 3 4 -536.31704577 -1559.49389402 3.87773924 -7 3 8 3 5 -3070.15183998 -3070.37679170 -9458.21306386 -7 3 8 3 6 3063.03908071 3062.51419335 9469.33210622 -7 3 8 3 7 -71995.11367184 -71990.98955690 -74109.30638108 -7 3 8 3 8 72000.34112143 72001.92649548 74087.11114432 -8 1 1 1 1 -74115.87282902 72001.84079958 72005.95420254 -8 1 1 1 2 9472.97418175 -3064.58160682 -3065.79206133 -8 1 1 1 3 0.61058325 -538.02025168 -1559.70813376 -8 1 1 1 4 -0.34278358 1558.20845560 535.83500637 -8 1 1 1 5 0.95336683 -1557.71570420 -539.81986547 -8 1 1 1 6 0.17139179 536.11351802 1557.82282407 -8 1 1 1 7 -9466.39702182 3061.81791421 3061.18590698 -8 1 1 1 8 74107.92453477 -71997.60956478 -71995.41360747 -8 1 1 2 1 72004.19743669 -67024.52682028 -80796.04993438 -8 1 1 2 2 -1.73534187 -1561.91480305 -3081.73149777 -8 1 1 2 3 537.77387599 -0.36420755 3077.46812700 -8 1 1 2 4 -889.37342047 -3066.02772504 -95.12244326 -8 1 1 2 5 -1553.40948549 -0.25708768 3070.09828004 -8 1 1 2 6 -0.66414318 536.75623723 -3077.03964753 -8 1 1 2 7 -3061.31445083 -889.88759583 90.81622454 -8 1 1 2 8 -67035.52803078 72006.32912208 80811.48590744 -8 1 1 3 1 72007.81808825 -80795.24653537 -67033.79268891 -8 1 1 3 2 -2.84938850 -3080.14612371 -1557.04084903 -8 1 1 3 3 -1558.03706381 3077.63951879 -0.36420755 -8 1 1 3 4 -1.43540624 -3078.11084621 538.19164347 -8 1 1 3 5 536.18850193 3076.65401600 -1.92815763 -8 1 1 3 6 -891.54795380 -92.59441436 -3061.18590698 -8 1 1 3 7 -3061.95717004 91.85528727 -890.47675511 -8 1 1 3 8 -67028.22245575 80799.92767362 72006.51122585 -8 2 1 1 1 67015.53946331 -72016.08774210 -80797.22825294 -8 2 1 1 2 3066.00630107 889.36270848 -95.10101928 -8 2 1 1 3 0.56773530 -538.53442705 3077.36100713 -8 2 1 1 4 1561.95765100 1.71391790 -3081.75292174 -8 2 1 1 5 891.74076956 3053.51612440 86.08152635 -8 2 1 1 6 -536.68125333 0.59987126 -3076.99679958 -8 2 1 1 7 -0.47132742 1557.60858433 3076.34336838 -8 2 1 1 8 -71998.56293161 67051.78882682 80811.25024373 -8 2 1 2 1 -72012.35997067 74112.81991276 72011.38517987 -8 2 1 2 2 -1558.18703163 0.32135961 535.82429438 -8 2 1 2 3 537.31326055 0.57844729 -1558.31557547 -8 2 1 2 4 3064.61374278 -9472.95275777 -3065.77063736 -8 2 1 2 5 -3057.07250403 9458.64154334 3054.80156282 -8 2 1 2 6 -536.15636597 -0.12854384 1557.80140010 -8 2 1 2 7 1557.84424805 0.82482299 -537.75245201 -8 2 1 2 8 72004.04746888 -74100.13692033 -71998.05946823 -8 2 1 3 1 -80797.45320466 72014.82372765 67032.58223439 -8 2 1 3 2 -3078.13227018 -1.45683021 -538.22377943 -8 2 1 3 3 3077.35029514 -1559.83667760 0.17139179 -8 2 1 3 4 -3080.15683570 -2.84938850 1557.11583294 -8 2 1 3 5 89.76644983 -3058.55075822 892.24423294 -8 2 1 3 6 -92.59441436 -891.51581784 3061.20733096 -8 2 1 3 7 3077.14676739 536.03853412 0.64271921 -8 2 1 3 8 80804.09463651 -67036.59922946 -72005.72925081 -8 3 1 1 1 67029.59359006 -80803.52690121 -72004.05818086 -8 3 1 1 2 3063.39257627 -92.84079006 888.77354920 -8 3 1 1 3 888.89138106 90.30204917 3062.64273719 -8 3 1 1 4 -539.39138600 -3078.51790171 0.25708768 -8 3 1 1 5 -2.19595730 3073.89032339 -536.13494200 -8 3 1 1 6 1557.82282407 -3077.12534342 0.44990345 -8 3 1 1 7 -0.53559934 3076.69686395 1559.55816594 -8 3 1 1 8 -71997.62027676 80811.11098790 67028.44740747 -8 3 1 2 1 -80800.98816032 67031.39320385 72003.26549384 -8 3 1 2 2 -3079.37486066 -540.05552919 -0.84624696 -8 3 1 2 3 90.69839269 888.90209304 -3062.92124885 -8 3 1 2 4 -92.99075787 3063.47827217 -888.88066907 -8 3 1 2 5 3071.98358973 -2.93508440 -1560.71506052 -8 3 1 2 6 -3077.31815918 1557.71570420 -0.32135961 -8 3 1 2 7 3077.96087839 0.64271921 536.33846975 -8 3 1 2 8 80810.05050120 -71999.13066691 -67026.02649844 -8 3 1 3 1 -72000.85529679 72000.30898546 74100.67251967 -8 3 1 3 2 -1559.30107826 536.35989372 2.35663711 -8 3 1 3 3 -3063.00694475 3062.57846527 9469.46065006 -8 3 1 3 4 -536.34918173 1559.30107826 2.33521313 -8 3 1 3 5 536.88478108 -1558.65835905 3.66349950 -8 3 1 3 6 3061.34658679 -3061.33587480 -9465.43294300 -8 3 1 3 7 1557.71570420 -537.85957188 2.19595730 -8 3 1 3 8 72003.68326132 -72000.76960090 -74115.27295775 -8 1 2 1 1 9471.68874332 -0.47132742 -2.07812545 -8 1 2 1 2 3.08505221 0.09640788 6.97350344 -8 1 2 1 3 -9471.73159127 0.38563153 -1.94958161 -8 1 2 1 4 -0.10711987 0.81411100 -0.23566371 -8 1 2 1 5 -9463.46193742 -1.19974253 5.78447290 -8 1 2 1 6 0.09640788 0.79268703 0.17139179 -8 1 2 1 7 9463.48336139 -0.40705550 -1.92815763 -8 1 2 1 8 -3.14932413 0.06427192 -6.81282364 -8 1 2 2 1 -3065.94202915 -1561.07926808 -3079.54625245 -8 1 2 2 2 0.08569589 -6.93065549 11785.04942412 -8 1 2 2 3 3066.04914901 1561.10069205 -3079.43913258 -8 1 2 2 4 0.05355993 0.21423974 2915.20295015 -8 1 2 2 5 -3055.74421766 1560.37227694 -3077.10391945 -8 1 2 2 6 0.19281576 -0.79268703 574.37673506 -8 1 2 2 7 3059.08635756 -1555.20909928 -3074.10456313 -8 1 2 2 8 -3.74919540 2.42090903 -2964.73517736 -8 1 2 3 1 -3069.41271289 -3080.59602716 -1556.45168975 -8 1 2 3 2 8.52674154 11786.34557453 2.33521313 -8 1 2 3 3 -3069.39128891 -3080.68172306 1556.58023360 -8 1 2 3 4 -0.18210378 573.04844869 1.09262266 -8 1 2 3 5 3062.64273719 -3077.98230237 1554.78061981 -8 1 2 3 6 1.40327028 2915.95278923 0.81411100 -8 1 2 3 7 3057.86519106 -3072.88339663 -1559.85810157 -8 1 2 3 8 8.37677372 -2963.10695536 0.85695895 -8 2 2 1 1 3063.22118448 -1558.52981520 -3077.96087839 -8 2 2 1 2 -2.91366042 -3.08505221 -2956.56193139 -8 2 2 1 3 -3063.26403243 1558.46554328 -3077.96087839 -8 2 2 1 4 0.43919146 0.85695895 573.51977611 -8 2 2 1 5 3060.88597135 1552.57395051 -3072.51918907 -8 2 2 1 6 0.21423974 -0.36420755 2914.21744736 -8 2 2 1 7 -3059.55768498 -1557.71570420 -3075.56139334 -8 2 2 1 8 0.89980690 7.61622265 11772.99843891 -8 2 2 2 1 886.30979223 0.12854384 -1.11404663 -8 2 2 2 2 -2.39948506 -0.18210378 8.79454121 -8 2 2 2 3 -886.50260799 -0.19281576 -0.98550279 -8 2 2 2 4 0.01071199 -0.14996782 -0.36420755 -8 2 2 2 5 -891.28015412 0.49275140 3.34213990 -8 2 2 2 6 0.03213596 -0.21423974 0.32135961 -8 2 2 2 7 891.25873015 0.19281576 -1.07119869 -8 2 2 2 8 2.31378916 -0.20352775 -8.88023710 -8 2 2 3 1 -94.45830007 535.51364676 -538.23449142 -8 2 2 3 2 -2956.65833927 4.53117044 3.13861215 -8 2 2 3 3 -92.20878283 535.40652689 538.17021950 -8 2 2 3 4 2915.34220598 0.08569589 1.41398226 -8 2 2 3 5 -98.03610368 -531.78587534 -539.54135382 -8 2 2 3 6 3374.43653853 0.85695895 0.34278358 -8 2 2 3 7 -88.48101141 -538.72724282 536.11351802 -8 2 2 3 8 -2959.82908738 -5.74162495 -1.52110213 -8 3 2 1 1 3061.52869056 -3078.06799826 -1558.95829468 -8 3 2 1 2 -3.85631527 -2959.50772777 -0.19281576 -8 3 2 1 3 3061.65723440 -3078.04657429 1559.06541455 -8 3 2 1 4 -0.51417537 2913.70327199 -0.83553497 -8 3 2 1 5 -3056.62260058 -3070.33394376 1562.40755445 -8 3 2 1 6 1.06048670 574.80521454 -1.28543842 -8 3 2 1 7 -3059.12920551 -3075.51854539 -1557.24437678 -8 3 2 1 8 -3.98485911 11773.03057487 -2.94579638 -8 3 2 2 1 -90.73052865 -539.07002640 536.45630160 -8 3 2 2 2 -2962.01433270 7.06991132 -0.17139179 -8 3 2 2 3 -90.75195262 -539.04860242 -536.62769339 -8 3 2 2 4 3371.58715003 -0.87838292 0.62129524 -8 3 2 2 5 -84.79608793 542.19792656 534.24963231 -8 3 2 2 6 2914.01391961 0.04284795 1.22116650 -8 3 2 2 7 -92.20878283 535.19228715 -537.82743592 -8 3 2 2 8 -2965.24935273 -5.73091297 1.93886962 -8 3 2 3 1 885.32428943 0.17139179 2.37806108 -8 3 2 3 2 -0.70699113 0.55702332 -3.27786798 -8 3 2 3 3 -885.36713738 -0.17139179 2.42090903 -8 3 2 3 4 0.70699113 -0.85695895 -1.86388571 -8 3 2 3 5 -892.32992884 0.47132742 -7.34842298 -8 3 2 3 6 -0.66414318 -0.87838292 1.90673366 -8 3 2 3 7 892.30850486 0.12854384 2.44233300 -8 3 2 3 8 0.79268703 0.46061543 3.22430804 -8 1 3 1 1 0.55702332 537.13115677 -1558.27272752 -8 1 3 1 2 -9472.95275777 3064.60303079 -3065.70636543 -8 1 3 1 3 74113.75185562 -72013.62398512 72012.23142683 -8 1 3 1 4 0.29993563 -1558.20845560 535.81358239 -8 1 3 1 5 9458.70581526 -3057.30816774 3054.71586692 -8 1 3 1 6 -0.20352775 -536.13494200 1557.86567202 -8 1 3 1 7 0.19281576 1556.93372916 -538.43801917 -8 1 3 1 8 -74100.38329603 72006.41481797 -71998.22014803 -8 1 3 2 1 -538.53442705 0.54631133 3077.36100713 -8 1 3 2 2 1.69249392 1561.93622702 -3081.71007379 -8 1 3 2 3 -72015.61641468 67015.13240781 -80796.83190942 -8 1 3 2 4 889.36270848 3066.02772504 -95.12244326 -8 1 3 2 5 3053.54826036 891.73005757 86.12437430 -8 1 3 2 6 0.58915928 -536.64911737 -3076.99679958 -8 1 3 2 7 1557.56573639 -0.43919146 3076.37550434 -8 1 3 2 8 67051.25322748 -71998.26299598 80810.76820432 -8 1 3 3 1 -1559.83667760 3077.26459925 0.17139179 -8 1 3 3 2 -2.89223645 -3080.19968365 1557.07298499 -8 1 3 3 3 72014.64162387 -80797.36750877 67032.40013062 -8 1 3 3 4 -1.43540624 -3078.11084621 -538.17021950 -8 1 3 3 5 -3058.51862226 89.87356970 892.17996102 -8 1 3 3 6 -891.52652982 -92.57299038 3061.12163506 -8 1 3 3 7 536.00639816 3077.10391945 0.62129524 -8 1 3 3 8 -67036.44926165 80803.96609267 -72005.49358710 -8 2 3 1 1 -0.34278358 537.85957188 3077.48955097 -8 2 3 1 2 -3065.96345312 -889.34128450 -95.09030729 -8 2 3 1 3 -67024.46254836 72004.09031682 -80795.88925458 -8 2 3 1 4 -1561.93622702 -1.77818982 -3081.75292174 -8 2 3 1 5 -0.21423974 -1553.40948549 3070.05543210 -8 2 3 1 6 536.67054134 -0.51417537 -3076.97537560 -8 2 3 1 7 -889.95186776 -3061.34658679 90.85907249 -8 2 3 1 8 72006.31841009 -67035.52803078 80811.49661943 -8 2 3 2 1 -538.06309963 0.41776749 -1559.62243786 -8 2 3 2 2 1558.16560765 -0.31064762 535.81358239 -8 2 3 2 3 72002.70847052 -74116.87975578 72006.74688956 -8 2 3 2 4 -3064.59231880 9472.95275777 -3065.77063736 -8 2 3 2 5 -1557.61929632 0.77126305 -539.90556137 -8 2 3 2 6 536.15636597 0.14996782 1557.77997612 -8 2 3 2 7 3061.20733096 -9467.33967666 3060.54318777 -8 2 3 2 8 -71997.89878842 74110.20618797 -71995.68140714 -8 2 3 3 1 3077.16819137 -1558.17631964 -0.47132742 -8 2 3 3 2 -3078.00372634 -1.34971034 538.38445924 -8 2 3 3 3 -80797.09970910 72009.10352667 -67037.19910073 -8 2 3 3 4 -3080.25324358 -2.95650837 -1556.88016923 -8 2 3 3 5 3074.86511419 534.99947139 -0.66414318 -8 2 3 3 6 -93.24784556 -890.85167465 -3060.28610009 -8 2 3 3 7 91.56606362 -3061.77506626 -890.29465133 -8 2 3 3 8 80804.97301943 -67028.86517496 72007.52886460 -8 3 3 1 1 888.43076562 91.44823176 -3061.82862619 -8 3 3 1 2 3063.32830435 -93.13001370 -889.01992490 -8 3 3 1 3 67032.64650632 -80802.16647888 72006.93970533 -8 3 3 1 4 -539.95912130 -3079.31058874 -1.02835074 -8 3 3 1 5 -1.86388571 3072.69058086 -1561.14354000 -8 3 3 1 6 1558.31557547 -3077.85375853 -1.19974253 -8 3 3 1 7 0.70699113 3077.73592667 536.39202968 -8 3 3 1 8 -72001.77652766 80810.60752452 -67028.96158284 -8 3 3 2 1 91.22328004 888.34506973 3061.85005017 -8 3 3 2 2 -3079.50340450 -539.91627336 0.93194286 -8 3 3 2 3 -80801.08456820 67027.49404064 -72004.24028464 -8 3 3 2 4 -92.38017462 3064.37807907 889.48054033 -8 3 3 2 5 3074.74728234 -1.67106995 -536.88478108 -8 3 3 2 6 -3077.22175130 1557.88709599 0.27851166 -8 3 3 2 7 3076.97537560 -0.48203941 1559.30107826 -8 3 3 2 8 80807.32965654 -71996.03490271 67029.37935033 -8 3 3 3 1 3062.49276938 -3063.22118448 9469.54634595 -8 3 3 3 2 1559.30107826 -536.37060571 2.34592512 -8 3 3 3 3 72001.01597660 -72001.60513587 74101.21883100 -8 3 3 3 4 536.31704577 -1559.32250223 2.35663711 -8 3 3 3 5 -1558.56195116 536.71338929 3.49210771 -8 3 3 3 6 -3061.32516281 3061.33587480 -9465.49721492 -8 3 3 3 7 -538.47015513 1556.80518532 1.57466207 -8 3 3 3 8 -72000.74817693 72005.72925081 -74115.16583788 -8 1 4 1 1 -0.21423974 -886.43833607 -1.15689458 -8 1 4 1 2 0.06427192 0.35349557 -0.42847947 -8 1 4 1 3 0.17139179 886.35264017 -1.11404663 -8 1 4 1 4 -0.78197504 -1.49967816 8.18395796 -8 1 4 1 5 0.47132742 -891.25873015 3.42783579 -8 1 4 1 6 -0.21423974 0.10711987 0.47132742 -8 1 4 1 7 0.10711987 889.07348483 -1.15689458 -8 1 4 1 8 0.42847947 3.35285189 -8.22680590 -8 1 4 2 1 1558.44411931 -3063.32830435 -3077.96087839 -8 1 4 2 2 0.68556716 0.12854384 573.69116790 -8 1 4 2 3 -1558.48696726 3063.37115230 -3077.98230237 -8 1 4 2 4 -1.78890180 -4.64900229 -2955.24435701 -8 1 4 2 5 1552.63822244 3060.92881930 -3072.79770073 -8 1 4 2 6 -0.17139179 -0.17139179 2914.15317544 -8 1 4 2 7 -1557.71570420 -3055.25146627 -3075.56139334 -8 1 4 2 8 6.38434416 -0.83553497 11771.72371247 -8 1 4 3 1 535.55649471 -94.39402815 538.29876334 -8 1 4 3 2 -0.04284795 2914.96728644 1.04977471 -8 1 4 3 3 535.49222279 -92.27305475 -538.42730718 -8 1 4 3 4 5.79518489 -2958.47937704 0.66414318 -8 1 4 3 5 -531.87157123 -93.75130894 -539.45565792 -8 1 4 3 6 0.86767094 3374.01877104 0.72841511 -8 1 4 3 7 -538.85578666 -88.45958743 536.02782213 -8 1 4 3 8 -6.98421543 -2961.69297309 0.98550279 -8 2 4 1 1 1561.10069205 3065.96345312 -3079.41770861 -8 2 4 1 2 0.10711987 0.12854384 2915.32078200 -8 2 4 1 3 -1561.18638794 -3068.14869844 -3079.35343669 -8 2 4 1 4 -5.72020098 0.10711987 11785.07084809 -8 2 4 1 5 1560.35085297 -3053.62324426 -3076.99679958 -8 2 4 1 6 -0.61058325 0.25708768 574.61239877 -8 2 4 1 7 -1555.25194723 3059.04350961 -3074.12598710 -8 2 4 1 8 1.09262266 -3.71705944 -2964.77802531 -8 2 4 2 1 0.47132742 -9471.71016730 -1.94958161 -8 2 4 2 2 0.77126305 -0.53559934 -0.18210378 -8 2 4 2 3 -0.38563153 9473.85256467 -1.97100558 -8 2 4 2 4 -0.04284795 1.26401445 6.94136748 -8 2 4 2 5 -1.24259047 -9463.44051345 5.57023316 -8 2 4 2 6 0.70699113 -0.25708768 0.19281576 -8 2 4 2 7 -0.25708768 9465.62575876 -1.92815763 -8 2 4 2 8 -0.04284795 -4.90608998 -6.87709556 -8 2 4 3 1 -3080.63887511 -3065.02079828 1556.40884181 -8 2 4 3 2 573.30553638 -0.71770312 1.17831855 -8 2 4 3 3 -3080.70314703 -3067.27031552 -1556.49453770 -8 2 4 3 4 11784.49240080 5.87016880 2.97793235 -8 2 4 3 5 -3078.08942224 3062.59988925 1554.52353212 -8 2 4 3 6 2915.73854949 0.92123087 0.72841511 -8 2 4 3 7 -3073.03336444 3057.90803901 -1559.90094952 -8 2 4 3 8 -2961.09310183 5.68806502 0.24637570 -8 3 4 1 1 -539.07002640 -90.68768070 -536.49914955 -8 3 4 1 2 -0.81411100 3371.80138976 0.61058325 -8 3 4 1 3 -538.96290653 -90.77337659 536.54199750 -8 3 4 1 4 6.39505615 -2961.07167785 0.47132742 -8 3 4 1 5 542.26219848 -86.98133325 534.27105629 -8 3 4 1 6 0.03213596 2914.26029531 1.17831855 -8 3 4 1 7 535.19228715 -92.14451091 -537.80601195 -8 3 4 1 8 -5.07748177 -2964.37096980 1.25330246 -8 3 4 2 1 -3078.02515032 3061.59296248 1559.12968647 -8 3 4 2 2 2913.78896788 -0.72841511 -1.11404663 -8 3 4 2 3 -3078.15369416 3063.73535985 -1559.06541455 -8 3 4 2 4 -2960.10759904 -4.77754614 -2.14239737 -8 3 4 2 5 -3070.33394376 -3054.41593129 1562.49325034 -8 3 4 2 6 574.69809467 0.87838292 -0.92123087 -8 3 4 2 7 -3075.53996937 -3061.37872275 -1557.39434460 -8 3 4 2 8 11773.69471805 -5.00249786 -1.03906272 -8 3 4 3 1 -0.12854384 -885.32428943 2.46375698 -8 3 4 3 2 -0.96407882 0.49275140 -2.00314154 -8 3 4 3 3 0.12854384 885.28144149 2.44233300 -8 3 4 3 4 1.17831855 -1.60679803 -3.92058719 -8 3 4 3 5 0.42847947 -890.12325954 -7.41269490 -8 3 4 3 6 -0.76055107 -0.89980690 1.99242955 -8 3 4 3 7 0.08569589 892.20138499 2.48518095 -8 3 4 3 8 -0.08569589 -0.18210378 3.88845123 -8 1 5 1 1 0.89980690 -1553.73084509 534.31390423 -8 1 5 1 2 -9463.14057781 -3055.47641799 3062.18212176 -8 1 5 1 3 9459.57348619 3053.17334082 -3057.88661503 -8 1 5 1 4 0.58915928 1552.59537449 -531.52878765 -8 1 5 1 5 73992.05297298 71805.66147236 -71878.46013501 -8 1 5 1 6 0.73912709 533.97112065 -1553.53802933 -8 1 5 1 7 0.89980690 -533.97112065 1555.41262703 -8 1 5 1 8 -73991.61378152 -71802.12651670 71869.40850612 -8 1 5 2 1 -1558.10133573 0.33207159 3074.74728234 -8 1 5 2 2 -1.60679803 1560.40441290 -3078.28223800 -8 1 5 2 3 -3056.03344131 891.13018631 90.62340878 -8 1 5 2 4 -889.84474789 3059.66480485 -93.70846099 -8 1 5 2 5 71807.34325429 66823.92344248 -80589.70493163 -8 1 5 2 6 0.24637570 -533.22128157 -3079.95330795 -8 1 5 2 7 537.69889208 2.87081248 3077.29673521 -8 1 5 2 8 -66839.71291110 -71805.01875315 80599.04578417 -8 1 5 3 1 -539.34853805 3069.46627282 -0.25708768 -8 1 5 3 2 5.72020098 -3077.06107150 1555.13411537 -8 1 5 3 3 3053.65538023 86.57427775 891.32300207 -8 1 5 3 4 3.88845123 -3073.18333226 -539.41280997 -8 1 5 3 5 -71878.03165554 -80588.86939666 66908.24820299 -8 1 5 3 6 884.22095479 -109.09087411 3073.52611584 -8 1 5 3 7 1558.22987957 3080.91738677 -2.52802890 -8 1 5 3 8 66911.63319084 80611.27887315 -71885.91567786 -8 2 5 1 1 891.73005757 -3056.87968827 90.04496149 -8 2 5 1 2 3059.68622882 -889.63050815 -93.72988496 -8 2 5 1 3 0.14996782 -1558.27272752 3074.57589055 -8 2 5 1 4 1559.78311767 -0.74983908 -3077.72521468 -8 2 5 1 5 66823.27001128 71804.16179420 -80589.04078845 -8 2 5 1 6 -533.32840144 0.40705550 -3079.99615590 -8 2 5 1 7 2.95650837 537.54892426 3077.41456707 -8 2 5 1 8 -71804.31176201 -66836.57429896 80598.45662489 -8 2 5 2 1 3053.08764492 9459.57348619 -3057.89732702 -8 2 5 2 2 1552.59537449 0.64271921 -531.58234758 -8 2 5 2 3 -1553.75226907 0.89980690 534.27105629 -8 2 5 2 4 -3055.48712998 -9463.14057781 3062.23568169 -8 2 5 2 5 71805.51150454 73991.95656510 -71878.31016719 -8 2 5 2 6 533.93898469 0.74983908 -1553.45233344 -8 2 5 2 7 -533.97112065 0.86767094 1555.40191504 -8 2 5 2 8 -71801.89085298 -73991.48523768 71869.25853830 -8 2 5 3 1 86.53142980 3053.69822817 891.32300207 -8 2 5 3 2 -3073.26902815 3.67421149 -539.56277779 -8 2 5 3 3 3069.42342487 -539.28426613 -0.32135961 -8 2 5 3 4 -3076.40764030 4.82039408 1554.50210815 -8 2 5 3 5 -80588.73014083 -71875.71786638 66908.07681120 -8 2 5 3 6 -109.02660219 884.03885101 3073.52611584 -8 2 5 3 7 3080.91738677 1558.20845560 -2.51731691 -8 2 5 3 8 80610.55045805 66910.65840003 -71885.03729494 -8 3 5 1 1 -2.52802890 3071.37300648 537.61319618 -8 3 5 1 2 -3054.18026758 -87.31340484 -890.29465133 -8 3 5 1 3 -4.50974647 3074.68301042 -1558.12275970 -8 3 5 1 4 542.73352590 -3070.69815131 -0.12854384 -8 3 5 1 5 -66915.01817868 -80608.27951684 71898.53439837 -8 3 5 1 6 -1555.05913146 -3081.62437790 -1.45683021 -8 3 5 1 7 -885.45283328 101.12115589 -3068.78070566 -8 3 5 1 8 71873.93967656 80600.67400617 -66917.49264764 -8 3 5 2 1 3073.46184392 -2.67799671 -1556.92301718 -8 3 5 2 2 -3070.71957528 542.75494987 -0.11783186 -8 3 5 2 3 3071.61938218 -2.16382134 537.89170784 -8 3 5 2 4 -87.32411683 -3054.11599566 -890.35892326 -8 3 5 2 5 -80607.59394968 -66913.73274026 71897.91310314 -8 3 5 2 6 -3081.61366591 -1555.05913146 -1.41398226 -8 3 5 2 7 100.92834013 -885.08862572 -3068.98423341 -8 3 5 2 8 80601.08106167 71870.16905719 -66918.14607884 -8 3 5 3 1 -536.79908518 -1559.33321422 3.94201116 -8 3 5 3 2 1563.07169763 534.27105629 -6.56644794 -8 3 5 3 3 -1560.16874919 -535.94212623 3.38498785 -8 3 5 3 4 533.46765727 1563.95008055 -6.06298456 -8 3 5 3 5 71892.70707753 71890.86461579 -74116.34415644 -8 3 5 3 6 -3071.10520681 -3070.84811912 9448.22949211 -8 3 5 3 7 3064.97795033 3065.24575000 -9458.18092790 -8 3 5 3 8 -71886.12991760 -71888.13305914 74131.61944969 -8 1 6 1 1 -0.04284795 -0.00000000 -890.03756365 -8 1 6 1 2 0.19281576 0.17139179 0.84624696 -8 1 6 1 3 -0.02142397 -0.00000000 -889.95186776 -8 1 6 1 4 -0.17139179 -0.08569589 0.89980690 -8 1 6 1 5 0.08569589 0.02142397 883.43897975 -8 1 6 1 6 -2.02456552 -1.79961379 3.55637964 -8 1 6 1 7 0.04284795 0.02142397 887.55238270 -8 1 6 1 8 2.01385353 1.77818982 3.70634745 -8 1 6 2 1 536.37060571 536.41345366 -91.33039991 -8 1 6 2 2 0.79268703 -0.58915928 2915.63142962 -8 1 6 2 3 -536.43487763 -536.49914955 -93.53706920 -8 1 6 2 4 0.06427192 -0.21423974 3374.36155462 -8 1 6 2 5 533.32840144 -533.30697747 -112.60440580 -8 1 6 2 6 -0.91051888 -3.53495566 -2951.64512942 -8 1 6 2 7 -537.97740374 537.95597976 -89.35939433 -8 1 6 2 8 4.84181806 -0.34278358 -2951.55943353 -8 1 6 3 1 1557.65143228 -3076.63259203 -3060.73600354 -8 1 6 3 2 0.29993563 574.86948646 1.08191067 -8 1 6 3 3 1557.65143228 -3076.65401600 3058.65787809 -8 1 6 3 4 0.48203941 2914.26029531 0.89980690 -8 1 6 3 5 -1554.35214033 -3080.42463537 3070.95523899 -8 1 6 3 6 3.80275533 -2950.76674650 -1.62822200 -8 1 6 3 7 -1558.67978302 -3077.06107150 -3062.21425772 -8 1 6 3 8 -6.81282364 11772.46283957 -7.05919934 -8 2 6 1 1 -536.37060571 -536.37060571 -91.33039991 -8 2 6 1 2 -0.08569589 0.14996782 3374.37226661 -8 2 6 1 3 536.37060571 536.39202968 -93.36567741 -8 2 6 1 4 -0.79268703 0.59987126 2915.67427757 -8 2 6 1 5 -533.24270555 533.28555349 -112.56155785 -8 2 6 1 6 -4.83110607 0.34278358 -2951.62370545 -8 2 6 1 7 537.97740374 -537.93455579 -89.35939433 -8 2 6 1 8 0.92123087 3.57780361 -2951.58085750 -8 2 6 2 1 0.04284795 0.08569589 -890.05898762 -8 2 6 2 2 0.06427192 -0.01071199 1.28543842 -8 2 6 2 3 0.06427192 0.02142397 -894.49375018 -8 2 6 2 4 -0.02142397 -0.00000000 1.24259047 -8 2 6 2 5 -0.02142397 -0.02142397 883.31043591 -8 2 6 2 6 -3.10647619 -0.79268703 5.52738522 -8 2 6 2 7 -0.14996782 0.04284795 887.57380667 -8 2 6 2 8 3.08505221 0.72841511 5.51667323 -8 2 6 3 1 -3076.71828792 1557.60858433 3060.73600354 -8 2 6 3 2 2914.19602338 0.54631133 0.54631133 -8 2 6 3 3 -3076.63259203 1557.67285626 -3058.65787809 -8 2 6 3 4 574.83735050 0.27851166 0.70699113 -8 2 6 3 5 -3080.46748332 -1554.39498828 3071.25517462 -8 2 6 3 6 -2950.77745849 3.87773924 -3.47068374 -8 2 6 3 7 -3076.95395163 -1558.63693507 -3062.14998580 -8 2 6 3 8 11772.51639950 -6.94136748 -8.90166107 -8 3 6 1 1 1557.65143228 -3076.71828792 3060.65030764 -8 3 6 1 2 0.55702332 2914.23887133 -0.85695895 -8 3 6 1 3 1557.54431241 -3076.76113587 -3058.65787809 -8 3 6 1 4 0.35349557 574.82663851 -1.11404663 -8 3 6 1 5 -1554.35214033 -3080.48890729 -3071.16947873 -8 3 6 1 6 -6.86638357 11772.53782347 7.11275927 -8 3 6 1 7 -1558.74405494 -3076.95395163 3062.21425772 -8 3 6 1 8 3.77061937 -2950.79888246 1.56395008 -8 3 6 2 1 -3076.73971189 1557.63000831 -3060.82169943 -8 3 6 2 2 574.82663851 0.50346338 -0.94265484 -8 3 6 2 3 -3076.71828792 1557.56573639 3058.65787809 -8 3 6 2 4 2914.24958332 0.47132742 -0.72841511 -8 3 6 2 5 -3080.44605934 -1554.43783623 -3071.12663078 -8 3 6 2 6 11773.15911871 -6.17010443 7.94829424 -8 3 6 2 7 -3077.08249547 -1558.65835905 3064.46377496 -8 3 6 2 8 -2951.45231366 3.20288407 2.52802890 -8 3 6 3 1 -0.00000000 0.04284795 -9469.88912953 -8 3 6 3 2 -1.32828637 1.16760657 3.02078029 -8 3 6 3 3 0.06427192 0.08569589 -9469.99624940 -8 3 6 3 4 1.24259047 -1.26401445 3.06362824 -8 3 6 3 5 -0.00000000 -0.00000000 9444.75880837 -8 3 6 3 6 9.36227651 9.38370048 8.56958948 -8 3 6 3 7 0.04284795 -0.04284795 9471.86013511 -8 3 6 3 8 -9.44797240 -9.38370048 8.52674154 -8 1 7 1 1 -9466.50414169 -3061.52869056 -3062.05357792 -8 1 7 1 2 9464.89734366 3057.79020715 3056.56904065 -8 1 7 1 3 1.48896617 1556.53738565 536.11351802 -8 1 7 1 4 0.27851166 -1557.43719255 -538.85578666 -8 1 7 1 5 1.49967816 537.65604413 1557.05156102 -8 1 7 1 6 -0.21423974 -538.55585103 -1557.82282407 -8 1 7 1 7 -74105.07514627 -72009.16779859 -72003.50115755 -8 1 7 1 8 74103.76828387 72014.65233586 72012.37068266 -8 1 7 2 1 3061.52869056 -889.86617186 91.33039991 -8 1 7 2 2 -0.96407882 -1554.76990782 -3072.66915689 -8 1 7 2 3 1557.90851997 -1.13547061 3076.78255984 -8 1 7 2 4 890.31607531 -3057.11535198 -88.71667512 -8 1 7 2 5 -533.64976105 2.63514877 3080.18897166 -8 1 7 2 6 0.26779967 538.38445924 -3077.53239892 -8 1 7 2 7 -72007.32533685 -67050.01063700 -80809.16140629 -8 1 7 2 8 67031.95022717 72012.04932306 80799.74556985 -8 1 7 3 1 3061.31445083 90.62340878 -889.91973179 -8 1 7 3 2 -2.05670148 -3073.98673127 -1559.90094952 -8 1 7 3 3 -538.45944314 3076.67543997 -0.06427192 -8 1 7 3 4 -1.16760657 -3075.49712142 535.85643034 -8 1 7 3 5 1554.15932457 3075.79705705 -1.60679803 -8 1 7 3 6 888.75212523 -90.34489712 -3062.77128104 -8 1 7 3 7 -71999.11995492 -80808.28302337 -67021.20610436 -8 1 7 3 8 67036.64207741 80805.02657937 71999.40917857 -8 2 7 1 1 -1.17831855 1557.91923195 3076.72899991 -8 2 7 1 2 -3056.21554508 889.73762802 -89.32725837 -8 2 7 1 3 -889.86617186 3061.48584261 91.35182388 -8 2 7 1 4 -1554.59851603 -0.87838292 -3072.73342881 -8 2 7 1 5 2.64586075 -533.58548913 3080.08185179 -8 2 7 1 6 538.55585103 0.17139179 -3077.38243110 -8 2 7 1 7 -67052.13161040 -72007.22892897 -80809.03286245 -8 2 7 1 8 72012.72417823 67032.37870664 80800.28116919 -8 2 7 2 1 1557.43719255 0.70699113 535.59934265 -8 2 7 2 2 -1556.55880962 -0.34278358 -539.48779388 -8 2 7 2 3 -3060.69315559 -9467.40394858 -3061.40014672 -8 2 7 2 4 3057.98302291 9464.96161558 3056.45120879 -8 2 7 2 5 537.92384380 1.28543842 1557.15868089 -8 2 7 2 6 -538.36303526 -0.34278358 -1557.77997612 -8 2 7 2 7 -72011.18165212 -74105.65359356 -72003.56542947 -8 2 7 2 8 72013.43116936 74106.77835218 72013.15265770 -8 2 7 3 1 3076.69686395 -538.40588321 -0.02142397 -8 2 7 3 2 -3076.46120024 -0.52488736 536.60626942 -8 2 7 3 3 90.66625672 3061.31445083 -889.90901981 -8 2 7 3 4 -3074.16883505 -2.18524532 -1559.68670978 -8 2 7 3 5 3075.79705705 1554.15932457 -1.54252611 -8 2 7 3 6 -90.54842487 888.79497318 -3062.87840091 -8 2 7 3 7 -80806.51554554 -71999.59128235 -67021.60244787 -8 2 7 3 8 80804.48026804 67036.44926165 71999.11995492 -8 3 7 1 1 -1.26401445 3077.82162257 1557.54431241 -8 3 7 1 2 -3059.64338088 -90.82693653 890.85167465 -8 3 7 1 3 -0.21423974 3076.86825574 -538.14879553 -8 3 7 1 4 534.91377550 -3075.11148989 -0.02142397 -8 3 7 1 5 -885.99914461 100.47843668 3064.57089483 -8 3 7 1 6 -1558.97971865 -3077.06107150 0.40705550 -8 3 7 1 7 -67039.08441041 -80810.96102008 -71996.66690993 -8 3 7 1 8 72010.17472536 80798.69579514 67021.52746396 -8 3 7 2 1 3076.82540779 -0.20352775 -538.14879553 -8 3 7 2 2 -3076.88967971 536.22063789 1.25330246 -8 3 7 2 3 3077.88589449 -1.22116650 1557.52288844 -8 3 7 2 4 -91.19114408 -3059.79334869 891.04449041 -8 3 7 2 5 100.47843668 -885.94558467 3064.48519893 -8 3 7 2 6 -3077.50026296 -1558.80832686 0.29993563 -8 3 7 2 7 -80806.79405720 -67039.27722618 -71996.83830172 -8 3 7 2 8 80797.19611698 72009.09281468 67020.41341733 -8 3 7 3 1 1559.60101389 535.57791868 2.20666929 -8 3 7 3 2 -1557.86567202 -537.98811572 2.71013267 -8 3 7 3 3 536.44558962 1558.76547892 2.76369261 -8 3 7 3 4 -536.30633379 -1559.49389402 3.83489129 -8 3 7 3 5 -3070.79455919 -3071.12663078 -9457.31325697 -8 3 7 3 6 3063.01765673 3062.55704130 9469.35353019 -8 3 7 3 7 -71994.68519237 -71990.52894147 -74108.67437385 -8 3 7 3 8 72000.57678514 72002.17287118 74085.15085072 -8 1 8 1 1 74108.80291769 -67033.86767282 -67025.90866658 -8 1 8 1 2 -3.74919540 -3.32071592 4.95964991 -8 1 8 1 3 -74100.09407238 67048.96086229 -67036.34214178 -8 1 8 1 4 -0.42847947 6.79139966 -9.49082035 -8 1 8 1 5 -73987.00762717 -66833.67135052 66912.89720528 -8 1 8 1 6 -0.13925583 4.88466601 -7.49839080 -8 1 8 1 7 74102.84705300 67030.41841305 67035.75298250 -8 1 8 1 8 -120.25276441 -220.12061784 125.99438937 -8 1 8 2 1 -71998.26299598 72006.72546559 80806.82619316 -8 1 8 2 2 2.37806108 0.43919146 -2960.32183877 -8 1 8 2 3 72005.60070697 -71997.25606921 80805.87282633 -8 1 8 2 4 3.72777142 -0.89980690 -2960.27899083 -8 1 8 2 5 -71805.23299288 -71800.56256662 80610.40049023 -8 1 8 2 6 2.89223645 1.84246174 11771.35950492 -8 1 8 2 7 72008.63219925 72013.14194571 80808.95787854 -8 1 8 2 8 -219.87424215 -223.70913344 -328883.09457524 -8 1 8 3 1 -71993.87108137 80814.38885588 72003.47973357 -8 1 8 3 2 -7.36984695 -2964.74588934 1.69249392 -8 1 8 3 3 -71999.11995492 80816.26345358 -72004.30455656 -8 1 8 3 4 -9.12661280 11771.27380902 1.07119869 -8 1 8 3 5 71865.80927854 80595.91788401 -71885.10156686 -8 1 8 3 6 4.52045845 -2952.73775208 -7.06991132 -8 1 8 3 7 72012.25285081 80801.49162371 72004.78659597 -8 1 8 3 8 127.02274010 -328881.83056079 -114.39330760 -8 2 8 1 1 -71998.07018021 72006.52193784 80806.55839349 -8 2 8 1 2 2.42090903 0.42847947 -2960.30041480 -8 2 8 1 3 72005.90064260 -71997.38461305 80806.12991401 -8 2 8 1 4 3.69563546 -0.92123087 -2960.30041480 -8 2 8 1 5 -71805.11516103 -71800.51971867 80610.42191421 -8 2 8 1 6 2.82796453 1.64964598 11771.55232068 -8 2 8 1 7 72008.50365541 72013.13123373 80808.89360662 -8 2 8 1 8 -220.30272162 -223.11997416 -328883.21240709 -8 2 8 2 1 67049.81782124 -74100.98316729 -67035.01385541 -8 2 8 2 2 5.20602561 0.99621478 -8.11968603 -8 2 8 2 3 -67033.01071387 74108.03165464 -67027.08698514 -8 2 8 2 4 -3.77061937 -4.13482693 5.03463382 -8 2 8 2 5 -66833.22144707 -73986.87908333 66912.57584568 -8 2 8 2 6 3.31000394 1.19974253 -7.77690246 -8 2 8 2 7 67035.07812733 74102.60067731 67035.88152634 -8 2 8 2 8 -223.36634986 -120.74551581 124.91247869 -8 2 8 3 1 80814.65665555 -71997.99519630 -72003.32976576 -8 2 8 3 2 11772.19503989 -9.80146797 1.74605386 -8 2 8 3 3 80814.47455177 -71994.53522455 72004.13316477 -8 2 8 3 4 -2964.61734550 -7.30557503 1.75676584 -8 2 8 3 5 80593.21846332 71865.81999052 -71885.20868673 -8 2 8 3 6 -2952.57707228 4.43476256 -7.13418324 -8 2 8 3 7 80799.57417806 72010.67818874 72003.22264589 -8 2 8 3 8 -328876.91375882 128.64025012 -115.12172271 -8 3 8 1 1 -71993.91392931 80810.03978921 72003.31905377 -8 3 8 1 2 -7.45554285 -2964.12459411 1.36042233 -8 3 8 1 3 -71999.54843440 80816.67050908 -72004.69018809 -8 3 8 1 4 -8.52674154 11773.97322971 -0.85695895 -8 3 8 1 5 71865.78785456 80595.98215593 -71885.25153468 -8 3 8 1 6 4.70256223 -2952.24500069 -6.83424761 -8 3 8 1 7 72012.25285081 80799.44563422 72004.86157988 -8 3 8 1 8 126.80850037 -328879.72029938 -112.21877427 -8 3 8 2 1 80814.24960005 -71997.29891716 -72002.78345443 -8 3 8 2 2 11773.09484679 -10.47632314 1.11404663 -8 3 8 2 3 80814.34600793 -71994.23528892 72004.04746888 -8 3 8 2 4 -2964.47808967 -7.15560722 1.56395008 -8 3 8 2 5 80594.00043836 71866.80549331 -71885.93710183 -8 3 8 2 6 -2952.52351235 4.39191461 -7.06991132 -8 3 8 2 7 80797.49605261 72010.98883636 72003.52258152 -8 3 8 2 8 -328876.37815948 126.85134831 -114.42544356 -8 3 8 3 1 67028.69378317 -67026.93701732 -74118.22946612 -8 3 8 3 2 -4.45618653 2.31378916 3.62065156 -8 3 8 3 3 -67026.84060944 67028.80090304 -74118.52940176 -8 3 8 3 4 1.44611823 -3.64207553 3.06362824 -8 3 8 3 5 -66906.88778066 -66906.98418854 74137.23253080 -8 3 8 3 6 1.30686240 1.67106995 3.85631527 -8 3 8 3 7 67020.44555329 67018.21746002 74090.72108389 -8 3 8 3 8 -113.37566885 -113.37566885 -1.74605386 diff --git a/examples/USER/phonon/third_order_command/silicon/silicon_input_file.lmp b/examples/USER/phonon/third_order_command/silicon/silicon_input_file.lmp deleted file mode 100755 index 5066049895..0000000000 --- a/examples/USER/phonon/third_order_command/silicon/silicon_input_file.lmp +++ /dev/null @@ -1,29 +0,0 @@ -LAMMPS description - - 8 atoms - 0 bonds - 0 angles - 0 dihedrals - 0 impropers - - 1 atom types - 0 bond types - 0 angle types - 0 dihedral types - 0 improper types - - - 0.0000000 5.4310000 xlo xhi - 0.0000000 5.4310000 ylo yhi - 0.0000000 5.4310000 zlo zhi - - Atoms - - 1 1 1 0.0000000 0.0000000 0.0000000 0.0000000 - 2 2 1 0.0000000 1.3577500 1.3577500 1.3572000 - 3 3 1 0.0000000 2.7155000 2.7155000 0.0000000 - 4 4 1 0.0000000 4.0732500 4.0732500 1.3572000 - 5 5 1 0.0000000 2.7155000 0.0000000 2.7144000 - 6 6 1 0.0000000 4.0732500 1.3577500 4.0732500 - 7 7 1 0.0000000 0.0000000 2.7155000 2.7155000 - 8 8 1 0.0000000 1.3577500 4.0732500 4.0732500 diff --git a/src/USER-PHONON/README b/src/USER-PHONON/README index b1ffcb9b09..697f4ca086 100644 --- a/src/USER-PHONON/README +++ b/src/USER-PHONON/README @@ -3,12 +3,11 @@ matrices from finite temperature MD simulations, which can then be used to compute phonon dispersion relations, directly from molecular dynamics simulations. -It also contains two commands to compute the dynamical matrix and -the corresponding third order matrix at pre-optimized positions -through finite differences. +It also contains a command to compute the dynamical matrix at +pre-optimized positions through finite differences. See the doc page for the fix phonon command or the dynamical_matrix -third_order commands for detailed usage instructions. +command for detailed usage instructions. Use of this package requires building LAMMPS with FFT suppport, as described in doc/Section_start.html. @@ -30,5 +29,5 @@ The person who created fix phonon is Ling-Ti Kong (konglt at sjtu.edu.cn) at Shanghai Jiao Tong University. Contact him directly if you have questions. -The person who created dynamical_matrix and third_order is -Charlie Sievers at UC Davis. +The person who created the dynamical_matrix command is Charlie Sievers +at UC Davis. Contact him directly if you have questions about his code. diff --git a/src/USER-PHONON/third_order.cpp b/src/USER-PHONON/third_order.cpp deleted file mode 100644 index f7d72687c6..0000000000 --- a/src/USER-PHONON/third_order.cpp +++ /dev/null @@ -1,560 +0,0 @@ -// -// Created by charlie sievers on 7/5/18. -// - - -#include -#include -#include "third_order.h" -#include "atom.h" -#include "complex" -#include "domain.h" -#include "comm.h" -#include "group.h" -#include "force.h" -#include "math_extra.h" -#include "memory.h" -#include "bond.h" -#include "angle.h" -#include "dihedral.h" -#include "improper.h" -#include "kspace.h" -#include "update.h" -#include "neighbor.h" -#include "pair.h" -#include "timer.h" -#include "finish.h" -#include - - -using namespace LAMMPS_NS; -enum{REGULAR,BALLISTICO}; - -/* ---------------------------------------------------------------------- */ - -ThirdOrder::ThirdOrder(LAMMPS *lmp) : Pointers(lmp), fp(NULL) -{ - external_force_clear = 1; -} - -/* ---------------------------------------------------------------------- */ - -ThirdOrder::~ThirdOrder() -{ - if (fp && me == 0) fclose(fp); - memory->destroy(groupmap); - fp = NULL; -} - -/* ---------------------------------------------------------------------- - setup without output or one-time post-init setup - flag = 0 = just force calculation - flag = 1 = reneighbor and force calculation -------------------------------------------------------------------------- */ - -void ThirdOrder::setup() -{ - // setup domain, communication and neighboring - // acquire ghosts - // build neighbor lists - if (triclinic) domain->x2lamda(atom->nlocal); - domain->pbc(); - domain->reset_box(); - comm->setup(); - if (neighbor->style) neighbor->setup_bins(); - comm->exchange(); - comm->borders(); - if (triclinic) domain->lamda2x(atom->nlocal+atom->nghost); - domain->image_check(); - domain->box_too_small_check(); - neighbor->build(1); - neighbor->ncalls = 0; - neighbor->every = 3; // build every this many steps - neighbor->delay = 1; - neighbor->ago = 0; - neighbor->ndanger = 0; - - // compute all forces - - external_force_clear = 0; - eflag=0; - vflag=0; - update_force(); - - if (gcount == atom->natoms) - for (bigint i=0; inatoms; i++) - groupmap[i] = i; - else - create_groupmap(); -} - -/* ---------------------------------------------------------------------- */ - -void ThirdOrder::command(int narg, char **arg) -{ - MPI_Comm_rank(world,&me); - - if (domain->box_exist == 0) - error->all(FLERR,"Third_order command before simulation box is defined"); - if (narg < 2) error->all(FLERR,"Illegal third_oreder command"); - - lmp->init(); - - // orthogonal vs triclinic simulation box - - triclinic = domain->triclinic; - - if (force->pair && force->pair->compute_flag) pair_compute_flag = 1; - else pair_compute_flag = 0; - if (force->kspace && force->kspace->compute_flag) kspace_compute_flag = 1; - else kspace_compute_flag = 0; - - // group and style - - igroup = group->find(arg[0]); - if (igroup == -1) error->all(FLERR,"Could not find third_order group ID"); - groupbit = group->bitmask[igroup]; - gcount = group->count(igroup); - dynlen = (gcount)*3; - memory->create(groupmap,atom->natoms,"total_group_map:totalgm"); - update->setupflag = 1; - - int style = -1; - if (strcmp(arg[1],"regular") == 0) style = REGULAR; - else if (strcmp(arg[1],"ballistico") == 0) style = BALLISTICO; - else error->all(FLERR,"Illegal Dynamical Matrix command"); - - // set option defaults - - binaryflag = 0; - scaleflag = 0; - compressed = 0; - file_flag = 0; - file_opened = 0; - conversion = 1; - - // read options from end of input line - if (style == REGULAR) options(narg-3,&arg[3]); //COME BACK - else if (style == BALLISTICO) options(narg-3,&arg[3]); //COME BACK - else if (comm->me == 0 && screen) fprintf(screen,"Illegal Dynamical Matrix command\n"); - del = force->numeric(FLERR, arg[2]); - - // move atoms by 3-vector or specified variable(s) - - if (style == REGULAR) { - setup(); - timer->init(); - timer->barrier_start(); - calculateMatrix(); - timer->barrier_stop(); - } - - if (style == BALLISTICO) { - setup(); - convert_units(update->unit_style); - conversion = conv_energy/conv_distance/conv_distance; - timer->init(); - timer->barrier_start(); - calculateMatrix(); - timer->barrier_stop(); - } - - Finish finish(lmp); - finish.end(1); -} - -/* ---------------------------------------------------------------------- - parse optional parameters -------------------------------------------------------------------------- */ - -void ThirdOrder::options(int narg, char **arg) -{ - if (narg < 0) error->all(FLERR,"Illegal dynamical_matrix command"); - int iarg = 0; - const char *filename = "third_order.txt"; - - while (iarg < narg) { - if (strcmp(arg[iarg],"file") == 0) { - if (iarg+2 > narg) error->all(FLERR, "Illegal dynamical_matrix command"); - filename = arg[iarg + 1]; - file_flag = 1; - iarg += 2; - } - else if (strcmp(arg[iarg],"binary") == 0) { - if (iarg + 2 > narg) error->all(FLERR, "Illegal dynamical_matrix command"); - if (strcmp(arg[iarg+1],"gzip") == 0) { - compressed = 1; - } - else if (strcmp(arg[iarg+1],"yes") == 0) { - binaryflag = 1; - } - iarg += 2; - } else error->all(FLERR,"Illegal dynamical_matrix command"); - } - if (file_flag == 1 && me == 0) { - openfile(filename); - } -} - -/* ---------------------------------------------------------------------- - generic opening of a file - ASCII or binary or gzipped - some derived classes override this function -------------------------------------------------------------------------- */ - -void ThirdOrder::openfile(const char* filename) -{ - // if file already opened, return - if (file_opened) return; - - if (compressed) { -#ifdef LAMMPS_GZIP - char gzip[128]; - sprintf(gzip,"gzip -6 > %s",filename); -#ifdef _WIN32 - fp = _popen(gzip,"wb"); -#else - fp = popen(gzip,"w"); -#endif -#else - error->one(FLERR,"Cannot open gzipped file"); -#endif - } else if (binaryflag) { - fp = fopen(filename,"wb"); - } else { - fp = fopen(filename,"w"); - } - - if (fp == NULL) error->one(FLERR,"Cannot open dump file"); - - file_opened = 1; -} - -/* ---------------------------------------------------------------------- - create dynamical matrix -------------------------------------------------------------------------- */ - -void ThirdOrder::calculateMatrix() -{ - int local_idx; // local index - int local_jdx; // second local index - int local_kdx; // third local index - int nlocal = atom->nlocal; - int natoms = atom->natoms; - int *gm = groupmap; - double **f = atom->f; - - double *dynmat = new double[3*dynlen]; - double *fdynmat = new double[3*dynlen]; - memset(&dynmat[0],0,dynlen*sizeof(double)); - memset(&fdynmat[0],0,dynlen*sizeof(double)); - - if (comm->me == 0 && screen) fprintf(screen,"Calculating Anharmonic Dynamical Matrix...\n"); - - update->nsteps = 0; - for (bigint i=1; i<=natoms; i++){ - local_idx = atom->map(i); - for (bigint alpha=0; alpha<3; alpha++){ - for (bigint j=1; j<=natoms; j++){ - local_jdx = atom->map(j); - for (int beta=0; beta<3; beta++){ - displace_atom(local_idx, alpha, 1); - displace_atom(local_jdx, beta, 1); - update_force(); - for (bigint k=1; k<=natoms; k++){ - local_kdx = atom->map(k); - for (int gamma=0; gamma<3; gamma++){ - if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 - && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 - && local_kdx < nlocal) { - dynmat[gm[k-1]*3+gamma] += f[local_kdx][gamma]; - } - } - } - displace_atom(local_jdx, beta, -2); - update_force(); - for (bigint k=1; k<=natoms; k++){ - local_kdx = atom->map(k); - for (int gamma=0; gamma<3; gamma++){ - if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 - && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 - && local_kdx < nlocal) { - dynmat[gm[k-1]*3+gamma] -= f[local_kdx][gamma]; - } - } - } - displace_atom(local_jdx, beta, 1); - displace_atom(local_idx,alpha,-2); - displace_atom(local_jdx, beta, 1); - update_force(); - for (bigint k=1; k<=natoms; k++){ - local_kdx = atom->map(k); - for (int gamma=0; gamma<3; gamma++){ - if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 - && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 - && local_kdx < nlocal) { - dynmat[gm[k-1]*3+gamma] -= f[local_kdx][gamma]; - } - } - } - displace_atom(local_jdx, beta, -2); - update_force(); - for (bigint k=1; k<=natoms; k++){ - local_kdx = atom->map(k); - for (int gamma=0; gamma<3; gamma++){ - if (local_idx >= 0 && local_jdx >= 0 && local_kdx >= 0 - && gm[i-1] >= 0 && gm[j-1] >= 0 && gm[k-1] >= 0 - && local_kdx < nlocal) { - dynmat[gm[k-1]*3+gamma] += f[local_kdx][gamma]; - dynmat[gm[k-1]*3+gamma] /= -(4 * del * del); - } - } - } - displace_atom(local_jdx, beta, 1); - displace_atom(local_idx, alpha, 1); - MPI_Reduce(dynmat,fdynmat,3*dynlen,MPI_DOUBLE,MPI_SUM,0,world); - if (me == 0){ - writeMatrix(fdynmat, gm[i-1], alpha, gm[j-1], beta); - } - memset(&dynmat[0],0,dynlen*sizeof(double)); - } - } - } - } - - delete [] dynmat; - delete [] fdynmat; - - if (screen && me ==0 ) fprintf(screen,"Finished Calculating Third Order Tensor\n"); - -} - -/* ---------------------------------------------------------------------- - write dynamical matrix -------------------------------------------------------------------------- */ - -void ThirdOrder::writeMatrix(double *dynmat, int i, int a, int j, int b) -{ - if (me != 0) - return; - - if (!binaryflag && fp) { - clearerr(fp); - for (int k = 0; k < gcount; k++){ - if (dynmat[k*3] > 1.0e-16 - && dynmat[k*3+1] > 1.0e-16 - && dynmat[k*3+2] > 1.0e-16) - fprintf(fp, - "%d %d %d %d %d %7.8f %7.8f %7.8f\n", - i+1, a + 1, j+1, b + 1, groupmap[k]+1, - dynmat[k*3] * conversion, - dynmat[k*3+1] * conversion, - dynmat[k*3+2] * conversion); - } - } - else if (binaryflag && fp){ - clearerr(fp); - fwrite(&dynmat[0], sizeof(double), dynlen, fp); - } - if (ferror(fp)) error->one(FLERR,"Error writing to file"); - -} - -/* ---------------------------------------------------------------------- - Displace atoms - ---------------------------------------------------------------------- */ - -void ThirdOrder::displace_atom(int local_idx, int direction, int magnitude) -{ - if (local_idx < 0) return; - - double **x = atom->x; - int *sametag = atom->sametag; - int j = local_idx; - - x[local_idx][direction] += del*magnitude; - - while (sametag[j] >= 0){ - j = sametag[j]; - x[j][direction] += del*magnitude; - } -} - -/* ---------------------------------------------------------------------- - evaluate potential energy and forces - may migrate atoms due to reneighboring - return new energy, which should include nextra_global dof - return negative gradient stored in atom->f - return negative gradient for nextra_global dof in fextra -------------------------------------------------------------------------- */ - -void ThirdOrder::update_force() -{ - force_clear(); - - timer->stamp(); - - if (pair_compute_flag) { - force->pair->compute(eflag,vflag); - timer->stamp(Timer::PAIR); - } - - if (atom->molecular) { - if (force->bond) force->bond->compute(eflag,vflag); - if (force->angle) force->angle->compute(eflag,vflag); - if (force->dihedral) force->dihedral->compute(eflag,vflag); - if (force->improper) force->improper->compute(eflag,vflag); - timer->stamp(Timer::BOND); - } - - if (kspace_compute_flag) { - force->kspace->compute(eflag,vflag); - timer->stamp(Timer::KSPACE); - } - - if (force->newton) { - comm->reverse_comm(); - timer->stamp(Timer::COMM); - } - ++ update->nsteps; -} - -/* ---------------------------------------------------------------------- - clear force on own & ghost atoms - clear other arrays as needed -------------------------------------------------------------------------- */ - -void ThirdOrder::force_clear() -{ - if (external_force_clear) return; - - // clear global force array - // if either newton flag is set, also include ghosts - - size_t nbytes = sizeof(double) * atom->nlocal; - if (force->newton) nbytes += sizeof(double) * atom->nghost; - - if (nbytes) { - memset(&atom->f[0][0],0,3*nbytes); - } -} - -/* ---------------------------------------------------------------------- */ - -void ThirdOrder::convert_units(const char *style) -{ - // physical constants from: - // http://physics.nist.gov/cuu/Constants/Table/allascii.txt - // using thermochemical calorie = 4.184 J - - if (strcmp(style,"lj") == 0) { - error->all(FLERR,"Conversion Not Set"); - //conversion = 1; // lj -> 10 J/mol - - } else if (strcmp(style,"real") == 0) { - conv_energy = 418.4; // kcal/mol -> 10 J/mol - conv_mass = 1; // g/mol -> g/mol - conv_distance = 1; // angstrom -> angstrom - - } else if (strcmp(style,"metal") == 0) { - conv_energy = 9648.5; // eV -> 10 J/mol - conv_mass = 1; // g/mol -> g/mol - conv_distance = 1; // angstrom -> angstrom - - } else if (strcmp(style,"si") == 0) { - if (comm->me) error->warning(FLERR,"Conversion Warning: Multiplication by Large Float"); - conv_energy = 6.022E22; // J -> 10 J/mol - conv_mass = 6.022E26; // kg -> g/mol - conv_distance = 1E-10; // meter -> angstrom - - } else if (strcmp(style,"cgs") == 0) { - if (comm->me) error->warning(FLERR,"Conversion Warning: Multiplication by Large Float"); - conv_energy = 6.022E12; // Erg -> 10 J/mol - conv_mass = 6.022E23; // g -> g/mol - conv_distance = 1E-7; // centimeter -> angstrom - - } else if (strcmp(style,"electron") == 0) { - conv_energy = 262550; // Hartree -> 10 J/mol - conv_mass = 1; // amu -> g/mol - conv_distance = 0.529177249; // bohr -> angstrom - - } else if (strcmp(style,"micro") == 0) { - if (comm->me) error->warning(FLERR,"Conversion Warning: Untested Conversion"); - conv_energy = 6.022E10; // picogram-micrometer^2/microsecond^2 -> 10 J/mol - conv_mass = 6.022E11; // pg -> g/mol - conv_distance = 1E-4; // micrometer -> angstrom - - } else if (strcmp(style,"nano") == 0) { - if (comm->me) error->warning(FLERR,"Conversion Warning: Untested Conversion"); - conv_energy = 6.022E4; // attogram-nanometer^2/nanosecond^2 -> 10 J/mol - conv_mass = 6.022E5; // ag -> g/mol - conv_distance = 0.1; // angstrom -> angstrom - - } else error->all(FLERR,"Units Type Conversion Not Found"); - -} - -/* ---------------------------------------------------------------------- */ - -void ThirdOrder::create_groupmap() -{ - //Create a group map which maps atom order onto group - - int local_idx; // local index - int gid = 0; //group index - int nlocal = atom->nlocal; - int *mask = atom->mask; - bigint natoms = atom->natoms; - int *recv = new int[comm->nprocs]; - int *displs = new int[comm->nprocs]; - int *temp_groupmap = new int[natoms]; - - //find number of local atoms in the group (final_gid) - for (bigint i=1; i<=natoms; i++){ - local_idx = atom->map(i); - if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit) - gid += 1; // gid at the end of loop is final_Gid - } - //create an array of length final_gid - int *sub_groupmap = new int[gid]; - - gid = 0; - //create a map between global atom id and group atom id for each proc - for (bigint i=1; i<=natoms; i++){ - local_idx = atom->map(i); - if ((local_idx >= 0) && (local_idx < nlocal) && mask[local_idx] & groupbit){ - sub_groupmap[gid] = i; - gid += 1; - } - } - - //populate arrays for Allgatherv - for (int i=0; inprocs; i++){ - recv[i] = 0; - } - recv[comm->me] = gid; - MPI_Allreduce(recv,displs,4,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]; - else displs[i] = 0; - } - - //combine subgroup maps into total temporary groupmap - MPI_Allgatherv(sub_groupmap,gid,MPI_INT,temp_groupmap,recv,displs,MPI_INT,world); - std::sort(temp_groupmap,temp_groupmap+gcount); - - //populate member groupmap based on temp groupmap - for (bigint i=0; icompute is skipped - int kspace_compute_flag; // 0 if kspace->compute is skipped - - int nvec; // local atomic dof = length of xvec - - void update_force(); - void force_clear(); - virtual void openfile(const char* filename); - - - private: - void options(int, char **); - void create_groupmap(); - void calculateMatrix(); - void convert_units(const char *style); - void displace_atom(int local_idx, int direction, int magnitude); - void writeMatrix(double *, int, int, int, int); - - double conversion; - double conv_energy; - double conv_distance; - double conv_mass; - double del; - int igroup,groupbit; - bigint dynlen; - int scaleflag; - int me; - int gcount; // number of atoms in group - int *groupmap; - - int compressed; // 1 if dump file is written compressed, 0 no - int binaryflag; // 1 if dump file is written binary, 0 no - int file_opened; // 1 if openfile method has been called, 0 no - int file_flag; // 1 custom file name, 0 dynmat.dat - - FILE *fp; - }; -} - - -#endif //LMP_THIRD_ORDER_H -#endif - From 1d2eab5e1b6443e70338b8b4a9d33157fc41efe4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 15:26:36 -0500 Subject: [PATCH 0177/1242] update attribution information in Package details documentation --- doc/src/Packages_details.txt | 7 ++++++- src/USER-PHONON/README | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/src/Packages_details.txt b/doc/src/Packages_details.txt index ebfe01d8a7..f5e8c4edbf 100644 --- a/doc/src/Packages_details.txt +++ b/doc/src/Packages_details.txt @@ -1700,14 +1700,19 @@ USER-PHONON package :link(PKG-USER-PHONON),h4 A "fix phonon"_fix_phonon.html command that calculates dynamical matrices, which can then be used to compute phonon dispersion relations, directly from molecular dynamics simulations. +And a "dynamical_matrix" command to compute the dynamical matrix +from finite differences. + +[Authors:] Ling-Ti Kong (Shanghai Jiao Tong University) for "fix phonon" +and Charlie Sievers (UC Davis) for "dynamical_matrix" -[Author:] Ling-Ti Kong (Shanghai Jiao Tong University). [Supporting info:] src/USER-PHONON: filenames -> commands src/USER-PHONON/README "fix phonon"_fix_phonon.html +"dynamical_matrix"_dynamical_matrix.html examples/USER/phonon :ul :line diff --git a/src/USER-PHONON/README b/src/USER-PHONON/README index 697f4ca086..b554eacd5e 100644 --- a/src/USER-PHONON/README +++ b/src/USER-PHONON/README @@ -30,4 +30,5 @@ sjtu.edu.cn) at Shanghai Jiao Tong University. Contact him directly if you have questions. The person who created the dynamical_matrix command is Charlie Sievers -at UC Davis. Contact him directly if you have questions about his code. +(charliesievers at cox.net) at UC Davis. Contact him directly if you +have questions about his code. From 5fd033c0a255024cc6cfe24c431ee4f8164955c9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 15:49:48 -0500 Subject: [PATCH 0178/1242] add one more false positive required by recent changes --- doc/utils/sphinx-config/false_positives.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index bbfdf946f4..99c7831192 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -2433,6 +2433,7 @@ shockvel si SiC Siepmann +Sievers Sij Sikandar Silbert From 50fef541c24740cd51c0448f165f2de8548cc8fd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 15:50:59 -0500 Subject: [PATCH 0179/1242] add x-ref --- doc/src/fix_phonon.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/src/fix_phonon.txt b/doc/src/fix_phonon.txt index 23d4d09552..73f2f4600b 100644 --- a/doc/src/fix_phonon.txt +++ b/doc/src/fix_phonon.txt @@ -179,7 +179,8 @@ settings"_Build_settings.html doc page for details. [Related commands:] -"compute msd"_compute_msd.html +"compute msd"_compute_msd.html, +"dynamical_matrix"_dynamical_matrix.html [Default:] From c555f7e2ed98ae2e33ce30d9ae9fbad36676418d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 28 Feb 2019 17:52:53 -0500 Subject: [PATCH 0180/1242] 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 0181/1242] 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 0182/1242] 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 0183/1242] 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 d8845b681778adb5776165f19e99b730eb4ff66c Mon Sep 17 00:00:00 2001 From: mkanski Date: Fri, 1 Mar 2019 13:13:11 +0100 Subject: [PATCH 0184/1242] Added initialization of the entire num_bonds and num_hbonds arrays --- src/USER-REAXC/fix_reaxc.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/USER-REAXC/fix_reaxc.cpp b/src/USER-REAXC/fix_reaxc.cpp index c470173663..1323ff4da7 100644 --- a/src/USER-REAXC/fix_reaxc.cpp +++ b/src/USER-REAXC/fix_reaxc.cpp @@ -49,8 +49,7 @@ FixReaxC::FixReaxC(LAMMPS *lmp,int narg, char **arg) : // initialize arrays to MIN so atom migration is OK the 1st time - int nlocal = atom->nlocal; - for (int i = 0; i < nlocal; i++) + for (int i = 0; i < atom->nmax; i++) num_bonds[i] = num_hbonds[i] = MIN_REAX_BONDS; // set comm sizes needed by this fix From 0f0a65bb4803332b86f3eb53dec6e303c60b386c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 27 Feb 2019 17:49:34 -0500 Subject: [PATCH 0185/1242] 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 0186/1242] 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 0187/1242] 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 0188/1242] 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 edd4b0cf2548c6ddc5b3ad08a7141c4f5a016606 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 4 Mar 2019 07:35:02 -0700 Subject: [PATCH 0189/1242] Commit JT 030419 - added minspin - modifs before co --- examples/SPIN/gneb_bfo/in.neb.spin_iron | 11 +- examples/SPIN/gneb_bfo/in.neb.spin_iron_min | 42 ++ examples/SPIN/gneb_bfo/in.spin.dyna_iron | 53 +++ src/REPLICA/fix_neb_spin.cpp | 285 ++++++------- src/REPLICA/fix_neb_spin.h | 4 +- src/REPLICA/neb_spin.cpp | 45 +- src/SPIN/min_spinmin.cpp | 428 ++++++++++++++++++++ src/SPIN/min_spinmin.h | 56 +++ 8 files changed, 772 insertions(+), 152 deletions(-) create mode 100644 examples/SPIN/gneb_bfo/in.neb.spin_iron_min create mode 100644 examples/SPIN/gneb_bfo/in.spin.dyna_iron create mode 100644 src/SPIN/min_spinmin.cpp create mode 100644 src/SPIN/min_spinmin.h diff --git a/examples/SPIN/gneb_bfo/in.neb.spin_iron b/examples/SPIN/gneb_bfo/in.neb.spin_iron index 2cf3a8653e..860db24a61 100644 --- a/examples/SPIN/gneb_bfo/in.neb.spin_iron +++ b/examples/SPIN/gneb_bfo/in.neb.spin_iron @@ -29,12 +29,15 @@ 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 2 all langevin/spin 0.0 0.0 21 -fix 2 all neb/spin 1.0 +fix 2 all langevin/spin 0.1 0.0 21 +fix 3 all neb/spin 1.0 +#fix 4 all nve/spin lattice no #parallel ideal timestep 0.0001 +thermo 100 -#min_style quickmin -neb/spin 0.0 0.1 1 1 1 final ../examples/SPIN/gneb_bfo/final.iron_spin + +min_style spinmin +neb/spin 0.0 0.1 100 10 10 final ../examples/SPIN/gneb_bfo/final.iron_spin #neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.neb.spin_iron_min b/examples/SPIN/gneb_bfo/in.neb.spin_iron_min new file mode 100644 index 0000000000..a38a8fbde5 --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.neb.spin_iron_min @@ -0,0 +1,42 @@ +# 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 1.0 +#create_box 1 box +#create_atoms 1 box + +read_data ../examples/SPIN/gneb_bfo/initial.iron_spin + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +#set group all spin 2.2 -1.0 0.0 0.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 2 all langevin/spin 0.1 0.0 21 +fix 3 all neb/spin 1.0 +fix 4 all nve/spin lattice no +#parallel ideal + +timestep 0.0001 +thermo 100 + + +min_style spinmin +neb/spin 0.0 0.1 10 10 10 final ../examples/SPIN/gneb_bfo/final.iron_spin +#neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.spin.dyna_iron b/examples/SPIN/gneb_bfo/in.spin.dyna_iron new file mode 100644 index 0000000000..918819c816 --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.spin.dyna_iron @@ -0,0 +1,53 @@ +# bcc iron in a 3d periodic box + +clear +units metal +atom_style spin + +dimension 3 +boundary f f f + +# 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 1.0 +create_box 1 box +create_atoms 1 box + +#read_data ../examples/SPIN/gneb_bfo/initial.iron_spin + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +set group all spin 2.2 -1.0 0.0 0.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 2 all langevin/spin 300.0 0.01 21 +#fix 3 all neb/spin 1.0 +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 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_style custom step time v_magx v_magnorm v_tmag temp v_emag ke pe etotal +thermo 100 + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] +run 10000 diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/REPLICA/fix_neb_spin.cpp index 150c37a03e..42450c2f0f 100644 --- a/src/REPLICA/fix_neb_spin.cpp +++ b/src/REPLICA/fix_neb_spin.cpp @@ -334,6 +334,9 @@ void FixNEB_spin::min_post_force(int /*vflag*/) MPI_Bcast(&vnext,1,MPI_DOUBLE,0,world); } + //printf("test veng: %g / %g / %g \n",veng,vprev,vnext); + //error->universe_all(FLERR,"End test"); + if (FreeEndFinal && ireplica == nreplica-1 && (update->ntimestep == 0)) EFinalIni = veng; if (ireplica == 0) vIni=veng; @@ -391,7 +394,6 @@ void FixNEB_spin::min_post_force(int /*vflag*/) dotgrad = gradlen = dotpath = dottangrad = 0.0; - // computation of the tangent vector // final replica @@ -401,11 +403,13 @@ void FixNEB_spin::min_post_force(int /*vflag*/) if (mask[i] & groupbit) { // tangent vector + delspxp = sp[i][0] - spprev[i][0]; delspyp = sp[i][1] - spprev[i][1]; delspzp = sp[i][2] - spprev[i][2]; // project delp vector on tangent space + delpdots = delspxp*sp[i][0]+delspyp*sp[i][1]+delspzp*sp[i][2]; delspxp -= delpdots*sp[i][0]; delspyp -= delpdots*sp[i][1]; @@ -415,6 +419,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) //domain->minimum_image(delspxp,delspyp,delspzp); // calc. geodesic length + spi[0]=sp[i][0]; spi[1]=sp[i][1]; spi[2]=sp[i][2]; @@ -470,11 +475,13 @@ void FixNEB_spin::min_post_force(int /*vflag*/) if (mask[i] & groupbit) { // tangent vector + delspxn = spnext[i][0]- sp[i][0]; delspyn = spnext[i][1]- sp[i][1]; delspzn = spnext[i][2]- sp[i][2]; // project deln vector on tangent space + delndots = delspxn*sp[i][0]+delspyn*sp[i][1]+delspzn*sp[i][2]; delspxn -= delndots*sp[i][0]; delspyn -= delndots*sp[i][1]; @@ -484,6 +491,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) //domain->minimum_image(delspxn,delspyn,delspzn); // calc. geodesic length + spi[0]=sp[i][0]; spi[1]=sp[i][1]; spi[2]=sp[i][2]; @@ -492,7 +500,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) spj[2]=spnext[i][2]; templen = geodesic_distance(spi, spj); nlen += templen*templen; - dottangrad += delspxn*fm[i][0] + delspyn*fm[i][1] + delspzp*fm[i][2]; + dottangrad += delspxn*fm[i][0] + delspyn*fm[i][1] + delspzn*fm[i][2]; gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; if (FreeEndIni) { error->all(FLERR,"Free End option not yet active"); @@ -817,18 +825,19 @@ double FixNEB_spin::geodesic_distance(double spi[3], double spj[3]) double dist; double crossx,crossy,crossz; double dotx,doty,dotz; - double crosslen,dots; + double normcross,dots; crossx = spi[1]*spj[2]-spi[2]*spj[1]; crossy = spi[2]*spj[0]-spi[0]*spj[2]; crossz = spi[0]*spj[1]-spi[1]*spj[0]; - crosslen = sqrt(crossx*crossx + crossy*crossy + crossz*crossz); + normcross = sqrt(crossx*crossx + crossy*crossy + crossz*crossz); + dotx = spi[0]*spj[0]; doty = spi[1]*spj[1]; dotz = spi[2]*spj[2]; dots = dotx+doty+dotz; - dist = atan2(crosslen,dots); + dist = atan2(normcross,dots); return dist; } @@ -837,144 +846,144 @@ double FixNEB_spin::geodesic_distance(double spi[3], double spj[3]) geometric damped advance os spins ---------------------------------------------------------------------- */ -void FixNEB_spin::advance_spins(double dts) -{ - //int j=0; - //int *sametag = atom->sametag; - 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 alpha; - double spi[3],fmi[3]; - double cp[3],g[3]; - - //cp[0] = cp[1] = cp[2] = 0.0; - //g[0] = g[1] = g[2] = 0.0; - dts2 = dts*dts; - - // fictitious Gilbert damping of 1 - alpha = 1.0; - - // loop on all spins on proc. - - if (ireplica != nreplica-1 && ireplica != 0) - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { - - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; - - fmi[0] = fm[i][0]; - fmi[1] = fm[i][1]; - fmi[2] = fm[i][2]; - - // calc. damping torque - - tdampx = -alpha*(fmi[1]*spi[2] - fmi[2]*spi[1]); - tdampy = -alpha*(fmi[2]*spi[0] - fmi[0]*spi[2]); - tdampz = -alpha*(fmi[0]*spi[1] - fmi[1]*spi[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] += (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]; - - // 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; - - // comm. sp[i] to atoms with same tag (for serial algo) - - // no need for simplecticity - //if (sector_flag == 0) { - // if (sametag[i] >= 0) { - // j = sametag[i]; - // while (j >= 0) { - // sp[j][0] = sp[i][0]; - // sp[j][1] = sp[i][1]; - // sp[j][2] = sp[i][2]; - // j = sametag[j]; - // } - // } - //} - // - - } -} +//void FixNEB_spin::advance_spins(double dts) +//{ +// //int j=0; +// //int *sametag = atom->sametag; +// 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 alpha; +// double spi[3],fmi[3]; +// double cp[3],g[3]; +// +// //cp[0] = cp[1] = cp[2] = 0.0; +// //g[0] = g[1] = g[2] = 0.0; +// dts2 = dts*dts; +// +// // fictitious Gilbert damping of 1 +// alpha = 1.0; +// +// // loop on all spins on proc. +// +// if (ireplica != nreplica-1 && ireplica != 0) +// for (int i = 0; i < nlocal; i++) +// if (mask[i] & groupbit) { +// +// spi[0] = sp[i][0]; +// spi[1] = sp[i][1]; +// spi[2] = sp[i][2]; +// +// fmi[0] = fm[i][0]; +// fmi[1] = fm[i][1]; +// fmi[2] = fm[i][2]; +// +// // calc. damping torque +// +// tdampx = -alpha*(fmi[1]*spi[2] - fmi[2]*spi[1]); +// tdampy = -alpha*(fmi[2]*spi[0] - fmi[0]*spi[2]); +// tdampz = -alpha*(fmi[0]*spi[1] - fmi[1]*spi[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] += (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]; +// +// // 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; +// +// // comm. sp[i] to atoms with same tag (for serial algo) +// +// // no need for simplecticity +// //if (sector_flag == 0) { +// // if (sametag[i] >= 0) { +// // j = sametag[i]; +// // while (j >= 0) { +// // sp[j][0] = sp[i][0]; +// // sp[j][1] = sp[i][1]; +// // sp[j][2] = sp[i][2]; +// // j = sametag[j]; +// // } +// // } +// //} +// // +// +// } +//} /* ---------------------------------------------------------------------- evaluate max timestep ---------------------------------------------------------------------- */ -double FixNEB_spin::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++) - if (mask[i] & groupbit) { - 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 - - if (update->multireplica == 1) { - fmaxsqall = fmaxsqloc; - MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); - } - - if (fmaxsqall < fmaxsqloc) - error->all(FLERR,"Incorrect fmaxall calc."); - - // define max timestep - // dividing by 10 the inverse of max frequency - - dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); - - return dtmax; -} +//double FixNEB_spin::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++) +// if (mask[i] & groupbit) { +// 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 +// +// if (update->multireplica == 1) { +// fmaxsqall = fmaxsqloc; +// MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); +// } +// +// if (fmaxsqall < fmaxsqloc) +// error->all(FLERR,"Incorrect fmaxall calc."); +// +// // define max timestep +// // dividing by 10 the inverse of max frequency +// +// dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); +// +// return dtmax; +//} /* ---------------------------------------------------------------------- send/recv NEB atoms to/from adjacent replicas diff --git a/src/REPLICA/fix_neb_spin.h b/src/REPLICA/fix_neb_spin.h index 291341860e..c70f35ae2d 100644 --- a/src/REPLICA/fix_neb_spin.h +++ b/src/REPLICA/fix_neb_spin.h @@ -36,8 +36,8 @@ class FixNEB_spin : public Fix { void init(); void min_setup(int); void min_post_force(int); - void advance_spins(double); - double evaluate_dt(); + //void advance_spins(double); + //double evaluate_dt(); private: int me,nprocs,nprocs_universe; diff --git a/src/REPLICA/neb_spin.cpp b/src/REPLICA/neb_spin.cpp index 8780cb9a0a..6249797e95 100644 --- a/src/REPLICA/neb_spin.cpp +++ b/src/REPLICA/neb_spin.cpp @@ -24,6 +24,7 @@ // test spin #include "neb_spin.h" #include "compute.h" +#include "force.h" #include "universe.h" #include "atom.h" @@ -262,6 +263,8 @@ void NEB_spin::run() // setup regular NEB_spin minimization FILE *uscreen = universe->uscreen; FILE *ulogfile = universe->ulogfile; + + //printf("test before run 1 \n"); if (me_universe == 0 && uscreen) fprintf(uscreen,"Setting up regular NEB_spin ...\n"); @@ -272,8 +275,12 @@ void NEB_spin::run() update->max_eval = n1steps; if (update->laststep < 0) error->all(FLERR,"Too many timesteps for NEB_spin"); + + //printf("test before run 2 \n"); update->minimize->setup(); + + //printf("test before run 3 \n"); if (me_universe == 0) { if (uscreen) { @@ -304,7 +311,9 @@ void NEB_spin::run() } } } + //printf("test before run 4 \n"); print_status(); + //printf("test before run 5 \n"); // perform regular NEB_spin for n1steps or until replicas converge // retrieve PE values from fix NEB_spin and print every nevery iterations @@ -314,13 +323,23 @@ void NEB_spin::run() timer->init(); timer->barrier_start(); + // test import fix_nve scheme + + //printf("test 2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); + //error->all(FLERR,"end neb_spin test"); double dts; while (update->minimize->niter < n1steps) { //dts = evaluate_dt(); //advance_spins(dts); - dts = fneb->evaluate_dt(); - fneb->advance_spins(dts); + //fneb-> + //dts = fneb->evaluate_dt(); + //fneb->advance_spins(dts); + + // no minimizer for spins + update->minimize->run(nevery); + + // no minimizer for spins //update->minimize->run(nevery); // @@ -331,6 +350,9 @@ void NEB_spin::run() if (update->minimize->stop_condition) break; } + // test neb end + //error->all(FLERR,"end neb_spin test"); + timer->barrier_stop(); update->minimize->cleanup(); @@ -371,8 +393,11 @@ void NEB_spin::run() update->minimize->init(); fneb->rclimber = top; + printf("test print 6.2 \n"); update->minimize->setup(); + printf("test print 6.3 \n"); + if (me_universe == 0) { if (uscreen) { if (verbose) { @@ -418,9 +443,9 @@ void NEB_spin::run() while (update->minimize->niter < n2steps) { //dts = evaluate_dt(); //advance_spins(dts); - dts = fneb->evaluate_dt(); - fneb->advance_spins(dts); - //update->minimize->run(nevery); + //dts = fneb->evaluate_dt(); + //fneb->advance_spins(dts); + update->minimize->run(nevery); print_status(); if (update->minimize->stop_condition) break; } @@ -995,9 +1020,13 @@ void NEB_spin::print_status() double fmaxreplica; MPI_Allreduce(&fnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); - double fnorminf = update->minimize->fnorm_inf(); - double fmaxatom; - MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); + + // no minimize->fnorm_inf for spins + //double fnorminf = update->minimize->fnorm_inf(); + //double fmaxatom; + //MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); + double fnorminf = 0.0; + double fmaxatom = 0.0; if (verbose) { freplica = new double[nreplica]; diff --git a/src/SPIN/min_spinmin.cpp b/src/SPIN/min_spinmin.cpp new file mode 100644 index 0000000000..08f91abae7 --- /dev/null +++ b/src/SPIN/min_spinmin.cpp @@ -0,0 +1,428 @@ +/* ---------------------------------------------------------------------- + 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. +------------------------------------------------------------------------- */ + +#include +#include +#include "min_spinmin.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 + +/* ---------------------------------------------------------------------- */ + +MinSpinMin::MinSpinMin(LAMMPS *lmp) : Min(lmp) {} + +/* ---------------------------------------------------------------------- */ + +void MinSpinMin::init() +{ + Min::init(); + + dt = update->dt; + last_negative = update->ntimestep; + + // test dts + dts = dt; + +} + +/* ---------------------------------------------------------------------- */ + +void MinSpinMin::setup_style() +{ + double **v = atom->v; + int nlocal = atom->nlocal; + + for (int i = 0; i < nlocal; i++) + v[i][0] = v[i][1] = v[i][2] = 0.0; +} + +/* ---------------------------------------------------------------------- + set current vector lengths and pointers + called after atoms have migrated +------------------------------------------------------------------------- */ + +void MinSpinMin::reset_vectors() +{ + // atomic dof + + // not really good 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 QuickMin damped dynamics +------------------------------------------------------------------------- */ + +int MinSpinMin::iterate(int maxiter) +{ + bigint ntimestep; + //double vmax,vdotf,vdotfall,fdotf,fdotfall,scale; + //double dtvone,dtv,dtf,dtfm; + //int flag,flagall; + + //alpha_final = 0.0; + + // search for and allocate neb_spin fix + + //int ineb; + //for (ineb = 0; ineb < modify->nfix; ineb++) + // if (strcmp(modify->fix[ineb]->style,"neb/spin") == 0) break; + //if (ineb == modify->nfix) error->all(FLERR,"spinmin requires use of fix neb/spin"); + //fneb = (FixNEB_spin *) modify->fix[ineb]; + + for (int iter = 0; iter < maxiter; iter++) { + + if (timer->check_timeout(niter)) + return TIMEOUT; + + ntimestep = ++update->ntimestep; + niter++; + + // optimize timestep accross processes / replicas + + //dts = fneb->evaluate_dt(); + dts = evaluate_dt(); + + // apply damped precessional dynamics to the spins + + //fneb->advance_spins(dts); + advance_spins(dts); + + + //// zero velocity if anti-parallel to force + //// else project velocity in direction of force + + //double **v = atom->v; + //double **f = atom->f; + //int nlocal = atom->nlocal; + + //vdotf = 0.0; + //for (int i = 0; i < nlocal; i++) + // vdotf += v[i][0]*f[i][0] + v[i][1]*f[i][1] + v[i][2]*f[i][2]; + //MPI_Allreduce(&vdotf,&vdotfall,1,MPI_DOUBLE,MPI_SUM,world); + + // sum vdotf over replicas, if necessary + // this communicator would be invalid for multiprocess replicas + + //if (update->multireplica == 1) { + // vdotf = vdotfall; + // MPI_Allreduce(&vdotf,&vdotfall,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + //} + + //if (vdotfall < 0.0) { + // last_negative = ntimestep; + // for (int i = 0; i < nlocal; i++) + // v[i][0] = v[i][1] = v[i][2] = 0.0; + + //} else { + // fdotf = 0.0; + // for (int i = 0; i < nlocal; i++) + // fdotf += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; + // MPI_Allreduce(&fdotf,&fdotfall,1,MPI_DOUBLE,MPI_SUM,world); + + // // sum fdotf over replicas, if necessary + // // this communicator would be invalid for multiprocess replicas + + // if (update->multireplica == 1) { + // fdotf = fdotfall; + // MPI_Allreduce(&fdotf,&fdotfall,1,MPI_DOUBLE,MPI_SUM,universe->uworld); + // } + + // if (fdotfall == 0.0) scale = 0.0; + // else scale = vdotfall/fdotfall; + // for (int i = 0; i < nlocal; i++) { + // v[i][0] = scale * f[i][0]; + // v[i][1] = scale * f[i][1]; + // v[i][2] = scale * f[i][2]; + // } + //} + + //// limit timestep so no particle moves further than dmax + + //double *rmass = atom->rmass; + //double *mass = atom->mass; + //int *type = atom->type; + + //dtvone = dt; + + //for (int i = 0; i < nlocal; i++) { + // vmax = MAX(fabs(v[i][0]),fabs(v[i][1])); + // vmax = MAX(vmax,fabs(v[i][2])); + // if (dtvone*vmax > dmax) dtvone = dmax/vmax; + //} + //MPI_Allreduce(&dtvone,&dtv,1,MPI_DOUBLE,MPI_MIN,world); + + //// min dtv over replicas, if necessary + //// this communicator would be invalid for multiprocess replicas + + //if (update->multireplica == 1) { + // dtvone = dtv; + // MPI_Allreduce(&dtvone,&dtv,1,MPI_DOUBLE,MPI_MIN,universe->uworld); + //} + + //dtf = dtv * force->ftm2v; + + //// Euler integration step + + //double **x = atom->x; + + //if (rmass) { + // for (int i = 0; i < nlocal; i++) { + // dtfm = dtf / rmass[i]; + // x[i][0] += dtv * v[i][0]; + // x[i][1] += dtv * v[i][1]; + // x[i][2] += dtv * v[i][2]; + // v[i][0] += dtfm * f[i][0]; + // v[i][1] += dtfm * f[i][1]; + // v[i][2] += dtfm * f[i][2]; + // } + //} else { + // for (int i = 0; i < nlocal; i++) { + // dtfm = dtf / mass[type[i]]; + // x[i][0] += dtv * v[i][0]; + // x[i][1] += dtv * v[i][1]; + // x[i][2] += dtv * v[i][2]; + // v[i][0] += dtfm * f[i][0]; + // v[i][1] += dtfm * f[i][1]; + // v[i][2] += dtfm * f[i][2]; + // } + //} + + //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; + // } + //} + + //// force tolerance criterion + //// sync across replicas if running multi-replica minimization + + //if (update->ftol > 0.0) { + // fdotf = fnorm_sqr(); + // if (update->multireplica == 0) { + // if (fdotf < update->ftol*update->ftol) return FTOL; + // } else { + // if (fdotf < 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 MinSpinMin::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); + } + //for (int i = 0; i < nlocal; i++) + // if (mask[i] & groupbit) { + // 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 + + if (update->multireplica == 1) { + fmaxsqall = fmaxsqloc; + MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); + } + + if (fmaxsqall < fmaxsqloc) + error->all(FLERR,"Incorrect fmaxall calc."); + + // define max timestep + // dividing by 10 the inverse of max frequency + + dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); + + return dtmax; +} + +/* ---------------------------------------------------------------------- + geometric damped advance of spins +---------------------------------------------------------------------- */ + +void MinSpinMin::advance_spins(double dts) +{ + //int j=0; + //int *sametag = atom->sametag; + 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 alpha; + double spi[3],fmi[3]; + double cp[3],g[3]; + + //cp[0] = cp[1] = cp[2] = 0.0; + //g[0] = g[1] = g[2] = 0.0; + dts2 = dts*dts; + + // fictitious Gilbert damping of 1 + alpha = 1.0; + + // loop on all spins on proc. + + //if (ireplica != nreplica-1 && ireplica != 0) + // for (int i = 0; i < nlocal; i++) + // if (mask[i] & groupbit) { + for (int i = 0; i < nlocal; i++) { + + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + + fmi[0] = fm[i][0]; + fmi[1] = fm[i][1]; + fmi[2] = fm[i][2]; + + // calc. damping torque + + tdampx = -alpha*(fmi[1]*spi[2] - fmi[2]*spi[1]); + tdampy = -alpha*(fmi[2]*spi[0] - fmi[0]*spi[2]); + tdampz = -alpha*(fmi[0]*spi[1] - fmi[1]*spi[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] += (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]; + + // 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; + + // comm. sp[i] to atoms with same tag (for serial algo) + + // no need for simplecticity + //if (sector_flag == 0) { + // if (sametag[i] >= 0) { + // j = sametag[i]; + // while (j >= 0) { + // sp[j][0] = sp[i][0]; + // sp[j][1] = sp[i][1]; + // sp[j][2] = sp[i][2]; + // j = sametag[j]; + // } + // } + //} + // + } + + printf("test inside spinmin, dts = %g \n",dts); + printf("test inside spinmin, fmi i=%d, %g %g %g \n",1,fm[1][0],fm[1][1],fm[1][2]); + printf("test inside spinmin, spi i=%d, %g %g %g \n",1,sp[1][0],sp[1][1],sp[1][2]); +} diff --git a/src/SPIN/min_spinmin.h b/src/SPIN/min_spinmin.h new file mode 100644 index 0000000000..fe2cf7c51d --- /dev/null +++ b/src/SPIN/min_spinmin.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 MINIMIZE_CLASS + +MinimizeStyle(spinmin,MinSpinMin) + +#else + +#ifndef LMP_MIN_SPINMIN_H +#define LMP_MIN_SPINMIN_H + +#include "min.h" + +namespace LAMMPS_NS { + +class MinSpinMin : public Min { + public: + MinSpinMin(class LAMMPS *); + ~MinSpinMin() {} + void init(); + void setup_style(); + void reset_vectors(); + int iterate(int); + double evaluate_dt(); + void advance_spins(double); + + class FixNEB_spin *fneb; + + private: + + // spin timestep + double dts; + + double *spvec; // variables for atomic dof, as 1d vector + double *fmvec; // variables for atomic dof, as 1d vector + + + double dt; + bigint last_negative; +}; + +} + +#endif +#endif From ab0c35be9357d36f3d0600206679753fb14a86ae Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 4 Mar 2019 08:04:11 -0700 Subject: [PATCH 0190/1242] 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 0191/1242] 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 0192/1242] 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 0193/1242] 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 0194/1242] 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 0195/1242] 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 146e2f283a7d717cff840f0b3696fc27c8826931 Mon Sep 17 00:00:00 2001 From: mkanski Date: Tue, 5 Mar 2019 19:11:33 +0100 Subject: [PATCH 0196/1242] Better error handling in reaxc_forces --- src/USER-REAXC/pair_reaxc.cpp | 11 ++++++----- src/USER-REAXC/reaxc_allocate.cpp | 12 ++++++++---- src/USER-REAXC/reaxc_allocate.h | 7 ++++++- src/USER-REAXC/reaxc_forces.cpp | 18 +++++++++++------- src/USER-REAXC/reaxc_forces.h | 2 +- src/USER-REAXC/reaxc_init_md.cpp | 12 +++++++----- src/USER-REAXC/reaxc_init_md.h | 5 ++++- src/USER-REAXC/reaxc_reset_tools.cpp | 12 +++++++----- src/USER-REAXC/reaxc_reset_tools.h | 8 ++++++-- 9 files changed, 56 insertions(+), 31 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index b68e0d0779..0f4b3a5b3d 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -394,7 +394,8 @@ void PairReaxC::init_style( ) "increased neighbor list skin."); for( int i = 0; i < LIST_N; ++i ) - lists[i].allocated = 0; + if (lists[i].allacated != 1) + lists[i].allocated = 0; if (fix_reax == NULL) { char **fixarg = new char*[3]; @@ -445,7 +446,7 @@ void PairReaxC::setup( ) error->all(FLERR,"Pair reax/c problem in far neighbor list"); write_reax_lists(); - Initialize( system, control, data, workspace, &lists, out_control, + Initialize( lmp, system, control, data, workspace, &lists, out_control, mpi_data, world ); for( int k = 0; k < system->N; ++k ) { num_bonds[k] = system->my_atoms[k].num_bonds; @@ -465,7 +466,7 @@ void PairReaxC::setup( ) // check if I need to shrink/extend my data-structs - ReAllocate( system, control, data, workspace, &lists, mpi_data ); + ReAllocate( lmp, system, control, data, workspace, &lists, mpi_data ); } bigint local_ngroup = list->inum; @@ -517,7 +518,7 @@ void PairReaxC::compute(int eflag, int vflag) setup(); - Reset( system, control, data, workspace, &lists, world ); + Reset( lmp, system, control, data, workspace, &lists, world ); workspace->realloc.num_far = write_reax_lists(); // timing for filling in the reax lists if (comm->me == 0) { @@ -527,7 +528,7 @@ void PairReaxC::compute(int eflag, int vflag) // forces - Compute_Forces(system,control,data,workspace,&lists,out_control,mpi_data); + Compute_Forces(lmp, system,control,data,workspace,&lists,out_control,mpi_data); read_reax_forces(vflag); for(int k = 0; k < system->N; ++k) { diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 700e68514c..ebf0684389 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -35,6 +35,10 @@ #include #endif +#include "lammps.h" +#include "error.h" +using namespace LAMMPS_NS; + /* allocate space for my_atoms important: we cannot know the exact number of atoms that will fall into a process's box throughout the whole simulation. therefore @@ -353,7 +357,7 @@ static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds, } -static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, +static int Reallocate_Bonds_List( LAMMPS *lmp, reax_system *system, reax_list *bonds, int *total_bonds, int *est_3body, MPI_Comm comm ) { @@ -379,7 +383,7 @@ static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, Delete_List( bonds, comm ); if(!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds, comm)) { fprintf( stderr, "not enough space for bonds list. terminating!\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + lmp->error->all(FLERR, "Can't allocate space for hbonds."); } #ifdef LMP_USER_OMP @@ -399,7 +403,7 @@ static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, } -void ReAllocate( reax_system *system, control_params *control, +void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, mpi_datatypes *mpi_data ) { @@ -490,7 +494,7 @@ void ReAllocate( reax_system *system, control_params *control, /* bonds list */ num_bonds = est_3body = -1; if (Nflag || realloc->bonds) { - Reallocate_Bonds_List( system, (*lists)+BONDS, &num_bonds, + Reallocate_Bonds_List( lmp, system, (*lists)+BONDS, &num_bonds, &est_3body, comm ); realloc->bonds = 0; realloc->num_3body = MAX( realloc->num_3body, est_3body ) * 2; diff --git a/src/USER-REAXC/reaxc_allocate.h b/src/USER-REAXC/reaxc_allocate.h index f8814859af..786ee6ee8b 100644 --- a/src/USER-REAXC/reaxc_allocate.h +++ b/src/USER-REAXC/reaxc_allocate.h @@ -28,6 +28,11 @@ #define __ALLOCATE_H_ #include "reaxc_types.h" + +#include "lammps.h" +#include "error.h" +using namespace LAMMPS_NS; + int PreAllocate_Space( reax_system*, control_params*, storage*, MPI_Comm ); int Allocate_System( reax_system*, int, int, char* ); @@ -37,6 +42,6 @@ int Allocate_Workspace( reax_system*, control_params*, storage*, int, int, MPI_Comm, char* ); void DeAllocate_Workspace( control_params*, storage* ); -void ReAllocate( reax_system*, control_params*, simulation_data*, storage*, +void ReAllocate( LAMMPS *lmp, reax_system*, control_params*, simulation_data*, storage*, reax_list**, mpi_datatypes* ); #endif diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index 19b3cc4975..848c03f5a1 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -39,7 +39,11 @@ #include "reaxc_valence_angles.h" #include "reaxc_vector.h" +#include "lammps.h" +#include "error.h" + interaction_function Interaction_Functions[NUM_INTRS]; +using namespace LAMMPS_NS; void Dummy_Interaction( reax_system * /*system*/, control_params * /*control*/, simulation_data * /*data*/, storage * /*workspace*/, @@ -114,7 +118,7 @@ void Compute_Total_Force( reax_system *system, control_params *control, } -void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **lists, +void Validate_Lists( LAMMPS *lmp, reax_system *system, storage * /*workspace*/, reax_list **lists, int step, int /*n*/, int N, int numH, MPI_Comm comm ) { int i, comp, Hindex; @@ -136,7 +140,7 @@ void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **l if (End_Index(i, bonds) > comp) { fprintf( stderr, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", step, i, End_Index(i,bonds), comp ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + lmp->error->all(FLERR,"Failure in bond list."); } } } @@ -163,7 +167,7 @@ void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **l if (End_Index(Hindex, hbonds) > comp) { fprintf(stderr,"step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", step, Hindex, End_Index(Hindex,hbonds), comp ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + lmp->error->all(FLERR, "Failure in hydrogen bonds."); } } } @@ -171,7 +175,7 @@ void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **l } -void Init_Forces_noQEq( reax_system *system, control_params *control, +void Init_Forces_noQEq( LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls * /*out_control*/, MPI_Comm comm ) { @@ -307,7 +311,7 @@ void Init_Forces_noQEq( reax_system *system, control_params *control, workspace->realloc.num_bonds = num_bonds; workspace->realloc.num_hbonds = num_hbonds; - Validate_Lists( system, workspace, lists, data->step, + Validate_Lists( lmp, system, workspace, lists, data->step, system->n, system->N, system->numH, comm ); } @@ -431,14 +435,14 @@ void Estimate_Storages( reax_system *system, control_params *control, } -void Compute_Forces( reax_system *system, control_params *control, +void Compute_Forces( LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data ) { MPI_Comm comm = mpi_data->world; - Init_Forces_noQEq( system, control, data, workspace, + Init_Forces_noQEq( lmp, system, control, data, workspace, lists, out_control, comm ); /********* bonded interactions ************/ diff --git a/src/USER-REAXC/reaxc_forces.h b/src/USER-REAXC/reaxc_forces.h index 6c839a7023..31cfc03a6b 100644 --- a/src/USER-REAXC/reaxc_forces.h +++ b/src/USER-REAXC/reaxc_forces.h @@ -33,7 +33,7 @@ extern interaction_function Interaction_Functions[NUM_INTRS]; void Init_Force_Functions( control_params* ); -void Compute_Forces( reax_system*, control_params*, simulation_data*, +void Compute_Forces( LAMMPS_NS::LAMMPS *lmp, reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*, mpi_datatypes* ); void Estimate_Storages( reax_system*, control_params*, reax_list**, int*, int*, int*, int*, MPI_Comm ); diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 5901b76326..4565fd067d 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -36,6 +36,8 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" +using namespace LAMMPS_NS; + int Init_System( reax_system *system, control_params *control, char * /*msg*/ ) { int i; @@ -150,7 +152,7 @@ int Init_MPI_Datatypes( reax_system *system, storage * /*workspace*/, return SUCCESS; } -int Init_Lists( reax_system *system, control_params *control, +int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, simulation_data * /*data*/, storage * /*workspace*/, reax_list **lists, mpi_datatypes *mpi_data, char * /*msg*/ ) { @@ -180,7 +182,7 @@ int Init_Lists( reax_system *system, control_params *control, if( !Make_List( system->Hcap, total_hbonds, TYP_HBOND, *lists+HBONDS, comm ) ) { fprintf( stderr, "not enough space for hbonds list. terminating!\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + lmp->error->all(FLERR, "Can't allocate space for hbonds."); } } @@ -194,7 +196,7 @@ int Init_Lists( reax_system *system, control_params *control, if( !Make_List( system->total_cap, bond_cap, TYP_BOND, *lists+BONDS, comm ) ) { fprintf( stderr, "not enough space for bonds list. terminating!\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + lmp->error->all(FLERR, "Can't allocate space for hbonds."); } /* 3bodies list */ @@ -211,7 +213,7 @@ int Init_Lists( reax_system *system, control_params *control, return SUCCESS; } -void Initialize( reax_system *system, control_params *control, +void Initialize( LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data, MPI_Comm comm ) @@ -250,7 +252,7 @@ void Initialize( reax_system *system, control_params *control, MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); } - if (Init_Lists( system, control, data, workspace, lists, mpi_data, msg ) == + if (Init_Lists( lmp, system, control, data, workspace, lists, mpi_data, msg ) == FAILURE) { fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); fprintf( stderr, "p%d: system could not be initialized! terminating.\n", diff --git a/src/USER-REAXC/reaxc_init_md.h b/src/USER-REAXC/reaxc_init_md.h index 25333c744f..2baa70245b 100644 --- a/src/USER-REAXC/reaxc_init_md.h +++ b/src/USER-REAXC/reaxc_init_md.h @@ -29,6 +29,9 @@ #include "reaxc_types.h" -void Initialize( reax_system*, control_params*, simulation_data*, storage*, +#include "lammps.h" +#include "error.h" + +void Initialize( LAMMPS_NS::LAMMPS *lmp, reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*, mpi_datatypes*, MPI_Comm ); #endif diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index 80faed1e9f..d9cb5f22fe 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -30,6 +30,8 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" +using namespace LAMMPS_NS; + void Reset_Atoms( reax_system* system, control_params *control ) { int i; @@ -119,7 +121,7 @@ void Reset_Workspace( reax_system *system, storage *workspace ) } -void Reset_Neighbor_Lists( reax_system *system, control_params *control, +void Reset_Neighbor_Lists( LAMMPS *lmp, reax_system *system, control_params *control, storage *workspace, reax_list **lists, MPI_Comm comm ) { @@ -145,7 +147,7 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, fprintf(stderr, "p%d: not enough space for bonds! total=%d allocated=%d\n", system->my_rank, total_bonds, bonds->num_intrs ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + lmp->error->all(FLERR, "Can't allocate space for hbonds."); } } } @@ -171,14 +173,14 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, fprintf(stderr, "p%d: not enough space for hbonds! total=%d allocated=%d\n", system->my_rank, total_hbonds, hbonds->num_intrs ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + lmp->error->all(FLERR, "Can't allocate space for hbonds."); } } } } -void Reset( reax_system *system, control_params *control, simulation_data *data, +void Reset( LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, MPI_Comm comm ) { Reset_Atoms( system, control ); @@ -187,6 +189,6 @@ void Reset( reax_system *system, control_params *control, simulation_data *data, Reset_Workspace( system, workspace ); - Reset_Neighbor_Lists( system, control, workspace, lists, comm ); + Reset_Neighbor_Lists( lmp, system, control, workspace, lists, comm ); } diff --git a/src/USER-REAXC/reaxc_reset_tools.h b/src/USER-REAXC/reaxc_reset_tools.h index c2a90072d5..9e2b9de980 100644 --- a/src/USER-REAXC/reaxc_reset_tools.h +++ b/src/USER-REAXC/reaxc_reset_tools.h @@ -29,12 +29,16 @@ #include "reaxc_types.h" +#include "lammps.h" +#include "error.h" +using namespace LAMMPS_NS; + void Reset_Pressures( simulation_data* ); void Reset_Simulation_Data( simulation_data*, int ); void Reset_Timing( reax_timing* ); void Reset_Workspace( reax_system*, storage* ); -void Reset_Neighbor_Lists( reax_system*, control_params*, storage*, +void Reset_Neighbor_Lists( LAMMPS *lmp, reax_system*, control_params*, storage*, reax_list**, MPI_Comm ); -void Reset( reax_system*, control_params*, simulation_data*, storage*, +void Reset( LAMMPS *lmp, reax_system*, control_params*, simulation_data*, storage*, reax_list**, MPI_Comm ); #endif From bfa950a7e906b0f09233b72f177a978887fdeaa7 Mon Sep 17 00:00:00 2001 From: mkanski Date: Tue, 5 Mar 2019 22:40:10 +0100 Subject: [PATCH 0197/1242] 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 0198/1242] 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 0199/1242] 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 0200/1242] 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 0201/1242] 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 0202/1242] 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 0203/1242] 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 0204/1242] 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 0205/1242] 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 0206/1242] 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 ff7276e494082d9fca6f766469f826b378970836 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 7 Mar 2019 08:56:13 -0700 Subject: [PATCH 0207/1242] Clean up the fused comm --- src/KOKKOS/atom_vec_kokkos.cpp | 14 +++++++------- src/KOKKOS/atom_vec_kokkos.h | 10 +++++----- src/KOKKOS/comm_kokkos.cpp | 8 +++----- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/KOKKOS/atom_vec_kokkos.cpp b/src/KOKKOS/atom_vec_kokkos.cpp index 5a1b1bde22..076e3e52fa 100644 --- a/src/KOKKOS/atom_vec_kokkos.cpp +++ b/src/KOKKOS/atom_vec_kokkos.cpp @@ -271,7 +271,7 @@ int AtomVecKokkos::pack_comm_self(const int &n, const DAT::tdual_int_2d &list, c /* ---------------------------------------------------------------------- */ template -struct AtomVecKokkos_PackCommSelfSquash { +struct AtomVecKokkos_PackCommSelfFused { typedef DeviceType device_type; typename ArrayTypes::t_x_array_randomread _x; @@ -283,7 +283,7 @@ struct AtomVecKokkos_PackCommSelfSquash { typename ArrayTypes::t_int_1d_const _sendnum_scan; X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; - AtomVecKokkos_PackCommSelfSquash( + AtomVecKokkos_PackCommSelfFused( const typename DAT::tdual_x_array &x, const typename DAT::tdual_int_2d &list, const typename DAT::tdual_int_2d &pbc, @@ -334,18 +334,18 @@ struct AtomVecKokkos_PackCommSelfSquash { /* ---------------------------------------------------------------------- */ -int AtomVecKokkos::pack_comm_self_squash(const int &n, const DAT::tdual_int_2d &list, const DAT::tdual_int_1d &sendnum_scan, +int AtomVecKokkos::pack_comm_self_fused(const int &n, const DAT::tdual_int_2d &list, const DAT::tdual_int_1d &sendnum_scan, const DAT::tdual_int_1d &firstrecv, const DAT::tdual_int_1d &pbc_flag, const DAT::tdual_int_2d &pbc) { if(commKK->forward_comm_on_host) { sync(Host,X_MASK); modified(Host,X_MASK); if(domain->triclinic) { - struct AtomVecKokkos_PackCommSelfSquash f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, + struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, domain->xprd,domain->yprd,domain->zprd, domain->xy,domain->xz,domain->yz); Kokkos::parallel_for(n,f); } else { - struct AtomVecKokkos_PackCommSelfSquash f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, + struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, domain->xprd,domain->yprd,domain->zprd, domain->xy,domain->xz,domain->yz); Kokkos::parallel_for(n,f); @@ -354,12 +354,12 @@ int AtomVecKokkos::pack_comm_self_squash(const int &n, const DAT::tdual_int_2d & sync(Device,X_MASK); modified(Device,X_MASK); if(domain->triclinic) { - struct AtomVecKokkos_PackCommSelfSquash f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, + struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, domain->xprd,domain->yprd,domain->zprd, domain->xy,domain->xz,domain->yz); Kokkos::parallel_for(n,f); } else { - struct AtomVecKokkos_PackCommSelfSquash f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, + struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, domain->xprd,domain->yprd,domain->zprd, domain->xy,domain->xz,domain->yz); Kokkos::parallel_for(n,f); diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index d8541ceb86..64fd238fc0 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -52,11 +52,11 @@ class AtomVecKokkos : public AtomVec { const int &pbc_flag, const int pbc[]); virtual int - pack_comm_self_squash(const int &n, const DAT::tdual_int_2d &list, - const DAT::tdual_int_1d &sendnum_scan, - const DAT::tdual_int_1d &firstrecv, - const DAT::tdual_int_1d &pbc_flag, - const DAT::tdual_int_2d &pbc); + pack_comm_self_fused(const int &n, const DAT::tdual_int_2d &list, + const DAT::tdual_int_1d &sendnum_scan, + const DAT::tdual_int_1d &firstrecv, + const DAT::tdual_int_1d &pbc_flag, + const DAT::tdual_int_2d &pbc); virtual int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &list, diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index c782305ef5..5aa2cbdfbe 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -187,11 +187,9 @@ void CommKokkos::forward_comm_device(int dummy) k_sendlist.sync(); atomKK->sync(ExecutionSpaceFromDevice::space,X_MASK); - int comm_squash = 1; - if (comm_squash) { - n = avec->pack_comm_self_squash(totalsend,k_sendlist,k_sendnum_scan, + if (comm->nprocs == 1) { + n = avec->pack_comm_self_fused(totalsend,k_sendlist,k_sendnum_scan, k_firstrecv,k_pbc_flag,k_pbc); - DeviceType::fence(); } else { for (int iswap = 0; iswap < nswap; iswap++) { @@ -1045,7 +1043,7 @@ void CommKokkos::borders_device() { atom->map_set(); } - if (1) { + if (comm->nprocs == 1) { if (nswap > k_pbc.extent(0)) { k_pbc = DAT::tdual_int_2d("comm:pbc",nswap,6); k_swap = DAT::tdual_int_2d("comm:swap",3,nswap); From f0e48931e40d833ab964b7abcfb5a08df5f4a3d7 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 7 Mar 2019 10:17:32 -0700 Subject: [PATCH 0208/1242] 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 0209/1242] 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 0210/1242] 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 0211/1242] 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 0212/1242] 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 0213/1242] 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 e422e886de5a719a49c9974b92ce9193bcd1de1e Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 8 Mar 2019 11:33:29 -0700 Subject: [PATCH 0214/1242] Add error check for team on and full neighborlist --- src/KOKKOS/kokkos.cpp | 3 +++ src/KOKKOS/kokkos.h | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/KOKKOS/kokkos.cpp b/src/KOKKOS/kokkos.cpp index 6c87835195..efd3a75042 100644 --- a/src/KOKKOS/kokkos.cpp +++ b/src/KOKKOS/kokkos.cpp @@ -344,6 +344,9 @@ void KokkosLMP::accelerator(int narg, char **arg) force->newton = force->newton_pair = force->newton_bond = newtonflag; + if (team_flag && neighflag != FULL) + error->all(FLERR,"Must use KOKKOS package option 'neigh full' with 'team on'"); + neighbor->binsize_user = binsize; if (binsize <= 0.0) neighbor->binsizeflag = 0; else neighbor->binsizeflag = 1; diff --git a/src/KOKKOS/kokkos.h b/src/KOKKOS/kokkos.h index a665329d70..c70d7a31f5 100644 --- a/src/KOKKOS/kokkos.h +++ b/src/KOKKOS/kokkos.h @@ -86,4 +86,8 @@ U: Must use Kokkos half/thread or full neighbor list with threads or GPUs Using Kokkos half-neighbor lists with threading is not allowed. +E: Must use KOKKOS package option 'neigh full' with 'team on' + +The 'team on' option requires a full neighbor list + */ From 14a00662e6efc8795b82262d48a1b6b9d0605db4 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 11 Mar 2019 13:04:03 -0600 Subject: [PATCH 0215/1242] Commit JT 031119 - first working version of spinmin --- examples/SPIN/read_restart/in.spin.read_data | 2 +- src/SPIN/fix_precession_spin.cpp | 3 + src/SPIN/min_spinmin.cpp | 112 ++++++++++++------- src/SPIN/pair_spin_exchange.cpp | 5 +- 4 files changed, 80 insertions(+), 42 deletions(-) diff --git a/examples/SPIN/read_restart/in.spin.read_data b/examples/SPIN/read_restart/in.spin.read_data index 17343994b5..a450421699 100644 --- a/examples/SPIN/read_restart/in.spin.read_data +++ b/examples/SPIN/read_restart/in.spin.read_data @@ -40,6 +40,6 @@ 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 10 all custom 1 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] +dump 1 all custom 1 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] run 100 diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index d3edb3ae8a..65d5e9120e 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -171,6 +171,9 @@ void FixPrecessionSpin::setup(int vflag) void FixPrecessionSpin::post_force(int /*vflag*/) { + + printf("test inside post force (precession) \n"); + // update mag field with time (potential improvement) if (varflag != CONSTANT) { diff --git a/src/SPIN/min_spinmin.cpp b/src/SPIN/min_spinmin.cpp index 08f91abae7..4b362fda87 100644 --- a/src/SPIN/min_spinmin.cpp +++ b/src/SPIN/min_spinmin.cpp @@ -96,7 +96,7 @@ int MinSpinMin::iterate(int maxiter) bigint ntimestep; //double vmax,vdotf,vdotfall,fdotf,fdotfall,scale; //double dtvone,dtv,dtf,dtfm; - //int flag,flagall; + int flag,flagall; //alpha_final = 0.0; @@ -226,29 +226,44 @@ int MinSpinMin::iterate(int maxiter) // } //} - //eprevious = ecurrent; - //ecurrent = energy_force(0); - //neval++; + 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->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 force tolerance criterion + //// sync across replicas if running multi-replica minimization + + //if (update->fmtol > 0.0) { + // fmdotfm = fmnorm_sqr(); // if (update->multireplica == 0) { - // if (fabs(ecurrent-eprevious) < - // update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) - // return ETOL; + // if (fmdotfm < update->fmtol*update->fmtol) return FTOL; // } else { - // if (fabs(ecurrent-eprevious) < - // update->etol * 0.5*(fabs(ecurrent) + fabs(eprevious) + EPS_ENERGY)) - // flag = 0; + // if (fmdotfm < update->fmtol*update->fmtol) flag = 0; // else flag = 1; - // MPI_Allreduce(&flag,&flagall,1,MPI_INT,MPI_SUM,universe->uworld); - // if (flagall == 0) return ETOL; + // MPI_Allreduce(&fmlag,&fmlagall,1,MPI_INT,MPI_SUM,universe->uworld); + // if (fmlagall == 0) return FTOL; // } //} - + //// force tolerance criterion //// sync across replicas if running multi-replica minimization @@ -266,11 +281,11 @@ int MinSpinMin::iterate(int maxiter) //// output for thermo, dump, restart files - //if (output->next == ntimestep) { - // timer->stamp(); - // output->write(ntimestep); - // timer->stamp(Timer::OUTPUT); - //} + if (output->next == ntimestep) { + timer->stamp(); + output->write(ntimestep); + timer->stamp(Timer::OUTPUT); + } } return MAXITER; @@ -296,6 +311,7 @@ double MinSpinMin::evaluate_dt() fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; fmaxsqone = MAX(fmaxsqone,fmsq); } + //printf("test inside evaluate dt, fmaxsqone = %g \n",fmaxsqone); //for (int i = 0; i < nlocal; i++) // if (mask[i] & groupbit) { // fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; @@ -310,18 +326,21 @@ double MinSpinMin::evaluate_dt() // 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 < fmaxsqloc) - error->all(FLERR,"Incorrect fmaxall calc."); + //if (fmaxsqall < fmaxsqloc) + // error->all(FLERR,"Incorrect fmaxall calc."); // define max timestep // dividing by 10 the inverse of max frequency + //printf("test inside evaluate dt, fmaxsqall = %g \n",fmaxsqall); dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); + //printf("test inside evaluate dt, dtmax = %g \n",dtmax); return dtmax; } @@ -341,7 +360,7 @@ void MinSpinMin::advance_spins(double dts) double tdampx,tdampy,tdampz; double msq,scale,fm2,energy,dts2; double alpha; - double spi[3],fmi[3]; + //double spi[3],fmi[3]; double cp[3],g[3]; //cp[0] = cp[1] = cp[2] = 0.0; @@ -351,6 +370,9 @@ void MinSpinMin::advance_spins(double dts) // fictitious Gilbert damping of 1 alpha = 1.0; + //printf("test inside spinmin, dts %g \n",dts); + //printf("test inside spinmin, fmi i=%d, %g %g %g \n",1,fm[1][0],fm[1][1],fm[1][2]); + // loop on all spins on proc. //if (ireplica != nreplica-1 && ireplica != 0) @@ -358,19 +380,21 @@ void MinSpinMin::advance_spins(double dts) // if (mask[i] & groupbit) { for (int i = 0; i < nlocal; i++) { - spi[0] = sp[i][0]; - spi[1] = sp[i][1]; - spi[2] = sp[i][2]; - - fmi[0] = fm[i][0]; - fmi[1] = fm[i][1]; - fmi[2] = fm[i][2]; + //spi[0] = sp[i][0]; + //spi[1] = sp[i][1]; + //spi[2] = sp[i][2]; + // + //fmi[0] = fm[i][0]; + //fmi[1] = fm[i][1]; + //fmi[2] = fm[i][2]; // calc. damping torque - tdampx = -alpha*(fmi[1]*spi[2] - fmi[2]*spi[1]); - tdampy = -alpha*(fmi[2]*spi[0] - fmi[0]*spi[2]); - tdampz = -alpha*(fmi[0]*spi[1] - fmi[1]*spi[0]); + tdampx = -alpha*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); + tdampy = -alpha*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); + tdampz = -alpha*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + + //printf("for %d, test tdamp: %g %g %g \n",i,tdampx,tdampy,tdampz); // apply advance algorithm (geometric, norm preserving) @@ -381,18 +405,27 @@ void MinSpinMin::advance_spins(double dts) cp[1] = tdampz*sp[i][0]-tdampx*sp[i][2]; cp[2] = tdampx*sp[i][1]-tdampy*sp[i][0]; + //printf("for %d, test cp: %g %g %g \n",i,cp[0],cp[1],cp[2]); + 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] += (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] += (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); - + + //printf("test inside spinmin, spi i=%d, %g %g %g \n",i,sp[i][0],sp[i][1],sp[i][2]); + //printf("test inside spinmin, fmi i=%d, %g %g %g \n",i,fm[i][0],fm[i][1],fm[i][2]); + //printf("for %d, test g: %g %g %g \n",i,g[0],g[1],g[2]); + sp[i][0] = g[0]; sp[i][1] = g[1]; sp[i][2] = g[2]; @@ -422,7 +455,8 @@ void MinSpinMin::advance_spins(double dts) // } - printf("test inside spinmin, dts = %g \n",dts); - printf("test inside spinmin, fmi i=%d, %g %g %g \n",1,fm[1][0],fm[1][1],fm[1][2]); - printf("test inside spinmin, spi i=%d, %g %g %g \n",1,sp[1][0],sp[1][1],sp[1][2]); + //printf("test inside spinmin, dts = %g \n",dts); + //printf("test inside spinmin, fmi i=%d, %g %g %g \n",1,fm[1][0],fm[1][1],fm[1][2]); + //printf("test inside spinmin, spi i=%d, %g %g %g \n",1,sp[1][0],sp[1][1],sp[1][2]); } + diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index ec21fe8838..84e771a2ed 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -161,8 +161,9 @@ void PairSpinExchange::init_style() if (strcmp(modify->fix[ifix]->style,"neb/spin") == 0) break; ifix++; } - if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); + // test remove if test + //if (ifix == modify->nfix) + // error->all(FLERR,"pair/spin style requires nve/spin"); // get the lattice_flag from nve/spin From 5fff18932d446df46a48f284f2df251a360fce38 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 11 Mar 2019 13:23:55 -0600 Subject: [PATCH 0216/1242] Commit 2 JT 031119 - new input files gneb and spinmin --- examples/SPIN/gneb_bfo/Si.sw | 18 - examples/SPIN/gneb_bfo/final.hop1 | 2 - examples/SPIN/gneb_bfo/final.iron_spin_data | 82 -- .../{in.neb.spin_iron => in.gneb.iron} | 0 examples/SPIN/gneb_bfo/in.neb.hop1 | 67 -- examples/SPIN/gneb_bfo/in.neb.spin_iron_min | 42 - examples/SPIN/gneb_bfo/in.spin.bfo | 56 -- examples/SPIN/gneb_bfo/in.spin.dyna_iron | 53 -- examples/SPIN/gneb_bfo/in.spin.iron | 56 -- examples/SPIN/gneb_bfo/in.spin.single_spin | 57 -- examples/SPIN/gneb_bfo/in.spinmin.bfo | 83 ++ examples/SPIN/gneb_bfo/in.spinmin.iron | 71 ++ examples/SPIN/gneb_bfo/in.tad | 110 --- examples/SPIN/gneb_bfo/initial.hop1 | 860 ------------------ 14 files changed, 154 insertions(+), 1403 deletions(-) delete mode 100644 examples/SPIN/gneb_bfo/Si.sw delete mode 100644 examples/SPIN/gneb_bfo/final.hop1 delete mode 100644 examples/SPIN/gneb_bfo/final.iron_spin_data rename examples/SPIN/gneb_bfo/{in.neb.spin_iron => in.gneb.iron} (100%) delete mode 100644 examples/SPIN/gneb_bfo/in.neb.hop1 delete mode 100644 examples/SPIN/gneb_bfo/in.neb.spin_iron_min delete mode 100644 examples/SPIN/gneb_bfo/in.spin.bfo delete mode 100644 examples/SPIN/gneb_bfo/in.spin.dyna_iron delete mode 100644 examples/SPIN/gneb_bfo/in.spin.iron delete mode 100644 examples/SPIN/gneb_bfo/in.spin.single_spin create mode 100644 examples/SPIN/gneb_bfo/in.spinmin.bfo create mode 100644 examples/SPIN/gneb_bfo/in.spinmin.iron delete mode 100644 examples/SPIN/gneb_bfo/in.tad delete mode 100644 examples/SPIN/gneb_bfo/initial.hop1 diff --git a/examples/SPIN/gneb_bfo/Si.sw b/examples/SPIN/gneb_bfo/Si.sw deleted file mode 100644 index db4be100ef..0000000000 --- a/examples/SPIN/gneb_bfo/Si.sw +++ /dev/null @@ -1,18 +0,0 @@ -# DATE: 2007-06-11 CONTRIBUTOR: Aidan Thompson, athomps@sandia.gov CITATION: Stillinger and Weber, Phys Rev B, 31, 5262, (1985) -# Stillinger-Weber parameters for various elements and mixtures -# multiple entries can be added to this file, LAMMPS reads the ones it needs -# these entries are in LAMMPS "metal" units: -# epsilon = eV; sigma = Angstroms -# other quantities are unitless - -# format of a single entry (one or more lines): -# element 1, element 2, element 3, -# epsilon, sigma, a, lambda, gamma, costheta0, A, B, p, q, tol - -# Here are the original parameters in metal units, for Silicon from: -# -# Stillinger and Weber, Phys. Rev. B, v. 31, p. 5262, (1985) -# - -Si Si Si 2.1683 2.0951 1.80 21.0 1.20 -0.333333333333 - 7.049556277 0.6022245584 4.0 0.0 0.0 diff --git a/examples/SPIN/gneb_bfo/final.hop1 b/examples/SPIN/gneb_bfo/final.hop1 deleted file mode 100644 index 338e674a9c..0000000000 --- a/examples/SPIN/gneb_bfo/final.hop1 +++ /dev/null @@ -1,2 +0,0 @@ -1 -412 14.0 20.5 0 diff --git a/examples/SPIN/gneb_bfo/final.iron_spin_data b/examples/SPIN/gneb_bfo/final.iron_spin_data deleted file mode 100644 index b337bac188..0000000000 --- a/examples/SPIN/gneb_bfo/final.iron_spin_data +++ /dev/null @@ -1,82 +0,0 @@ -LAMMPS data file via write_data, version 4 Jan 2019, timestep = 0 - -32 atoms -1 atom types - -0.0000000000000000e+00 1.1465999999999999e+01 xlo xhi -0.0000000000000000e+00 1.1465999999999999e+01 ylo yhi -0.0000000000000000e+00 2.8664999999999998e+00 zlo zhi - -Masses - -1 55.845 - -Atoms # spin - -1 1 2.2000000000000002e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -2 1 2.2000000000000002e+00 1.4332499999999999e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -3 1 2.2000000000000002e+00 2.8664999999999998e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -4 1 2.2000000000000002e+00 4.2997499999999995e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -5 1 2.2000000000000002e+00 5.7329999999999997e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -6 1 2.2000000000000002e+00 7.1662499999999998e+00 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -7 1 2.2000000000000002e+00 8.5994999999999990e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -8 1 2.2000000000000002e+00 1.0032750000000000e+01 1.4332499999999999e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -9 1 2.2000000000000002e+00 0.0000000000000000e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -11 1 2.2000000000000002e+00 2.8664999999999998e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -13 1 2.2000000000000002e+00 5.7329999999999997e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -15 1 2.2000000000000002e+00 8.5994999999999990e+00 2.8664999999999998e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -10 1 2.2000000000000002e+00 1.4332499999999999e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -12 1 2.2000000000000002e+00 4.2997499999999995e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -14 1 2.2000000000000002e+00 7.1662499999999998e+00 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -16 1 2.2000000000000002e+00 1.0032750000000000e+01 4.2997499999999995e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -17 1 2.2000000000000002e+00 0.0000000000000000e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -18 1 2.2000000000000002e+00 1.4332499999999999e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -19 1 2.2000000000000002e+00 2.8664999999999998e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -20 1 2.2000000000000002e+00 4.2997499999999995e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -21 1 2.2000000000000002e+00 5.7329999999999997e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -22 1 2.2000000000000002e+00 7.1662499999999998e+00 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -23 1 2.2000000000000002e+00 8.5994999999999990e+00 5.7329999999999997e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -24 1 2.2000000000000002e+00 1.0032750000000000e+01 7.1662499999999998e+00 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -25 1 2.2000000000000002e+00 0.0000000000000000e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -27 1 2.2000000000000002e+00 2.8664999999999998e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -29 1 2.2000000000000002e+00 5.7329999999999997e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -31 1 2.2000000000000002e+00 8.5994999999999990e+00 8.5994999999999990e+00 0.0000000000000000e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -26 1 2.2000000000000002e+00 1.4332499999999999e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -28 1 2.2000000000000002e+00 4.2997499999999995e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -30 1 2.2000000000000002e+00 7.1662499999999998e+00 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -32 1 2.2000000000000002e+00 1.0032750000000000e+01 1.0032750000000000e+01 1.4332499999999999e+00 -1.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 - -Velocities - -1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/examples/SPIN/gneb_bfo/in.neb.spin_iron b/examples/SPIN/gneb_bfo/in.gneb.iron similarity index 100% rename from examples/SPIN/gneb_bfo/in.neb.spin_iron rename to examples/SPIN/gneb_bfo/in.gneb.iron diff --git a/examples/SPIN/gneb_bfo/in.neb.hop1 b/examples/SPIN/gneb_bfo/in.neb.hop1 deleted file mode 100644 index 6697330faa..0000000000 --- a/examples/SPIN/gneb_bfo/in.neb.hop1 +++ /dev/null @@ -1,67 +0,0 @@ -# 2d NEB surface simulation, hop from surface to become adatom -print "Test 1" - -dimension 2 -boundary p s p - -atom_style atomic -neighbor 0.3 bin -neigh_modify delay 5 -atom_modify map array sort 0 0.0 - -variable u uloop 20 - -# create geometry with flat surface - -lattice hex 0.9 -region box block 0 20 0 10 -0.25 0.25 - -#create_box 3 box -#create_atoms 1 box -#mass * 1.0 -#write_data initial.hop1 - -read_data ../examples/SPIN/gneb_bfo/initial.hop1 - -# LJ potentials - -pair_style lj/cut 2.5 -pair_coeff * * 1.0 1.0 2.5 -pair_modify shift yes - -# initial minimization to relax surface - -minimize 1.0e-6 1.0e-4 1000 10000 -reset_timestep 0 - -# define groups - -region 1 block INF INF INF 1.25 INF INF -group lower region 1 -group mobile subtract all lower -set group lower type 2 - -timestep 0.05 - -# group of NEB atoms - either block or single atom ID 412 - -region surround block 10 18 17 20 0 0 units box -group nebatoms region surround -#group nebatoms id 412 -set group nebatoms type 3 -group nonneb subtract all nebatoms - -fix 1 lower setforce 0.0 0.0 0.0 -fix 2 nebatoms neb 1.0 parallel ideal -fix 3 all enforce2d - -thermo 100 - -#dump 1 nebatoms atom 10 dump.neb.$u -#dump 2 nonneb atom 10 dump.nonneb.$u - -# run NEB for 2000 steps or to force tolerance - -min_style quickmin - -neb 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.hop1 diff --git a/examples/SPIN/gneb_bfo/in.neb.spin_iron_min b/examples/SPIN/gneb_bfo/in.neb.spin_iron_min deleted file mode 100644 index a38a8fbde5..0000000000 --- a/examples/SPIN/gneb_bfo/in.neb.spin_iron_min +++ /dev/null @@ -1,42 +0,0 @@ -# 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 1.0 -#create_box 1 box -#create_atoms 1 box - -read_data ../examples/SPIN/gneb_bfo/initial.iron_spin - -# setting mass, mag. moments, and interactions for bcc iron - -mass 1 55.845 -#set group all spin 2.2 -1.0 0.0 0.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 2 all langevin/spin 0.1 0.0 21 -fix 3 all neb/spin 1.0 -fix 4 all nve/spin lattice no -#parallel ideal - -timestep 0.0001 -thermo 100 - - -min_style spinmin -neb/spin 0.0 0.1 10 10 10 final ../examples/SPIN/gneb_bfo/final.iron_spin -#neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.spin.bfo b/examples/SPIN/gneb_bfo/in.spin.bfo deleted file mode 100644 index e3c88b0f06..0000000000 --- a/examples/SPIN/gneb_bfo/in.spin.bfo +++ /dev/null @@ -1,56 +0,0 @@ -# layer sc iron atoms (in the [001] plane) in bismuth oxide - -clear -units metal -atom_style spin - -dimension 3 -boundary p p f - -# 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 5.0 -create_box 1 box -create_atoms 1 box - -# setting mass, mag. moments, and interactions for bfo - -mass 1 1.0 - -set group all spin/random 11 2.50 - -#pair_style hybrid/overlay spin/exchange 6.0 spin/magelec 4.5 -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/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 anisotropy 0.0000033 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.1 21 -fix 3 all nve/spin lattice no - -timestep 0.0002 - -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_style custom step time v_magnorm v_emag temp etotal -thermo_style custom step time v_magnorm pe ke v_emag temp etotal -thermo 10 - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_bfo.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] - -run 2000 diff --git a/examples/SPIN/gneb_bfo/in.spin.dyna_iron b/examples/SPIN/gneb_bfo/in.spin.dyna_iron deleted file mode 100644 index 918819c816..0000000000 --- a/examples/SPIN/gneb_bfo/in.spin.dyna_iron +++ /dev/null @@ -1,53 +0,0 @@ -# bcc iron in a 3d periodic box - -clear -units metal -atom_style spin - -dimension 3 -boundary f f f - -# 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 1.0 -create_box 1 box -create_atoms 1 box - -#read_data ../examples/SPIN/gneb_bfo/initial.iron_spin - -# setting mass, mag. moments, and interactions for bcc iron - -mass 1 55.845 -set group all spin 2.2 -1.0 0.0 0.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 2 all langevin/spin 300.0 0.01 21 -#fix 3 all neb/spin 1.0 -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 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_style custom step time v_magx v_magnorm v_tmag temp v_emag ke pe etotal -thermo 100 - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -run 10000 diff --git a/examples/SPIN/gneb_bfo/in.spin.iron b/examples/SPIN/gneb_bfo/in.spin.iron deleted file mode 100644 index 0c84845f5f..0000000000 --- a/examples/SPIN/gneb_bfo/in.spin.iron +++ /dev/null @@ -1,56 +0,0 @@ -# bcc iron in a 3d periodic box - -clear -units metal -atom_style spin - -dimension 3 -boundary p p p - -# 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 1.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 2.2 1.0 0.0 0.0 -#velocity all create 100 4928459 rot yes dist gaussian - -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.0 0.0 0.0 1.0 -fix 2 all langevin/spin 0.0 0.0 21 - -fix 3 all nve/spin lattice yes -timestep 0.0001 - -# compute and output options - -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_style custom step time v_magnorm v_tmag temp v_emag ke pe etotal -thermo 50 - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] - -run 0 -write_data initial.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.spin.single_spin b/examples/SPIN/gneb_bfo/in.spin.single_spin deleted file mode 100644 index 3a63c87b8c..0000000000 --- a/examples/SPIN/gneb_bfo/in.spin.single_spin +++ /dev/null @@ -1,57 +0,0 @@ -# bcc iron in a 3d periodic box - -clear -units metal -atom_style spin - -dimension 3 -boundary f f f -#boundary p p p - -# necessary for the serial algorithm (sametag) -atom_modify map array - -lattice sc 2.8665 -region box block 0.0 1.0 0.0 1.0 0.0 1.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 2.2 0.0 0.0 1.0 -#velocity all create 100 4928459 rot yes dist gaussian - -pair_style spin/exchange 3.5 -pair_coeff * * exchange 3.4 0.0 0.2171 1.841 - -neighbor 0.1 bin -neigh_modify every 10 check yes delay 20 - -fix 1 all precession/spin zeeman 0.01 0.0 1.0 0.0 anisotropy 0.005 0.0 0.0 1.0 -fix 2 all langevin/spin 50.0 0.1 21 - -fix 3 all nve/spin lattice no -timestep 0.0001 - -# compute and output options - -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_style custom step time v_magz v_magnorm v_tmag temp v_emag ke pe etotal -thermo 100 - -compute outsp all property/atom spx spy spz sp fmx fmy fmz -dump 100 all custom 1 dump_iron.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] - -run 50000 -write_data final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.spinmin.bfo b/examples/SPIN/gneb_bfo/in.spinmin.bfo new file mode 100644 index 0000000000..c048ac32c6 --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.spinmin.bfo @@ -0,0 +1,83 @@ +# 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 sc 3.96 +region box block 0.0 68.0 0.0 68.0 0.0 1.0 +create_box 1 box +create_atoms 1 box + +#read_data ../examples/SPIN/gneb_bfo/initial.iron_spin + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 1.0 +set group all spin/random 11 2.50 +#set group all spin 2.5 -1.0 0.0 0.0 + +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 2 all langevin/spin 0.1 0.0 21 +fix 3 all nve/spin lattice no +#fix 3 all neb/spin 1.0 +#fix 4 all nve/spin lattice no +#parallel ideal + +timestep 0.0001 +#thermo 10 + +#compute outsp all property/atom spx spy spz sp fmx fmy fmz +#dump 1 all custom 100 dump_bfo.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +#min_style spinmin +#minimize 1.0e-6 1.0e-6 1000 10000 +#minimize 1.0e-6 1.0e-6 10000 10000 +#minimize 1.0e-7 1.0e-7 10000 10000 + +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 200 all custom 1 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] + +#timestep 0.0001 +#run 1 +min_style spinmin +#minimize 1.0e-6 1.0e-6 1000 10000 +#minimize 1.0e-6 1.0e-6 10000 10000 +minimize 1.0e-8 1.0e-8 10000 1000 + +#write_dump all custom dump_bfo.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] + +#compute outsp all property/atom spx spy spz sp fmx fmy fmz +#dump 1 all custom 1 dump_bfo.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] +#thermo 1 + +#neb/spin 0.0 0.1 10 10 10 final ../examples/SPIN/gneb_bfo/final.iron_spin +#neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.spinmin.iron b/examples/SPIN/gneb_bfo/in.spinmin.iron new file mode 100644 index 0000000000..4439960390 --- /dev/null +++ b/examples/SPIN/gneb_bfo/in.spinmin.iron @@ -0,0 +1,71 @@ +# 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 1.0 +create_box 1 box +create_atoms 1 box + +#read_data ../examples/SPIN/gneb_bfo/initial.iron_spin + +# 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 0.0 0.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.001 0.0 0.0 1.0 +fix 2 all langevin/spin 0.1 0.0 21 +fix 3 all nve/spin lattice no +#fix 3 all neb/spin 1.0 +#fix 4 all nve/spin lattice no +#parallel ideal + +timestep 0.0001 + +#min_style spinmin +#minimize 1.0e-6 1.0e-6 1000 10000 +#minimize 1.0e-8 1.0e-6 1000 10000 + +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 1 +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 1 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] + +#timestep 0.0001 +#run 1 + +min_style spinmin +#minimize 1.0e-6 1.0e-6 1000 10000 +minimize 1.0e-8 1.0e-6 1000 10000 + + + +#neb/spin 0.0 0.1 10 10 10 final ../examples/SPIN/gneb_bfo/final.iron_spin +#neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.tad b/examples/SPIN/gneb_bfo/in.tad deleted file mode 100644 index 674fdc8172..0000000000 --- a/examples/SPIN/gneb_bfo/in.tad +++ /dev/null @@ -1,110 +0,0 @@ -# temperature accelerated dynamics model for a single vacancy in bulk Si -# events occur when a neighboring atom diffuses to the vacant site -# run this on multiple partitions as -# mpirun -np 3 lmp_g++ -partition 3x1 -in in.tad - -units metal - -atom_style atomic -atom_modify map array -boundary p p p -atom_modify sort 0 0.0 - -# temperatures -variable tlo equal 1800.0 -variable thi equal 2400.0 - -# coordination number cutoff - -variable r equal 2.835 - -# minimization parameters - -variable etol equal 1.0e-5 -variable ftol equal 1.0e-5 -variable maxiter equal 100 -variable maxeval equal 100 -variable dmax equal 1.0e-1 - -# diamond unit cell - -variable a equal 5.431 -lattice custom $a & - a1 1.0 0.0 0.0 & - a2 0.0 1.0 0.0 & - a3 0.0 0.0 1.0 & - basis 0.0 0.0 0.0 & - basis 0.0 0.5 0.5 & - basis 0.5 0.0 0.5 & - basis 0.5 0.5 0.0 & - basis 0.25 0.25 0.25 & - basis 0.25 0.75 0.75 & - basis 0.75 0.25 0.75 & - basis 0.75 0.75 0.25 - -region myreg block 0 4 & - 0 4 & - 0 4 -create_box 1 myreg -create_atoms 1 region myreg - -mass 1 28.06 - -group Si type 1 - -velocity all create ${thi} 5287286 mom yes rot yes dist gaussian - -# make a vacancy - -group del id 300 -delete_atoms group del - -pair_style sw -pair_coeff * * ../examples/SPIN/gneb_bfo/Si.sw Si - -thermo 10 - -fix 1 all nve -fix 2 all langevin ${thi} ${thi} 0.1 48278 - -timestep 1.0e-3 -neighbor 1.0 bin -neigh_modify every 1 delay 10 check yes - -# equilibrate - -run 1000 - -# Eliminate COM motion -velocity all zero linear - -# only output atoms near vacancy - -compute coord all coord/atom cutoff $r - -#dump events all custom 1 dump.prd id type x y z -#dump_modify events thresh c_coord != 4 - -compute patom all pe/atom -compute pe all reduce sum c_patom -compute satom all stress/atom NULL -compute str all reduce sum c_satom[1] c_satom[2] c_satom[3] -variable press equal (c_str[1]+c_str[2]+c_str[3])/(3*vol) - -thermo_style custom step temp pe c_pe press v_press - -compute event all event/displace 1.0 - -unfix 1 -unfix 2 -fix 1 all nvt temp ${thi} ${thi} 0.1 - -# tad nsteps nevent tlo thi delta_conf tmax compute -# [min etol ftol niter neval] -# [neb etol_neb ftol_neb n1steps n2steps nevery] -# [neb_style min_style] -# [neb_log logfile] - -tad 2000 50 ${tlo} ${thi} 0.05 1.0 event & - min ${etol} ${ftol} ${maxiter} ${maxeval} & - neb 0.0 0.01 200 200 20 neb_style fire neb_log log.neb diff --git a/examples/SPIN/gneb_bfo/initial.hop1 b/examples/SPIN/gneb_bfo/initial.hop1 deleted file mode 100644 index 228708c314..0000000000 --- a/examples/SPIN/gneb_bfo/initial.hop1 +++ /dev/null @@ -1,860 +0,0 @@ -LAMMPS data file via write_data, version 27 Sep 2016, timestep = 0 - -420 atoms -3 atom types - -0.0000000000000000e+00 2.2653923264628304e+01 xlo xhi --1.9618873042551413e-03 1.9620834929855668e+01 ylo yhi --2.8317404080785380e-01 2.8317404080785380e-01 zlo zhi - -Masses - -1 1 -2 1 -3 1 - -Atoms # atomic - -1 1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -2 1 5.6634808161570760e-01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -3 1 1.1326961632314152e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -4 1 1.6990442448471228e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -5 1 2.2653923264628304e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -6 1 2.8317404080785380e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -7 1 3.3980884896942456e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -8 1 3.9644365713099532e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -9 1 4.5307846529256608e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -10 1 5.0971327345413684e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -11 1 5.6634808161570760e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -12 1 6.2298288977727836e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -13 1 6.7961769793884912e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -14 1 7.3625250610041988e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -15 1 7.9288731426199064e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -16 1 8.4952212242356140e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -17 1 9.0615693058513216e+00 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -18 1 9.6279173874670292e+00 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -19 1 1.0194265469082737e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -20 1 1.0760613550698444e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -21 1 1.1326961632314152e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -22 1 1.1893309713929860e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -23 1 1.2459657795545567e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -24 1 1.3026005877161275e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -25 1 1.3592353958776982e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -26 1 1.4158702040392690e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -27 1 1.4725050122008398e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -28 1 1.5291398203624105e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -29 1 1.5857746285239813e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -30 1 1.6424094366855520e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -31 1 1.6990442448471228e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -32 1 1.7556790530086936e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -33 1 1.8123138611702643e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -34 1 1.8689486693318351e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -35 1 1.9255834774934058e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -36 1 1.9822182856549766e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -37 1 2.0388530938165474e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -38 1 2.0954879019781181e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -39 1 2.1521227101396889e+01 0.0000000000000000e+00 0.0000000000000000e+00 0 0 0 -40 1 2.2087575183012596e+01 9.8094365212757073e-01 0.0000000000000000e+00 0 0 0 -41 1 0.0000000000000000e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -42 1 5.6634808161570760e-01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -43 1 1.1326961632314152e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -44 1 1.6990442448471228e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -45 1 2.2653923264628304e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -46 1 2.8317404080785380e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -47 1 3.3980884896942456e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -48 1 3.9644365713099532e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -49 1 4.5307846529256608e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -50 1 5.0971327345413684e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -51 1 5.6634808161570760e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -52 1 6.2298288977727836e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -53 1 6.7961769793884912e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -54 1 7.3625250610041988e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -55 1 7.9288731426199064e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -56 1 8.4952212242356140e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -57 1 9.0615693058513216e+00 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -58 1 9.6279173874670292e+00 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -59 1 1.0194265469082737e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -60 1 1.0760613550698444e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -61 1 1.1326961632314152e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -62 1 1.1893309713929860e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -63 1 1.2459657795545567e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -64 1 1.3026005877161275e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -65 1 1.3592353958776982e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -66 1 1.4158702040392690e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -67 1 1.4725050122008398e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -68 1 1.5291398203624105e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -69 1 1.5857746285239813e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -70 1 1.6424094366855520e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -71 1 1.6990442448471228e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -72 1 1.7556790530086936e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -73 1 1.8123138611702643e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -74 1 1.8689486693318351e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -75 1 1.9255834774934058e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -76 1 1.9822182856549766e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -77 1 2.0388530938165474e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -78 1 2.0954879019781181e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -79 1 2.1521227101396889e+01 1.9618873042551415e+00 0.0000000000000000e+00 0 0 0 -80 1 2.2087575183012596e+01 2.9428309563827124e+00 0.0000000000000000e+00 0 0 0 -81 1 0.0000000000000000e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -82 1 5.6634808161570760e-01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -83 1 1.1326961632314152e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -84 1 1.6990442448471228e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -85 1 2.2653923264628304e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -86 1 2.8317404080785380e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -87 1 3.3980884896942456e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -88 1 3.9644365713099532e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -89 1 4.5307846529256608e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -90 1 5.0971327345413684e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -91 1 5.6634808161570760e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -92 1 6.2298288977727836e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -93 1 6.7961769793884912e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -94 1 7.3625250610041988e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -95 1 7.9288731426199064e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -96 1 8.4952212242356140e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -97 1 9.0615693058513216e+00 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -98 1 9.6279173874670292e+00 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -99 1 1.0194265469082737e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -100 1 1.0760613550698444e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -101 1 1.1326961632314152e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -102 1 1.1893309713929860e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -103 1 1.2459657795545567e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -104 1 1.3026005877161275e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -105 1 1.3592353958776982e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -106 1 1.4158702040392690e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -107 1 1.4725050122008398e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -108 1 1.5291398203624105e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -109 1 1.5857746285239813e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -110 1 1.6424094366855520e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -111 1 1.6990442448471228e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -112 1 1.7556790530086936e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -113 1 1.8123138611702643e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -114 1 1.8689486693318351e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -115 1 1.9255834774934058e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -116 1 1.9822182856549766e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -117 1 2.0388530938165474e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -118 1 2.0954879019781181e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -119 1 2.1521227101396889e+01 3.9237746085102829e+00 0.0000000000000000e+00 0 0 0 -120 1 2.2087575183012596e+01 4.9047182606378534e+00 0.0000000000000000e+00 0 0 0 -121 1 0.0000000000000000e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -122 1 5.6634808161570760e-01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -123 1 1.1326961632314152e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -124 1 1.6990442448471228e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -125 1 2.2653923264628304e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -126 1 2.8317404080785380e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -127 1 3.3980884896942456e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -128 1 3.9644365713099532e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -129 1 4.5307846529256608e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -130 1 5.0971327345413684e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -131 1 5.6634808161570760e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -132 1 6.2298288977727836e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -133 1 6.7961769793884912e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -134 1 7.3625250610041988e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -135 1 7.9288731426199064e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -136 1 8.4952212242356140e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -137 1 9.0615693058513216e+00 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -138 1 9.6279173874670292e+00 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -139 1 1.0194265469082737e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -140 1 1.0760613550698444e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -141 1 1.1326961632314152e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -142 1 1.1893309713929860e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -143 1 1.2459657795545567e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -144 1 1.3026005877161275e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -145 1 1.3592353958776982e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -146 1 1.4158702040392690e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -147 1 1.4725050122008398e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -148 1 1.5291398203624105e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -149 1 1.5857746285239813e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -150 1 1.6424094366855520e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -151 1 1.6990442448471228e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -152 1 1.7556790530086936e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -153 1 1.8123138611702643e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -154 1 1.8689486693318351e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -155 1 1.9255834774934058e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -156 1 1.9822182856549766e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -157 1 2.0388530938165474e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -158 1 2.0954879019781181e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -159 1 2.1521227101396889e+01 5.8856619127654248e+00 0.0000000000000000e+00 0 0 0 -160 1 2.2087575183012596e+01 6.8666055648929953e+00 0.0000000000000000e+00 0 0 0 -161 1 0.0000000000000000e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -162 1 5.6634808161570760e-01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -163 1 1.1326961632314152e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -164 1 1.6990442448471228e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -165 1 2.2653923264628304e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -166 1 2.8317404080785380e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -167 1 3.3980884896942456e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -168 1 3.9644365713099532e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -169 1 4.5307846529256608e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -170 1 5.0971327345413684e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -171 1 5.6634808161570760e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -172 1 6.2298288977727836e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -173 1 6.7961769793884912e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -174 1 7.3625250610041988e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -175 1 7.9288731426199064e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -176 1 8.4952212242356140e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -177 1 9.0615693058513216e+00 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -178 1 9.6279173874670292e+00 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -179 1 1.0194265469082737e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -180 1 1.0760613550698444e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -181 1 1.1326961632314152e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -182 1 1.1893309713929860e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -183 1 1.2459657795545567e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -184 1 1.3026005877161275e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -185 1 1.3592353958776982e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -186 1 1.4158702040392690e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -187 1 1.4725050122008398e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -188 1 1.5291398203624105e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -189 1 1.5857746285239813e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -190 1 1.6424094366855520e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -191 1 1.6990442448471228e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -192 1 1.7556790530086936e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -193 1 1.8123138611702643e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -194 1 1.8689486693318351e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -195 1 1.9255834774934058e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -196 1 1.9822182856549766e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -197 1 2.0388530938165474e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -198 1 2.0954879019781181e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -199 1 2.1521227101396889e+01 7.8475492170205658e+00 0.0000000000000000e+00 0 0 0 -200 1 2.2087575183012596e+01 8.8284928691481355e+00 0.0000000000000000e+00 0 0 0 -201 1 0.0000000000000000e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -202 1 5.6634808161570760e-01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -203 1 1.1326961632314152e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -204 1 1.6990442448471228e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -205 1 2.2653923264628304e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -206 1 2.8317404080785380e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -207 1 3.3980884896942456e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -208 1 3.9644365713099532e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -209 1 4.5307846529256608e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -210 1 5.0971327345413684e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -211 1 5.6634808161570760e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -212 1 6.2298288977727836e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -213 1 6.7961769793884912e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -214 1 7.3625250610041988e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -215 1 7.9288731426199064e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -216 1 8.4952212242356140e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -217 1 9.0615693058513216e+00 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -218 1 9.6279173874670292e+00 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -219 1 1.0194265469082737e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -220 1 1.0760613550698444e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -221 1 1.1326961632314152e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -222 1 1.1893309713929860e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -223 1 1.2459657795545567e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -224 1 1.3026005877161275e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -225 1 1.3592353958776982e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -226 1 1.4158702040392690e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -227 1 1.4725050122008398e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -228 1 1.5291398203624105e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -229 1 1.5857746285239813e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -230 1 1.6424094366855520e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -231 1 1.6990442448471228e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -232 1 1.7556790530086936e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -233 1 1.8123138611702643e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -234 1 1.8689486693318351e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -235 1 1.9255834774934058e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -236 1 1.9822182856549766e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -237 1 2.0388530938165474e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -238 1 2.0954879019781181e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -239 1 2.1521227101396889e+01 9.8094365212757069e+00 0.0000000000000000e+00 0 0 0 -240 1 2.2087575183012596e+01 1.0790380173403278e+01 0.0000000000000000e+00 0 0 0 -241 1 0.0000000000000000e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -242 1 5.6634808161570760e-01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -243 1 1.1326961632314152e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -244 1 1.6990442448471228e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -245 1 2.2653923264628304e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -246 1 2.8317404080785380e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -247 1 3.3980884896942456e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -248 1 3.9644365713099532e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -249 1 4.5307846529256608e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -250 1 5.0971327345413684e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -251 1 5.6634808161570760e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -252 1 6.2298288977727836e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -253 1 6.7961769793884912e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -254 1 7.3625250610041988e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -255 1 7.9288731426199064e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -256 1 8.4952212242356140e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -257 1 9.0615693058513216e+00 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -258 1 9.6279173874670292e+00 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -259 1 1.0194265469082737e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -260 1 1.0760613550698444e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -261 1 1.1326961632314152e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -262 1 1.1893309713929860e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -263 1 1.2459657795545567e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -264 1 1.3026005877161275e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -265 1 1.3592353958776982e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -266 1 1.4158702040392690e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -267 1 1.4725050122008398e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -268 1 1.5291398203624105e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -269 1 1.5857746285239813e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -270 1 1.6424094366855520e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -271 1 1.6990442448471228e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -272 1 1.7556790530086936e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -273 1 1.8123138611702643e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -274 1 1.8689486693318351e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -275 1 1.9255834774934058e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -276 1 1.9822182856549766e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -277 1 2.0388530938165474e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -278 1 2.0954879019781181e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -279 1 2.1521227101396889e+01 1.1771323825530850e+01 0.0000000000000000e+00 0 0 0 -280 1 2.2087575183012596e+01 1.2752267477658419e+01 0.0000000000000000e+00 0 0 0 -281 1 0.0000000000000000e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -282 1 5.6634808161570760e-01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -283 1 1.1326961632314152e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -284 1 1.6990442448471228e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -285 1 2.2653923264628304e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -286 1 2.8317404080785380e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -287 1 3.3980884896942456e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -288 1 3.9644365713099532e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -289 1 4.5307846529256608e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -290 1 5.0971327345413684e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -291 1 5.6634808161570760e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -292 1 6.2298288977727836e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -293 1 6.7961769793884912e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -294 1 7.3625250610041988e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -295 1 7.9288731426199064e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -296 1 8.4952212242356140e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -297 1 9.0615693058513216e+00 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -298 1 9.6279173874670292e+00 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -299 1 1.0194265469082737e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -300 1 1.0760613550698444e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -301 1 1.1326961632314152e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -302 1 1.1893309713929860e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -303 1 1.2459657795545567e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -304 1 1.3026005877161275e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -305 1 1.3592353958776982e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -306 1 1.4158702040392690e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -307 1 1.4725050122008398e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -308 1 1.5291398203624105e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -309 1 1.5857746285239813e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -310 1 1.6424094366855520e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -311 1 1.6990442448471228e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -312 1 1.7556790530086936e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -313 1 1.8123138611702643e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -314 1 1.8689486693318351e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -315 1 1.9255834774934058e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -316 1 1.9822182856549766e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -317 1 2.0388530938165474e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -318 1 2.0954879019781181e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -319 1 2.1521227101396889e+01 1.3733211129785991e+01 0.0000000000000000e+00 0 0 0 -320 1 2.2087575183012596e+01 1.4714154781913560e+01 0.0000000000000000e+00 0 0 0 -321 1 0.0000000000000000e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -322 1 5.6634808161570760e-01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -323 1 1.1326961632314152e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -324 1 1.6990442448471228e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -325 1 2.2653923264628304e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -326 1 2.8317404080785380e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -327 1 3.3980884896942456e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -328 1 3.9644365713099532e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -329 1 4.5307846529256608e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -330 1 5.0971327345413684e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -331 1 5.6634808161570760e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -332 1 6.2298288977727836e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -333 1 6.7961769793884912e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -334 1 7.3625250610041988e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -335 1 7.9288731426199064e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -336 1 8.4952212242356140e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -337 1 9.0615693058513216e+00 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -338 1 9.6279173874670292e+00 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -339 1 1.0194265469082737e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -340 1 1.0760613550698444e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -341 1 1.1326961632314152e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -342 1 1.1893309713929860e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -343 1 1.2459657795545567e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -344 1 1.3026005877161275e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -345 1 1.3592353958776982e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -346 1 1.4158702040392690e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -347 1 1.4725050122008398e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -348 1 1.5291398203624105e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -349 1 1.5857746285239813e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -350 1 1.6424094366855520e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -351 1 1.6990442448471228e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -352 1 1.7556790530086936e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -353 1 1.8123138611702643e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -354 1 1.8689486693318351e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -355 1 1.9255834774934058e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -356 1 1.9822182856549766e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -357 1 2.0388530938165474e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -358 1 2.0954879019781181e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -359 1 2.1521227101396889e+01 1.5695098434041132e+01 0.0000000000000000e+00 0 0 0 -360 1 2.2087575183012596e+01 1.6676042086168703e+01 0.0000000000000000e+00 0 0 0 -361 1 0.0000000000000000e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -362 1 5.6634808161570760e-01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -363 1 1.1326961632314152e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -364 1 1.6990442448471228e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -365 1 2.2653923264628304e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -366 1 2.8317404080785380e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -367 1 3.3980884896942456e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -368 1 3.9644365713099532e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -369 1 4.5307846529256608e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -370 1 5.0971327345413684e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -371 1 5.6634808161570760e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -372 1 6.2298288977727836e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -373 1 6.7961769793884912e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -374 1 7.3625250610041988e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -375 1 7.9288731426199064e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -376 1 8.4952212242356140e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -377 1 9.0615693058513216e+00 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -378 1 9.6279173874670292e+00 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -379 1 1.0194265469082737e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -380 1 1.0760613550698444e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -381 1 1.1326961632314152e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -382 1 1.1893309713929860e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -383 1 1.2459657795545567e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -384 1 1.3026005877161275e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -385 1 1.3592353958776982e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -386 1 1.4158702040392690e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -387 1 1.4725050122008398e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -388 1 1.5291398203624105e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -389 1 1.5857746285239813e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -390 1 1.6424094366855520e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -391 1 1.6990442448471228e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -392 1 1.7556790530086936e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -393 1 1.8123138611702643e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -394 1 1.8689486693318351e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -395 1 1.9255834774934058e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -396 1 1.9822182856549766e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -397 1 2.0388530938165474e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -398 1 2.0954879019781181e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -399 1 2.1521227101396889e+01 1.7656985738296271e+01 0.0000000000000000e+00 0 0 0 -400 1 2.2087575183012596e+01 1.8637929390423842e+01 0.0000000000000000e+00 0 0 0 -401 1 0.0000000000000000e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -402 1 1.1326961632314152e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -403 1 2.2653923264628304e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -404 1 3.3980884896942456e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -405 1 4.5307846529256608e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -406 1 5.6634808161570760e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -407 1 6.7961769793884912e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -408 1 7.9288731426199064e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -409 1 9.0615693058513216e+00 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -410 1 1.0194265469082737e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -411 1 1.1326961632314152e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -412 1 1.2459657795545567e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -413 1 1.3592353958776982e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -414 1 1.4725050122008398e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -415 1 1.5857746285239813e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -416 1 1.6990442448471228e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -417 1 1.8123138611702643e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -418 1 1.9255834774934058e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -419 1 2.0388530938165474e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 -420 1 2.1521227101396889e+01 1.9618873042551414e+01 0.0000000000000000e+00 0 0 0 - -Velocities - -1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -50 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -54 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -56 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -64 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -65 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -66 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -67 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -68 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -69 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -70 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -71 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -72 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -73 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -74 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -75 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -76 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -77 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -78 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -79 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -80 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -81 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -82 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -83 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -84 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -85 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -86 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -87 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -88 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -89 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -90 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -91 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -92 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -93 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -94 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -95 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -96 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -97 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -98 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -99 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -100 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -101 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -102 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -103 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -104 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -105 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -106 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -107 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -108 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -109 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -110 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -111 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -112 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -113 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -114 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -115 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -116 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -117 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -118 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -119 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -120 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -121 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -122 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -123 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -124 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -125 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -126 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -127 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -128 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -129 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -130 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -131 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -132 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -133 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -134 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -135 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -136 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -137 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -138 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -139 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -140 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -141 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -142 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -143 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -144 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -145 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -146 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -147 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -148 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -149 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -150 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -151 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -152 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -153 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -154 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -155 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -156 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -157 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -158 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -159 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -160 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -161 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -162 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -163 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -164 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -165 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -166 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -167 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -168 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -169 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -170 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -171 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -172 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -173 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -174 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -175 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -176 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -177 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -178 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -179 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -180 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -181 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -182 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -183 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -184 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -185 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -186 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -187 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -188 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -189 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -190 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -191 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -192 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -193 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -194 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -195 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -196 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -197 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -198 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -199 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -200 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -201 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -202 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -203 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -204 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -205 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -206 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -207 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -208 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -209 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -210 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -211 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -212 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -213 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -214 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -215 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -216 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -217 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -218 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -219 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -220 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -221 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -222 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -223 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -224 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -225 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -226 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -227 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -228 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -229 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -230 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -231 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -232 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -233 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -234 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -235 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -236 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -237 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -238 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -239 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -240 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -241 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -242 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -243 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -244 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -245 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -246 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -247 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -248 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -249 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -250 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -251 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -252 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -253 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -254 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -255 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -256 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -257 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -258 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -259 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -260 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -261 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -262 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -263 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -264 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -265 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -266 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -267 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -268 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -269 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -270 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -271 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -272 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -273 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -274 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -275 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -276 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -277 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -278 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -279 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -280 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -281 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -282 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -283 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -284 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -285 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -286 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -287 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -288 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -289 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -290 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -291 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -292 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -293 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -294 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -295 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -296 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -297 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -298 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -299 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -300 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -301 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -302 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -303 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -304 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -305 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -306 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -307 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -308 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -309 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -310 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -311 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -312 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -313 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -314 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -315 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -316 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -317 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -318 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -319 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -320 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -321 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -322 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -323 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -324 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -325 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -326 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -327 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -328 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -329 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -330 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -331 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -332 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -333 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -334 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -335 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -336 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -337 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -338 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -339 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -340 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -341 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -342 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -343 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -344 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -345 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -346 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -347 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -348 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -349 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -350 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -351 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -352 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -353 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -354 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -355 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -356 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -357 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -358 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -359 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -360 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -361 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -362 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -363 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -364 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -365 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -366 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -367 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -368 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -369 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -370 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -371 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -372 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -373 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -374 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -375 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -376 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -377 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -378 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -379 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -380 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -381 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -382 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -383 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -384 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -385 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -386 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -387 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -388 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -389 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -390 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -391 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -392 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -393 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -394 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -395 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -396 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -397 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -398 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -399 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -400 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -401 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -402 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -403 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -404 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -405 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -406 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -407 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -408 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -409 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -410 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -411 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -412 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -413 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -414 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -415 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -416 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -417 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -418 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -419 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -420 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 From aecef752e8beee76465feb03c05276235dd41952 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 11 Mar 2019 13:41:20 -0600 Subject: [PATCH 0217/1242] Remove unnecessary data movement in fix_nve_kokkos --- src/KOKKOS/fix_nve_kokkos.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/fix_nve_kokkos.cpp b/src/KOKKOS/fix_nve_kokkos.cpp index 052bf411d6..6db8ff8c0f 100644 --- a/src/KOKKOS/fix_nve_kokkos.cpp +++ b/src/KOKKOS/fix_nve_kokkos.cpp @@ -113,8 +113,8 @@ void FixNVEKokkos::initial_integrate_rmass_item(int i) const template void FixNVEKokkos::final_integrate() { - atomKK->sync(execution_space,datamask_read); - atomKK->modified(execution_space,datamask_modify); + atomKK->sync(execution_space,V_MASK | F_MASK | MASK_MASK | RMASS_MASK | TYPE_MASK); + atomKK->modified(execution_space,V_MASK); v = atomKK->k_v.view(); f = atomKK->k_f.view(); From e0c935b52d9d0384cfa397b13b48e66acf02f721 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Mon, 11 Mar 2019 14:28:18 -0600 Subject: [PATCH 0218/1242] 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 cc2b5fbb80d1087fbb4fe272f48cc08ef3c24967 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 11 Mar 2019 17:37:44 -0600 Subject: [PATCH 0219/1242] Commit JT 031119 - add min_post_force in precession --- examples/SPIN/gneb_bfo/in.gneb.iron | 1 - examples/SPIN/gneb_bfo/in.spinmin.bfo | 30 ++---------------- examples/SPIN/gneb_bfo/in.spinmin.iron | 21 ++---------- src/SPIN/fix_precession_spin.cpp | 8 +++++ src/SPIN/fix_precession_spin.h | 5 +-- src/SPIN/min_spinmin.cpp | 44 ++------------------------ src/SPIN/min_spinmin.h | 5 ++- 7 files changed, 19 insertions(+), 95 deletions(-) diff --git a/examples/SPIN/gneb_bfo/in.gneb.iron b/examples/SPIN/gneb_bfo/in.gneb.iron index 860db24a61..80ab698c16 100644 --- a/examples/SPIN/gneb_bfo/in.gneb.iron +++ b/examples/SPIN/gneb_bfo/in.gneb.iron @@ -1,5 +1,4 @@ # bcc iron in a 3d periodic box -print "Test 1" units metal dimension 3 diff --git a/examples/SPIN/gneb_bfo/in.spinmin.bfo b/examples/SPIN/gneb_bfo/in.spinmin.bfo index c048ac32c6..15a4d6e0f9 100644 --- a/examples/SPIN/gneb_bfo/in.spinmin.bfo +++ b/examples/SPIN/gneb_bfo/in.spinmin.bfo @@ -13,8 +13,6 @@ region box block 0.0 68.0 0.0 68.0 0.0 1.0 create_box 1 box create_atoms 1 box -#read_data ../examples/SPIN/gneb_bfo/initial.iron_spin - # setting mass, mag. moments, and interactions for bcc iron mass 1 1.0 @@ -34,20 +32,8 @@ neigh_modify every 10 check yes delay 20 fix 1 all precession/spin anisotropy 0.0000033 0.0 0.0 1.0 fix 2 all langevin/spin 0.1 0.0 21 fix 3 all nve/spin lattice no -#fix 3 all neb/spin 1.0 -#fix 4 all nve/spin lattice no -#parallel ideal timestep 0.0001 -#thermo 10 - -#compute outsp all property/atom spx spy spz sp fmx fmy fmz -#dump 1 all custom 100 dump_bfo.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] - -#min_style spinmin -#minimize 1.0e-6 1.0e-6 1000 10000 -#minimize 1.0e-6 1.0e-6 10000 10000 -#minimize 1.0e-7 1.0e-7 10000 10000 compute out_mag all spin compute out_pe all pe @@ -66,18 +52,6 @@ thermo_modify format float %20.15g compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 200 all custom 1 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] -#timestep 0.0001 -#run 1 min_style spinmin -#minimize 1.0e-6 1.0e-6 1000 10000 -#minimize 1.0e-6 1.0e-6 10000 10000 -minimize 1.0e-8 1.0e-8 10000 1000 - -#write_dump all custom dump_bfo.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] - -#compute outsp all property/atom spx spy spz sp fmx fmy fmz -#dump 1 all custom 1 dump_bfo.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] -#thermo 1 - -#neb/spin 0.0 0.1 10 10 10 final ../examples/SPIN/gneb_bfo/final.iron_spin -#neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin +minimize 1.0e-6 1.0e-6 10000 10000 +#minimize 1.0e-8 1.0e-8 10000 1000 diff --git a/examples/SPIN/gneb_bfo/in.spinmin.iron b/examples/SPIN/gneb_bfo/in.spinmin.iron index 4439960390..67d8095c06 100644 --- a/examples/SPIN/gneb_bfo/in.spinmin.iron +++ b/examples/SPIN/gneb_bfo/in.spinmin.iron @@ -13,8 +13,6 @@ region box block 0.0 4.0 0.0 4.0 0.0 1.0 create_box 1 box create_atoms 1 box -#read_data ../examples/SPIN/gneb_bfo/initial.iron_spin - # setting mass, mag. moments, and interactions for bcc iron mass 1 55.845 @@ -31,16 +29,9 @@ neigh_modify every 10 check yes delay 20 fix 1 all precession/spin anisotropy 0.001 0.0 0.0 1.0 fix 2 all langevin/spin 0.1 0.0 21 fix 3 all nve/spin lattice no -#fix 3 all neb/spin 1.0 -#fix 4 all nve/spin lattice no -#parallel ideal timestep 0.0001 -#min_style spinmin -#minimize 1.0e-6 1.0e-6 1000 10000 -#minimize 1.0e-8 1.0e-6 1000 10000 - compute out_mag all spin compute out_pe all pe compute out_ke all ke @@ -58,14 +49,6 @@ thermo_modify format float %20.15g compute outsp all property/atom spx spy spz sp fmx fmy fmz dump 1 all custom 1 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] -#timestep 0.0001 -#run 1 - min_style spinmin -#minimize 1.0e-6 1.0e-6 1000 10000 -minimize 1.0e-8 1.0e-6 1000 10000 - - - -#neb/spin 0.0 0.1 10 10 10 final ../examples/SPIN/gneb_bfo/final.iron_spin -#neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin +minimize 1.0e-6 1.0e-6 1000 10000 +#minimize 1.0e-8 1.0e-6 1000 10000 diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index 65d5e9120e..08e4fd5a63 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; @@ -283,3 +284,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; diff --git a/src/SPIN/min_spinmin.cpp b/src/SPIN/min_spinmin.cpp index 4b362fda87..2e03086bf0 100644 --- a/src/SPIN/min_spinmin.cpp +++ b/src/SPIN/min_spinmin.cpp @@ -88,7 +88,7 @@ void MinSpinMin::reset_vectors() } /* ---------------------------------------------------------------------- - minimization via QuickMin damped dynamics + minimization via damped spin dynamics ------------------------------------------------------------------------- */ int MinSpinMin::iterate(int maxiter) @@ -98,16 +98,6 @@ int MinSpinMin::iterate(int maxiter) //double dtvone,dtv,dtf,dtfm; int flag,flagall; - //alpha_final = 0.0; - - // search for and allocate neb_spin fix - - //int ineb; - //for (ineb = 0; ineb < modify->nfix; ineb++) - // if (strcmp(modify->fix[ineb]->style,"neb/spin") == 0) break; - //if (ineb == modify->nfix) error->all(FLERR,"spinmin requires use of fix neb/spin"); - //fneb = (FixNEB_spin *) modify->fix[ineb]; - for (int iter = 0; iter < maxiter; iter++) { if (timer->check_timeout(niter)) @@ -118,12 +108,10 @@ int MinSpinMin::iterate(int maxiter) // optimize timestep accross processes / replicas - //dts = fneb->evaluate_dt(); dts = evaluate_dt(); // apply damped precessional dynamics to the spins - //fneb->advance_spins(dts); advance_spins(dts); @@ -351,8 +339,6 @@ double MinSpinMin::evaluate_dt() void MinSpinMin::advance_spins(double dts) { - //int j=0; - //int *sametag = atom->sametag; int nlocal = atom->nlocal; int *mask = atom->mask; double **sp = atom->sp; @@ -360,18 +346,14 @@ void MinSpinMin::advance_spins(double dts) double tdampx,tdampy,tdampz; double msq,scale,fm2,energy,dts2; double alpha; - //double spi[3],fmi[3]; double cp[3],g[3]; - //cp[0] = cp[1] = cp[2] = 0.0; - //g[0] = g[1] = g[2] = 0.0; dts2 = dts*dts; // fictitious Gilbert damping of 1 + alpha = 1.0; - //printf("test inside spinmin, dts %g \n",dts); - //printf("test inside spinmin, fmi i=%d, %g %g %g \n",1,fm[1][0],fm[1][1],fm[1][2]); // loop on all spins on proc. @@ -379,14 +361,6 @@ void MinSpinMin::advance_spins(double dts) // for (int i = 0; i < nlocal; i++) // if (mask[i] & groupbit) { for (int i = 0; i < nlocal; i++) { - - //spi[0] = sp[i][0]; - //spi[1] = sp[i][1]; - //spi[2] = sp[i][2]; - // - //fmi[0] = fm[i][0]; - //fmi[1] = fm[i][1]; - //fmi[2] = fm[i][2]; // calc. damping torque @@ -394,8 +368,6 @@ void MinSpinMin::advance_spins(double dts) tdampy = -alpha*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); tdampz = -alpha*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); - //printf("for %d, test tdamp: %g %g %g \n",i,tdampx,tdampy,tdampz); - // apply advance algorithm (geometric, norm preserving) fm2 = (tdampx*tdampx+tdampy*tdampy+tdampz*tdampz); @@ -405,15 +377,10 @@ void MinSpinMin::advance_spins(double dts) cp[1] = tdampz*sp[i][0]-tdampx*sp[i][2]; cp[2] = tdampx*sp[i][1]-tdampy*sp[i][0]; - //printf("for %d, test cp: %g %g %g \n",i,cp[0],cp[1],cp[2]); - 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] += (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; @@ -421,10 +388,6 @@ void MinSpinMin::advance_spins(double dts) g[0] /= (1+0.25*fm2*dts2); g[1] /= (1+0.25*fm2*dts2); g[2] /= (1+0.25*fm2*dts2); - - //printf("test inside spinmin, spi i=%d, %g %g %g \n",i,sp[i][0],sp[i][1],sp[i][2]); - //printf("test inside spinmin, fmi i=%d, %g %g %g \n",i,fm[i][0],fm[i][1],fm[i][2]); - //printf("for %d, test g: %g %g %g \n",i,g[0],g[1],g[2]); sp[i][0] = g[0]; sp[i][1] = g[1]; @@ -455,8 +418,5 @@ void MinSpinMin::advance_spins(double dts) // } - //printf("test inside spinmin, dts = %g \n",dts); - //printf("test inside spinmin, fmi i=%d, %g %g %g \n",1,fm[1][0],fm[1][1],fm[1][2]); - //printf("test inside spinmin, spi i=%d, %g %g %g \n",1,sp[1][0],sp[1][1],sp[1][2]); } diff --git a/src/SPIN/min_spinmin.h b/src/SPIN/min_spinmin.h index fe2cf7c51d..943b2d2749 100644 --- a/src/SPIN/min_spinmin.h +++ b/src/SPIN/min_spinmin.h @@ -39,14 +39,13 @@ class MinSpinMin : public Min { private: - // spin timestep + // global and spin timesteps + double dt; double dts; double *spvec; // variables for atomic dof, as 1d vector double *fmvec; // variables for atomic dof, as 1d vector - - double dt; bigint last_negative; }; From 3a4bb6f9802b33d29fa510af7e90f3f0907a63cd Mon Sep 17 00:00:00 2001 From: mkanski Date: Tue, 12 Mar 2019 20:19:56 +0100 Subject: [PATCH 0220/1242] All errors and warning are now printed through LAMMPS --- src/USER-REAXC/pair_reaxc.cpp | 28 +- src/USER-REAXC/reaxc_allocate.cpp | 326 ++++++++++++------------ src/USER-REAXC/reaxc_allocate.h | 8 +- src/USER-REAXC/reaxc_bond_orders.cpp | 3 +- src/USER-REAXC/reaxc_bond_orders.h | 2 +- src/USER-REAXC/reaxc_bonds.cpp | 2 +- src/USER-REAXC/reaxc_bonds.h | 2 +- src/USER-REAXC/reaxc_control.cpp | 12 +- src/USER-REAXC/reaxc_control.h | 5 +- src/USER-REAXC/reaxc_ffield.cpp | 149 +++++------ src/USER-REAXC/reaxc_ffield.h | 2 +- src/USER-REAXC/reaxc_forces.cpp | 23 +- src/USER-REAXC/reaxc_hydrogen_bonds.cpp | 2 +- src/USER-REAXC/reaxc_hydrogen_bonds.h | 2 +- src/USER-REAXC/reaxc_init_md.cpp | 94 ++++--- src/USER-REAXC/reaxc_io_tools.cpp | 8 +- src/USER-REAXC/reaxc_io_tools.h | 4 +- src/USER-REAXC/reaxc_list.cpp | 68 ++--- src/USER-REAXC/reaxc_list.h | 4 +- src/USER-REAXC/reaxc_lookup.cpp | 102 ++++---- src/USER-REAXC/reaxc_lookup.h | 8 +- src/USER-REAXC/reaxc_multi_body.cpp | 2 +- src/USER-REAXC/reaxc_multi_body.h | 2 +- src/USER-REAXC/reaxc_reset_tools.cpp | 16 +- src/USER-REAXC/reaxc_tool_box.cpp | 44 ++-- src/USER-REAXC/reaxc_tool_box.h | 6 +- src/USER-REAXC/reaxc_torsion_angles.cpp | 3 +- src/USER-REAXC/reaxc_torsion_angles.h | 3 +- src/USER-REAXC/reaxc_traj.cpp | 56 ++-- src/USER-REAXC/reaxc_traj.h | 4 +- src/USER-REAXC/reaxc_types.h | 7 +- src/USER-REAXC/reaxc_valence_angles.cpp | 9 +- src/USER-REAXC/reaxc_valence_angles.h | 2 +- 33 files changed, 506 insertions(+), 502 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 0f4b3a5b3d..24612a3a40 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -137,15 +137,15 @@ PairReaxC::~PairReaxC() // deallocate reax data-structures - if (control->tabulate ) Deallocate_Lookup_Tables( system); + if (control->tabulate ) Deallocate_Lookup_Tables( lmp, system); - if (control->hbond_cut > 0 ) Delete_List( lists+HBONDS, world); - Delete_List( lists+BONDS, world ); - Delete_List( lists+THREE_BODIES, world ); - Delete_List( lists+FAR_NBRS, world ); + if (control->hbond_cut > 0 ) Delete_List( lmp, lists+HBONDS, world); + Delete_List( lmp, lists+BONDS, world ); + Delete_List( lmp, lists+THREE_BODIES, world ); + Delete_List( lmp, lists+FAR_NBRS, world ); - DeAllocate_Workspace( control, workspace ); - DeAllocate_System( system ); + DeAllocate_Workspace( lmp, control, workspace ); + DeAllocate_System( lmp, system ); } memory->destroy( system ); @@ -223,7 +223,7 @@ void PairReaxC::settings(int narg, char **arg) out_control->atom_info = 0; out_control->bond_info = 0; out_control->angle_info = 0; - } else Read_Control_File(arg[0], control, out_control); + } else Read_Control_File(lmp, arg[0], control, out_control); // default values @@ -298,7 +298,7 @@ void PairReaxC::coeff( int nargs, char **args ) FILE *fp; fp = force->open_potential(file); if (fp != NULL) - Read_Force_Field(fp, &(system->reax_param), control); + Read_Force_Field(lmp, fp, &(system->reax_param), control); else { char str[128]; snprintf(str,128,"Cannot open ReaxFF potential file %s",file); @@ -394,7 +394,7 @@ void PairReaxC::init_style( ) "increased neighbor list skin."); for( int i = 0; i < LIST_N; ++i ) - if (lists[i].allacated != 1) + if (lists[i].allocated != 1) lists[i].allocated = 0; if (fix_reax == NULL) { @@ -437,13 +437,13 @@ void PairReaxC::setup( ) // initialize my data structures - PreAllocate_Space( system, control, workspace, world ); + PreAllocate_Space( lmp, system, control, workspace, world ); write_reax_atoms(); int num_nbrs = estimate_reax_lists(); - if(!Make_List(system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, + if(!Make_List(lmp, system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, lists+FAR_NBRS, world)) - error->all(FLERR,"Pair reax/c problem in far neighbor list"); + error->one(FLERR,"Pair reax/c problem in far neighbor list"); write_reax_lists(); Initialize( lmp, system, control, data, workspace, &lists, out_control, @@ -582,7 +582,7 @@ void PairReaxC::compute(int eflag, int vflag) data->step = update->ntimestep; - Output_Results( system, control, data, &lists, out_control, mpi_data ); + Output_Results( lmp, system, control, data, &lists, out_control, mpi_data ); // populate tmpid and tmpbo arrays for fix reax/c/species int i, j; diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index ebf0684389..2f970399f2 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -43,7 +43,7 @@ using namespace LAMMPS_NS; important: we cannot know the exact number of atoms that will fall into a process's box throughout the whole simulation. therefore we need to make upper bound estimates for various data structures */ -int PreAllocate_Space( reax_system *system, control_params * /*control*/, +int PreAllocate_Space( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params * /*control*/, storage * workspace, MPI_Comm comm ) { int mincap = system->mincap; @@ -55,7 +55,7 @@ int PreAllocate_Space( reax_system *system, control_params * /*control*/, system->total_cap = MAX( (int)(system->N * safezone), mincap ); system->my_atoms = (reax_atom*) - scalloc( system->total_cap, sizeof(reax_atom), "my_atoms", comm ); + scalloc(lmp, system->total_cap, sizeof(reax_atom), "my_atoms", comm ); // Nullify some arrays only used in omp styles // Should be safe to do here since called in pair->setup(); @@ -84,45 +84,45 @@ int Allocate_System( reax_system *system, int /*local_cap*/, int total_cap, } -void DeAllocate_System( reax_system *system ) +void DeAllocate_System( LAMMPS_NS::LAMMPS *lmp, reax_system *system ) { int i, j, k; int ntypes; reax_interaction *ff_params; // dealloocate the atom list - sfree( system->my_atoms, "system->my_atoms" ); + sfree(lmp, system->my_atoms, "system->my_atoms" ); // deallocate the ffield parameters storage ff_params = &(system->reax_param); ntypes = ff_params->num_atom_types; - sfree( ff_params->gp.l, "ff:globals" ); + sfree(lmp, ff_params->gp.l, "ff:globals" ); for( i = 0; i < ntypes; ++i ) { for( j = 0; j < ntypes; ++j ) { for( k = 0; k < ntypes; ++k ) { - sfree( ff_params->fbp[i][j][k], "ff:fbp[i,j,k]" ); + sfree(lmp, ff_params->fbp[i][j][k], "ff:fbp[i,j,k]" ); } - sfree( ff_params->fbp[i][j], "ff:fbp[i,j]" ); - sfree( ff_params->thbp[i][j], "ff:thbp[i,j]" ); - sfree( ff_params->hbp[i][j], "ff:hbp[i,j]" ); + sfree(lmp, ff_params->fbp[i][j], "ff:fbp[i,j]" ); + sfree(lmp, ff_params->thbp[i][j], "ff:thbp[i,j]" ); + sfree(lmp, ff_params->hbp[i][j], "ff:hbp[i,j]" ); } - sfree( ff_params->fbp[i], "ff:fbp[i]" ); - sfree( ff_params->thbp[i], "ff:thbp[i]" ); - sfree( ff_params->hbp[i], "ff:hbp[i]" ); - sfree( ff_params->tbp[i], "ff:tbp[i]" ); + sfree(lmp, ff_params->fbp[i], "ff:fbp[i]" ); + sfree(lmp, ff_params->thbp[i], "ff:thbp[i]" ); + sfree(lmp, ff_params->hbp[i], "ff:hbp[i]" ); + sfree(lmp, ff_params->tbp[i], "ff:tbp[i]" ); } - sfree( ff_params->fbp, "ff:fbp" ); - sfree( ff_params->thbp, "ff:thbp" ); - sfree( ff_params->hbp, "ff:hbp" ); - sfree( ff_params->tbp, "ff:tbp" ); - sfree( ff_params->sbp, "ff:sbp" ); + sfree(lmp, ff_params->fbp, "ff:fbp" ); + sfree(lmp, ff_params->thbp, "ff:thbp" ); + sfree(lmp, ff_params->hbp, "ff:hbp" ); + sfree(lmp, ff_params->tbp, "ff:tbp" ); + sfree(lmp, ff_params->sbp, "ff:sbp" ); } /************* workspace *************/ -void DeAllocate_Workspace( control_params * /*control*/, storage *workspace ) +void DeAllocate_Workspace( LAMMPS_NS::LAMMPS* lmp, control_params * /*control*/, storage *workspace ) { int i; @@ -133,84 +133,84 @@ void DeAllocate_Workspace( control_params * /*control*/, storage *workspace ) /* communication storage */ for( i = 0; i < MAX_NBRS; ++i ) { - sfree( workspace->tmp_dbl[i], "tmp_dbl[i]" ); - sfree( workspace->tmp_rvec[i], "tmp_rvec[i]" ); - sfree( workspace->tmp_rvec2[i], "tmp_rvec2[i]" ); + sfree(lmp, workspace->tmp_dbl[i], "tmp_dbl[i]" ); + sfree(lmp, workspace->tmp_rvec[i], "tmp_rvec[i]" ); + sfree(lmp, workspace->tmp_rvec2[i], "tmp_rvec2[i]" ); } /* bond order storage */ - sfree( workspace->within_bond_box, "skin" ); - sfree( workspace->total_bond_order, "total_bo" ); - sfree( workspace->Deltap, "Deltap" ); - sfree( workspace->Deltap_boc, "Deltap_boc" ); - sfree( workspace->dDeltap_self, "dDeltap_self" ); - sfree( workspace->Delta, "Delta" ); - sfree( workspace->Delta_lp, "Delta_lp" ); - sfree( workspace->Delta_lp_temp, "Delta_lp_temp" ); - sfree( workspace->dDelta_lp, "dDelta_lp" ); - sfree( workspace->dDelta_lp_temp, "dDelta_lp_temp" ); - sfree( workspace->Delta_e, "Delta_e" ); - sfree( workspace->Delta_boc, "Delta_boc" ); - sfree( workspace->Delta_val, "Delta_val" ); - sfree( workspace->nlp, "nlp" ); - sfree( workspace->nlp_temp, "nlp_temp" ); - sfree( workspace->Clp, "Clp" ); - sfree( workspace->vlpex, "vlpex" ); - sfree( workspace->bond_mark, "bond_mark" ); - sfree( workspace->done_after, "done_after" ); + sfree(lmp, workspace->within_bond_box, "skin" ); + sfree(lmp, workspace->total_bond_order, "total_bo" ); + sfree(lmp, workspace->Deltap, "Deltap" ); + sfree(lmp, workspace->Deltap_boc, "Deltap_boc" ); + sfree(lmp, workspace->dDeltap_self, "dDeltap_self" ); + sfree(lmp, workspace->Delta, "Delta" ); + sfree(lmp, workspace->Delta_lp, "Delta_lp" ); + sfree(lmp, workspace->Delta_lp_temp, "Delta_lp_temp" ); + sfree(lmp, workspace->dDelta_lp, "dDelta_lp" ); + sfree(lmp, workspace->dDelta_lp_temp, "dDelta_lp_temp" ); + sfree(lmp, workspace->Delta_e, "Delta_e" ); + sfree(lmp, workspace->Delta_boc, "Delta_boc" ); + sfree(lmp, workspace->Delta_val, "Delta_val" ); + sfree(lmp, workspace->nlp, "nlp" ); + sfree(lmp, workspace->nlp_temp, "nlp_temp" ); + sfree(lmp, workspace->Clp, "Clp" ); + sfree(lmp, workspace->vlpex, "vlpex" ); + sfree(lmp, workspace->bond_mark, "bond_mark" ); + sfree(lmp, workspace->done_after, "done_after" ); /* QEq storage */ - sfree( workspace->Hdia_inv, "Hdia_inv" ); - sfree( workspace->b_s, "b_s" ); - sfree( workspace->b_t, "b_t" ); - sfree( workspace->b_prc, "b_prc" ); - sfree( workspace->b_prm, "b_prm" ); - sfree( workspace->s, "s" ); - sfree( workspace->t, "t" ); - sfree( workspace->droptol, "droptol" ); - sfree( workspace->b, "b" ); - sfree( workspace->x, "x" ); + sfree(lmp, workspace->Hdia_inv, "Hdia_inv" ); + sfree(lmp, workspace->b_s, "b_s" ); + sfree(lmp, workspace->b_t, "b_t" ); + sfree(lmp, workspace->b_prc, "b_prc" ); + sfree(lmp, workspace->b_prm, "b_prm" ); + sfree(lmp, workspace->s, "s" ); + sfree(lmp, workspace->t, "t" ); + sfree(lmp, workspace->droptol, "droptol" ); + sfree(lmp, workspace->b, "b" ); + sfree(lmp, workspace->x, "x" ); /* GMRES storage */ for( i = 0; i < RESTART+1; ++i ) { - sfree( workspace->h[i], "h[i]" ); - sfree( workspace->v[i], "v[i]" ); + sfree(lmp, workspace->h[i], "h[i]" ); + sfree(lmp, workspace->v[i], "v[i]" ); } - sfree( workspace->h, "h" ); - sfree( workspace->v, "v" ); - sfree( workspace->y, "y" ); - sfree( workspace->z, "z" ); - sfree( workspace->g, "g" ); - sfree( workspace->hs, "hs" ); - sfree( workspace->hc, "hc" ); + sfree(lmp, workspace->h, "h" ); + sfree(lmp, workspace->v, "v" ); + sfree(lmp, workspace->y, "y" ); + sfree(lmp, workspace->z, "z" ); + sfree(lmp, workspace->g, "g" ); + sfree(lmp, workspace->hs, "hs" ); + sfree(lmp, workspace->hc, "hc" ); /* CG storage */ - sfree( workspace->r, "r" ); - sfree( workspace->d, "d" ); - sfree( workspace->q, "q" ); - sfree( workspace->p, "p" ); - sfree( workspace->r2, "r2" ); - sfree( workspace->d2, "d2" ); - sfree( workspace->q2, "q2" ); - sfree( workspace->p2, "p2" ); + sfree(lmp, workspace->r, "r" ); + sfree(lmp, workspace->d, "d" ); + sfree(lmp, workspace->q, "q" ); + sfree(lmp, workspace->p, "p" ); + sfree(lmp, workspace->r2, "r2" ); + sfree(lmp, workspace->d2, "d2" ); + sfree(lmp, workspace->q2, "q2" ); + sfree(lmp, workspace->p2, "p2" ); /* integrator storage */ - sfree( workspace->v_const, "v_const" ); + sfree(lmp, workspace->v_const, "v_const" ); /* force related storage */ - sfree( workspace->f, "f" ); - sfree( workspace->CdDelta, "CdDelta" ); + sfree(lmp, workspace->f, "f" ); + sfree(lmp, workspace->CdDelta, "CdDelta" ); /* reductions */ #ifdef LMP_USER_OMP - if (workspace->CdDeltaReduction) sfree( workspace->CdDeltaReduction, "cddelta_reduce" ); - if (workspace->forceReduction) sfree( workspace->forceReduction, "f_reduce" ); - if (workspace->valence_angle_atom_myoffset) sfree( workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); - if (workspace->my_ext_pressReduction) sfree( workspace->my_ext_pressReduction, "ext_press_reduce"); + if (workspace->CdDeltaReduction) sfree(lmp, workspace->CdDeltaReduction, "cddelta_reduce" ); + if (workspace->forceReduction) sfree(lmp, workspace->forceReduction, "f_reduce" ); + if (workspace->valence_angle_atom_myoffset) sfree(lmp, workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); + if (workspace->my_ext_pressReduction) sfree(lmp, workspace->my_ext_pressReduction, "ext_press_reduce"); #endif } -int Allocate_Workspace( reax_system * /*system*/, control_params * control, +int Allocate_Workspace( LAMMPS_NS::LAMMPS* lmp, reax_system * /*system*/, control_params * control, storage *workspace, int local_cap, int total_cap, MPI_Comm comm, char * /*msg*/ ) { @@ -224,94 +224,94 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, /* communication storage */ for( i = 0; i < MAX_NBRS; ++i ) { workspace->tmp_dbl[i] = (double*) - scalloc( total_cap, sizeof(double), "tmp_dbl", comm ); + scalloc(lmp, total_cap, sizeof(double), "tmp_dbl", comm ); workspace->tmp_rvec[i] = (rvec*) - scalloc( total_cap, sizeof(rvec), "tmp_rvec", comm ); + scalloc(lmp, total_cap, sizeof(rvec), "tmp_rvec", comm ); workspace->tmp_rvec2[i] = (rvec2*) - scalloc( total_cap, sizeof(rvec2), "tmp_rvec2", comm ); + scalloc(lmp, total_cap, sizeof(rvec2), "tmp_rvec2", comm ); } /* bond order related storage */ workspace->within_bond_box = (int*) - scalloc( total_cap, sizeof(int), "skin", comm ); - workspace->total_bond_order = (double*) smalloc( total_real, "total_bo", comm ); - workspace->Deltap = (double*) smalloc( total_real, "Deltap", comm ); - workspace->Deltap_boc = (double*) smalloc( total_real, "Deltap_boc", comm ); - workspace->dDeltap_self = (rvec*) smalloc( total_rvec, "dDeltap_self", comm ); - workspace->Delta = (double*) smalloc( total_real, "Delta", comm ); - workspace->Delta_lp = (double*) smalloc( total_real, "Delta_lp", comm ); + scalloc(lmp, total_cap, sizeof(int), "skin", comm ); + workspace->total_bond_order = (double*) smalloc(lmp, total_real, "total_bo", comm ); + workspace->Deltap = (double*) smalloc(lmp, total_real, "Deltap", comm ); + workspace->Deltap_boc = (double*) smalloc(lmp, total_real, "Deltap_boc", comm ); + workspace->dDeltap_self = (rvec*) smalloc(lmp, total_rvec, "dDeltap_self", comm ); + workspace->Delta = (double*) smalloc(lmp, total_real, "Delta", comm ); + workspace->Delta_lp = (double*) smalloc(lmp, total_real, "Delta_lp", comm ); workspace->Delta_lp_temp = (double*) - smalloc( total_real, "Delta_lp_temp", comm ); - workspace->dDelta_lp = (double*) smalloc( total_real, "dDelta_lp", comm ); + smalloc(lmp, total_real, "Delta_lp_temp", comm ); + workspace->dDelta_lp = (double*) smalloc(lmp, total_real, "dDelta_lp", comm ); workspace->dDelta_lp_temp = (double*) - smalloc( total_real, "dDelta_lp_temp", comm ); - workspace->Delta_e = (double*) smalloc( total_real, "Delta_e", comm ); - workspace->Delta_boc = (double*) smalloc( total_real, "Delta_boc", comm ); - workspace->Delta_val = (double*) smalloc( total_real, "Delta_val", comm ); - workspace->nlp = (double*) smalloc( total_real, "nlp", comm ); - workspace->nlp_temp = (double*) smalloc( total_real, "nlp_temp", comm ); - workspace->Clp = (double*) smalloc( total_real, "Clp", comm ); - workspace->vlpex = (double*) smalloc( total_real, "vlpex", comm ); + smalloc(lmp, total_real, "dDelta_lp_temp", comm ); + workspace->Delta_e = (double*) smalloc(lmp, total_real, "Delta_e", comm ); + workspace->Delta_boc = (double*) smalloc(lmp, total_real, "Delta_boc", comm ); + workspace->Delta_val = (double*) smalloc(lmp, total_real, "Delta_val", comm ); + workspace->nlp = (double*) smalloc(lmp, total_real, "nlp", comm ); + workspace->nlp_temp = (double*) smalloc(lmp, total_real, "nlp_temp", comm ); + workspace->Clp = (double*) smalloc(lmp, total_real, "Clp", comm ); + workspace->vlpex = (double*) smalloc(lmp, total_real, "vlpex", comm ); workspace->bond_mark = (int*) - scalloc( total_cap, sizeof(int), "bond_mark", comm ); + scalloc(lmp, total_cap, sizeof(int), "bond_mark", comm ); workspace->done_after = (int*) - scalloc( total_cap, sizeof(int), "done_after", comm ); + scalloc(lmp, total_cap, sizeof(int), "done_after", comm ); /* QEq storage */ workspace->Hdia_inv = (double*) - scalloc( total_cap, sizeof(double), "Hdia_inv", comm ); - workspace->b_s = (double*) scalloc( total_cap, sizeof(double), "b_s", comm ); - workspace->b_t = (double*) scalloc( total_cap, sizeof(double), "b_t", comm ); - workspace->b_prc = (double*) scalloc( total_cap, sizeof(double), "b_prc", comm ); - workspace->b_prm = (double*) scalloc( total_cap, sizeof(double), "b_prm", comm ); - workspace->s = (double*) scalloc( total_cap, sizeof(double), "s", comm ); - workspace->t = (double*) scalloc( total_cap, sizeof(double), "t", comm ); + scalloc(lmp, total_cap, sizeof(double), "Hdia_inv", comm ); + workspace->b_s = (double*) scalloc(lmp, total_cap, sizeof(double), "b_s", comm ); + workspace->b_t = (double*) scalloc(lmp, total_cap, sizeof(double), "b_t", comm ); + workspace->b_prc = (double*) scalloc(lmp, total_cap, sizeof(double), "b_prc", comm ); + workspace->b_prm = (double*) scalloc(lmp, total_cap, sizeof(double), "b_prm", comm ); + workspace->s = (double*) scalloc(lmp, total_cap, sizeof(double), "s", comm ); + workspace->t = (double*) scalloc(lmp, total_cap, sizeof(double), "t", comm ); workspace->droptol = (double*) - scalloc( total_cap, sizeof(double), "droptol", comm ); - workspace->b = (rvec2*) scalloc( total_cap, sizeof(rvec2), "b", comm ); - workspace->x = (rvec2*) scalloc( total_cap, sizeof(rvec2), "x", comm ); + scalloc(lmp, total_cap, sizeof(double), "droptol", comm ); + workspace->b = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "b", comm ); + workspace->x = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "x", comm ); /* GMRES storage */ - workspace->y = (double*) scalloc( RESTART+1, sizeof(double), "y", comm ); - workspace->z = (double*) scalloc( RESTART+1, sizeof(double), "z", comm ); - workspace->g = (double*) scalloc( RESTART+1, sizeof(double), "g", comm ); - workspace->h = (double**) scalloc( RESTART+1, sizeof(double*), "h", comm ); - workspace->hs = (double*) scalloc( RESTART+1, sizeof(double), "hs", comm ); - workspace->hc = (double*) scalloc( RESTART+1, sizeof(double), "hc", comm ); - workspace->v = (double**) scalloc( RESTART+1, sizeof(double*), "v", comm ); + workspace->y = (double*) scalloc(lmp, RESTART+1, sizeof(double), "y", comm ); + workspace->z = (double*) scalloc(lmp, RESTART+1, sizeof(double), "z", comm ); + workspace->g = (double*) scalloc(lmp, RESTART+1, sizeof(double), "g", comm ); + workspace->h = (double**) scalloc(lmp, RESTART+1, sizeof(double*), "h", comm ); + workspace->hs = (double*) scalloc(lmp, RESTART+1, sizeof(double), "hs", comm ); + workspace->hc = (double*) scalloc(lmp, RESTART+1, sizeof(double), "hc", comm ); + workspace->v = (double**) scalloc(lmp, RESTART+1, sizeof(double*), "v", comm ); for( i = 0; i < RESTART+1; ++i ) { - workspace->h[i] = (double*) scalloc( RESTART+1, sizeof(double), "h[i]", comm ); - workspace->v[i] = (double*) scalloc( total_cap, sizeof(double), "v[i]", comm ); + workspace->h[i] = (double*) scalloc(lmp, RESTART+1, sizeof(double), "h[i]", comm ); + workspace->v[i] = (double*) scalloc(lmp, total_cap, sizeof(double), "v[i]", comm ); } /* CG storage */ - workspace->r = (double*) scalloc( total_cap, sizeof(double), "r", comm ); - workspace->d = (double*) scalloc( total_cap, sizeof(double), "d", comm ); - workspace->q = (double*) scalloc( total_cap, sizeof(double), "q", comm ); - workspace->p = (double*) scalloc( total_cap, sizeof(double), "p", comm ); - workspace->r2 = (rvec2*) scalloc( total_cap, sizeof(rvec2), "r2", comm ); - workspace->d2 = (rvec2*) scalloc( total_cap, sizeof(rvec2), "d2", comm ); - workspace->q2 = (rvec2*) scalloc( total_cap, sizeof(rvec2), "q2", comm ); - workspace->p2 = (rvec2*) scalloc( total_cap, sizeof(rvec2), "p2", comm ); + workspace->r = (double*) scalloc(lmp, total_cap, sizeof(double), "r", comm ); + workspace->d = (double*) scalloc(lmp, total_cap, sizeof(double), "d", comm ); + workspace->q = (double*) scalloc(lmp, total_cap, sizeof(double), "q", comm ); + workspace->p = (double*) scalloc(lmp, total_cap, sizeof(double), "p", comm ); + workspace->r2 = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "r2", comm ); + workspace->d2 = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "d2", comm ); + workspace->q2 = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "q2", comm ); + workspace->p2 = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "p2", comm ); /* integrator storage */ - workspace->v_const = (rvec*) smalloc( local_rvec, "v_const", comm ); + workspace->v_const = (rvec*) smalloc(lmp, local_rvec, "v_const", comm ); /* force related storage */ - workspace->f = (rvec*) scalloc( total_cap, sizeof(rvec), "f", comm ); + workspace->f = (rvec*) scalloc(lmp, total_cap, sizeof(rvec), "f", comm ); workspace->CdDelta = (double*) - scalloc( total_cap, sizeof(double), "CdDelta", comm ); + scalloc(lmp, total_cap, sizeof(double), "CdDelta", comm ); // storage for reductions with multiple threads #ifdef LMP_USER_OMP - workspace->CdDeltaReduction = (double *) scalloc(sizeof(double), total_cap*control->nthreads, + workspace->CdDeltaReduction = (double *) scalloc(lmp, sizeof(double), total_cap*control->nthreads, "cddelta_reduce", comm); - workspace->forceReduction = (rvec *) scalloc(sizeof(rvec), total_cap*control->nthreads, + workspace->forceReduction = (rvec *) scalloc(lmp, sizeof(rvec), total_cap*control->nthreads, "forceReduction", comm); - workspace->valence_angle_atom_myoffset = (int *) scalloc(sizeof(int), total_cap, "valence_angle_atom_myoffset", comm); + workspace->valence_angle_atom_myoffset = (int *) scalloc(lmp, sizeof(int), total_cap, "valence_angle_atom_myoffset", comm); workspace->my_ext_pressReduction = (rvec *) calloc(sizeof(rvec), control->nthreads); #else LMP_UNUSED_PARAM(control); @@ -321,18 +321,17 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, } -static void Reallocate_Neighbor_List( reax_list *far_nbrs, int n, +static void Reallocate_Neighbor_List( LAMMPS* lmp, reax_list *far_nbrs, int n, int num_intrs, MPI_Comm comm ) { - Delete_List( far_nbrs, comm ); - if(!Make_List( n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs, comm )){ - fprintf(stderr, "Problem in initializing far nbrs list. Terminating!\n"); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + Delete_List( lmp, far_nbrs, comm ); + if(!Make_List( lmp, n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs, comm )){ + lmp->error->one(FLERR,"Problem in initializing far neighbors list"); } } -static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds, +static int Reallocate_HBonds_List( LAMMPS *lmp, reax_system *system, reax_list *hbonds, MPI_Comm comm ) { int i, total_hbonds; @@ -347,10 +346,9 @@ static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds, } total_hbonds = (int)(MAX( total_hbonds*saferzone, mincap*MIN_HBONDS )); - Delete_List( hbonds, comm ); - if (!Make_List( system->Hcap, total_hbonds, TYP_HBOND, hbonds, comm )) { - fprintf( stderr, "not enough space for hbonds list. terminating!\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + Delete_List( lmp, hbonds, comm ); + if (!Make_List( lmp, system->Hcap, total_hbonds, TYP_HBOND, hbonds, comm )) { + lmp->error->one(FLERR, "Not enough space for hydrogen bonds list"); } return total_hbonds; @@ -377,13 +375,12 @@ static int Reallocate_Bonds_List( LAMMPS *lmp, reax_system *system, reax_list *b #ifdef LMP_USER_OMP if (system->omp_active) for (i = 0; i < bonds->num_intrs; ++i) - sfree(bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); + sfree(lmp, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); #endif - Delete_List( bonds, comm ); - if(!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds, comm)) { - fprintf( stderr, "not enough space for bonds list. terminating!\n" ); - lmp->error->all(FLERR, "Can't allocate space for hbonds."); + Delete_List( lmp, bonds, comm ); + if(!Make_List(lmp, system->total_cap, *total_bonds, TYP_BOND, bonds, comm)) { + lmp->error->one(FLERR, "Not enough space for bonds list"); } #ifdef LMP_USER_OMP @@ -396,7 +393,7 @@ static int Reallocate_Bonds_List( LAMMPS *lmp, reax_system *system, reax_list *b if (system->omp_active) for (i = 0; i < bonds->num_intrs; ++i) bonds->select.bond_list[i].bo_data.CdboReduction = - (double*) smalloc(sizeof(double)*nthreads, "CdboReduction", comm); + (double*) smalloc(lmp, sizeof(double)*nthreads, "CdboReduction", comm); #endif return SUCCESS; @@ -437,21 +434,19 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, /* system */ ret = Allocate_System( system, system->local_cap, system->total_cap, msg ); if (ret != SUCCESS) { - fprintf( stderr, "not enough space for atom_list: total_cap=%d", - system->total_cap ); - fprintf( stderr, "terminating...\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + char errmsg[128]; + snprintf(errmsg, 128, "Not enough space for atom_list: total_cap=%d", system->total_cap); + lmp->error->one(FLERR, errmsg); } /* workspace */ - DeAllocate_Workspace( control, workspace ); - ret = Allocate_Workspace( system, control, workspace, system->local_cap, + DeAllocate_Workspace( lmp, control, workspace ); + ret = Allocate_Workspace( lmp, system, control, workspace, system->local_cap, system->total_cap, comm, msg ); if (ret != SUCCESS) { - fprintf( stderr, "no space for workspace: local_cap=%d total_cap=%d", - system->local_cap, system->total_cap ); - fprintf( stderr, "terminating...\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + char errmsg[128]; + snprintf(errmsg, 128, "Not enough space for workspace: local_cap=%d total_cap=%d", system->local_cap, system->total_cap); + lmp->error->one(FLERR, errmsg); } } @@ -463,15 +458,15 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, if (Nflag || realloc->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { if (realloc->num_far > far_nbrs->num_intrs) { - fprintf( stderr, "step%d-ran out of space on far_nbrs: top=%d, max=%d", - data->step, realloc->num_far, far_nbrs->num_intrs ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + char errmsg[128]; + snprintf(errmsg, 128, "step%d-ran out of space on far_nbrs: top=%d, max=%d", data->step, realloc->num_far, far_nbrs->num_intrs); + lmp->error->one(FLERR, errmsg); } newsize = static_cast (MAX( realloc->num_far*safezone, mincap*MIN_NBRS )); - Reallocate_Neighbor_List( far_nbrs, system->total_cap, newsize, comm ); + Reallocate_Neighbor_List( lmp, far_nbrs, system->total_cap, newsize, comm ); realloc->num_far = 0; } } @@ -486,7 +481,7 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, } if (Hflag || realloc->hbonds) { - ret = Reallocate_HBonds_List( system, (*lists)+HBONDS, comm ); + ret = Reallocate_HBonds_List( lmp, system, (*lists)+HBONDS, comm ); realloc->hbonds = 0; } } @@ -502,17 +497,16 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, /* 3-body list */ if (realloc->num_3body > 0) { - Delete_List( (*lists)+THREE_BODIES, comm ); + Delete_List( lmp, (*lists)+THREE_BODIES, comm ); if (num_bonds == -1) num_bonds = ((*lists)+BONDS)->num_intrs; realloc->num_3body = (int)(MAX(realloc->num_3body*safezone, MIN_3BODIES)); - if( !Make_List( num_bonds, realloc->num_3body, TYP_THREE_BODY, + if( !Make_List( lmp, num_bonds, realloc->num_3body, TYP_THREE_BODY, (*lists)+THREE_BODIES, comm ) ) { - fprintf( stderr, "Problem in initializing angles list. Terminating!\n" ); - MPI_Abort( comm, CANNOT_INITIALIZE ); + lmp->error->one(FLERR, "Problem in initializing angles list"); } realloc->num_3body = -1; } diff --git a/src/USER-REAXC/reaxc_allocate.h b/src/USER-REAXC/reaxc_allocate.h index 786ee6ee8b..9f009b0916 100644 --- a/src/USER-REAXC/reaxc_allocate.h +++ b/src/USER-REAXC/reaxc_allocate.h @@ -33,14 +33,14 @@ #include "error.h" using namespace LAMMPS_NS; -int PreAllocate_Space( reax_system*, control_params*, storage*, MPI_Comm ); +int PreAllocate_Space( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, storage*, MPI_Comm ); int Allocate_System( reax_system*, int, int, char* ); -void DeAllocate_System( reax_system* ); +void DeAllocate_System( LAMMPS_NS::LAMMPS*, reax_system* ); -int Allocate_Workspace( reax_system*, control_params*, storage*, +int Allocate_Workspace( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, storage*, int, int, MPI_Comm, char* ); -void DeAllocate_Workspace( control_params*, storage* ); +void DeAllocate_Workspace( LAMMPS_NS::LAMMPS*, control_params*, storage* ); void ReAllocate( LAMMPS *lmp, reax_system*, control_params*, simulation_data*, storage*, reax_list**, mpi_datatypes* ); diff --git a/src/USER-REAXC/reaxc_bond_orders.cpp b/src/USER-REAXC/reaxc_bond_orders.cpp index 1ed58a0bfd..924be8809d 100644 --- a/src/USER-REAXC/reaxc_bond_orders.cpp +++ b/src/USER-REAXC/reaxc_bond_orders.cpp @@ -360,7 +360,8 @@ int BOp( storage *workspace, reax_list *bonds, double bo_cut, void BO( reax_system *system, control_params * /*control*/, simulation_data * /*data*/, - storage *workspace, reax_list **lists, output_controls * /*out_control*/ ) + storage *workspace, reax_list **lists, output_controls * /*out_control*/, + LAMMPS_NS::LAMMPS* lmp ) { int i, j, pj, type_i, type_j; int start_i, end_i, sym_index; diff --git a/src/USER-REAXC/reaxc_bond_orders.h b/src/USER-REAXC/reaxc_bond_orders.h index 3631d90c89..8de60ba2f2 100644 --- a/src/USER-REAXC/reaxc_bond_orders.h +++ b/src/USER-REAXC/reaxc_bond_orders.h @@ -42,5 +42,5 @@ void Add_dBond_to_Forces_NPT( int, int, simulation_data*, int BOp(storage*, reax_list*, double, int, int, far_neighbor_data*, single_body_parameters*, single_body_parameters*, two_body_parameters*); void BO( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); + storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL ); #endif diff --git a/src/USER-REAXC/reaxc_bonds.cpp b/src/USER-REAXC/reaxc_bonds.cpp index 48fb872324..d5ac4f1ed4 100644 --- a/src/USER-REAXC/reaxc_bonds.cpp +++ b/src/USER-REAXC/reaxc_bonds.cpp @@ -33,7 +33,7 @@ void Bonds( reax_system *system, control_params * /*control*/, simulation_data *data, storage *workspace, reax_list **lists, - output_controls * /*out_control*/ ) + output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* lmp ) { int i, j, pj, natoms; int start_i, end_i; diff --git a/src/USER-REAXC/reaxc_bonds.h b/src/USER-REAXC/reaxc_bonds.h index a4a1fb0b44..b425598b42 100644 --- a/src/USER-REAXC/reaxc_bonds.h +++ b/src/USER-REAXC/reaxc_bonds.h @@ -30,5 +30,5 @@ #include "reaxc_types.h" void Bonds( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); + storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL ); #endif diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index dd2b5a32ad..bf221a6266 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -28,7 +28,9 @@ #include "reaxc_control.h" #include "reaxc_tool_box.h" -char Read_Control_File( char *control_file, control_params* control, +using namespace LAMMPS_NS; + +char Read_Control_File( LAMMPS *lmp, char *control_file, control_params* control, output_controls *out_control ) { FILE *fp; @@ -38,8 +40,7 @@ char Read_Control_File( char *control_file, control_params* control, /* open control file */ if ( (fp = fopen( control_file, "r" ) ) == NULL ) { - fprintf( stderr, "error opening the control file! terminating...\n" ); - MPI_Abort( MPI_COMM_WORLD, FILE_NOT_FOUND ); + lmp->error->all(FLERR, "The control file cannot be opened"); } /* assign default values */ @@ -364,8 +365,9 @@ char Read_Control_File( char *control_file, control_params* control, control->restrict_type = ival; } else { - fprintf( stderr, "WARNING: unknown parameter %s\n", tmp[0] ); - MPI_Abort( MPI_COMM_WORLD, 15 ); + char errmsg[128]; + snprintf(errmsg,128,"Unknown parameter %s in the control file", tmp[0]); + lmp->error->all(FLERR, errmsg); } } diff --git a/src/USER-REAXC/reaxc_control.h b/src/USER-REAXC/reaxc_control.h index b2b455d6b8..4546a894f6 100644 --- a/src/USER-REAXC/reaxc_control.h +++ b/src/USER-REAXC/reaxc_control.h @@ -29,6 +29,9 @@ #include "reaxc_types.h" -char Read_Control_File( char*, control_params*, output_controls* ); +#include "lammps.h" +#include "error.h" + +char Read_Control_File( LAMMPS_NS::LAMMPS *lmp, char*, control_params*, output_controls* ); #endif diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index dd8f12f9d2..6096e3e614 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -29,7 +29,10 @@ #include "reaxc_ffield.h" #include "reaxc_tool_box.h" -char Read_Force_Field( FILE *fp, reax_interaction *reax, +#include "lammps.h" +#include "error.h" + +char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, control_params *control ) { char *s; @@ -41,7 +44,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, double val; MPI_Comm comm; int me; - + comm = MPI_COMM_WORLD; MPI_Comm_rank(comm, &me); @@ -61,7 +64,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, n = atoi(tmp[0]); if (n < 1) { if (me == 0) - fprintf( stderr, "WARNING: number of globals in ffield file is 0!\n" ); + lmp->error->warning( FLERR, "Number of globals in ffield file is 0" ); fclose(fp); free(s); free(tmp); @@ -96,54 +99,54 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Allocating structures in reax_interaction */ reax->sbp = (single_body_parameters*) - scalloc( reax->num_atom_types, sizeof(single_body_parameters), "sbp", + scalloc(lmp, reax->num_atom_types, sizeof(single_body_parameters), "sbp", comm ); reax->tbp = (two_body_parameters**) - scalloc( reax->num_atom_types, sizeof(two_body_parameters*), "tbp", comm ); + scalloc(lmp, reax->num_atom_types, sizeof(two_body_parameters*), "tbp", comm ); reax->thbp= (three_body_header***) - scalloc( reax->num_atom_types, sizeof(three_body_header**), "thbp", comm ); + scalloc(lmp, reax->num_atom_types, sizeof(three_body_header**), "thbp", comm ); reax->hbp = (hbond_parameters***) - scalloc( reax->num_atom_types, sizeof(hbond_parameters**), "hbp", comm ); + scalloc(lmp, reax->num_atom_types, sizeof(hbond_parameters**), "hbp", comm ); reax->fbp = (four_body_header****) - scalloc( reax->num_atom_types, sizeof(four_body_header***), "fbp", comm ); + scalloc(lmp, reax->num_atom_types, sizeof(four_body_header***), "fbp", comm ); tor_flag = (char****) - scalloc( reax->num_atom_types, sizeof(char***), "tor_flag", comm ); + scalloc(lmp, reax->num_atom_types, sizeof(char***), "tor_flag", comm ); for( i = 0; i < reax->num_atom_types; i++ ) { reax->tbp[i] = (two_body_parameters*) - scalloc( reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]", + scalloc(lmp, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]", comm ); reax->thbp[i]= (three_body_header**) - scalloc( reax->num_atom_types, sizeof(three_body_header*), "thbp[i]", + scalloc(lmp, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]", comm ); reax->hbp[i] = (hbond_parameters**) - scalloc( reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]", + scalloc(lmp, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]", comm ); reax->fbp[i] = (four_body_header***) - scalloc( reax->num_atom_types, sizeof(four_body_header**), "fbp[i]", + scalloc(lmp, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]", comm ); tor_flag[i] = (char***) - scalloc( reax->num_atom_types, sizeof(char**), "tor_flag[i]", comm ); + scalloc(lmp, reax->num_atom_types, sizeof(char**), "tor_flag[i]", comm ); for( j = 0; j < reax->num_atom_types; j++ ) { reax->thbp[i][j]= (three_body_header*) - scalloc( reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]", + scalloc(lmp, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]", comm ); reax->hbp[i][j] = (hbond_parameters*) - scalloc( reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]", + scalloc(lmp, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]", comm ); reax->fbp[i][j] = (four_body_header**) - scalloc( reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]", + scalloc(lmp, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]", comm ); tor_flag[i][j] = (char**) - scalloc( reax->num_atom_types, sizeof(char*), "tor_flag[i,j]", comm ); + scalloc(lmp, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]", comm ); for (k=0; k < reax->num_atom_types; k++) { reax->fbp[i][j][k] = (four_body_header*) - scalloc( reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]", + scalloc(lmp, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]", comm ); tor_flag[i][j][k] = (char*) - scalloc( reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]", + scalloc(lmp, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]", comm ); } } @@ -158,15 +161,9 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, c = Tokenize( s, &tmp ); /* Sanity checks */ - if (c == 2 && !lgflag) { - if (me == 0) - fprintf(stderr, "Force field file requires using 'lgvdw yes'\n"); - MPI_Abort( comm, FILE_NOT_FOUND ); - } + if (c < 9) { - if (me == 0) - fprintf(stderr, "Inconsistent ffield file (reaxc_ffield.cpp) \n"); - MPI_Abort( comm, FILE_NOT_FOUND ); + lmp->error->one(FLERR,"Inconsistent ffield file"); } for( j = 0; j < (int)(strlen(tmp[0])); ++j ) @@ -188,9 +185,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - if (me == 0) - fprintf(stderr, "Inconsistent ffield file (reaxc_ffield.cpp) \n"); - MPI_Abort( comm, FILE_NOT_FOUND ); + lmp->error->one(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].alpha = val; @@ -208,9 +203,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - if (me == 0) - fprintf(stderr, "Inconsistent ffield file (reaxc_ffield.cpp) \n"); - MPI_Abort( comm, FILE_NOT_FOUND ); + lmp->error->one(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].r_pi_pi = val; @@ -228,9 +221,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - if (me == 0) - fprintf(stderr, "Inconsistent ffield file (reaxc_ffield.cpp) \n"); - MPI_Abort( comm, FILE_NOT_FOUND ); + lmp->error->one(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].p_ovun2 = val; @@ -249,9 +240,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c > 2) { - if (me == 0) - fprintf(stderr, "Force field file incompatible with 'lgvdw yes'\n"); - MPI_Abort( comm, FILE_NOT_FOUND ); + lmp->error->one(FLERR,"Force field file incompatible with 'lgvdw yes'"); } val = atof(tmp[0]); reax->sbp[i].lgcij = val; @@ -261,28 +250,32 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, if (reax->sbp[i].rcore2>0.01 && reax->sbp[i].acore2>0.01) { // Inner-wall if (reax->sbp[i].gamma_w>0.5) { // Shielding vdWaals if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 3) { - if (errorflag && (me == 0)) - fprintf( stderr, "Warning: inconsistent vdWaals-parameters\n" \ - "Force field parameters for element %s\n" \ - "indicate inner wall+shielding, but earlier\n" \ - "atoms indicate different vdWaals-method.\n" \ - "This may cause division-by-zero errors.\n" \ - "Keeping vdWaals-setting for earlier atoms.\n", - reax->sbp[i].name ); + if (errorflag && (me == 0)) { + char errmsg[512]; + snprintf(errmsg, 512, "VdWaals-parameters for element %s " + "indicate inner wall+shielding, but earlier " + "atoms indicate different vdWaals-method. " + "This may cause division-by-zero errors. " + "Keeping vdWaals-setting for earlier atoms.", + reax->sbp[i].name); + lmp->error->warning(FLERR,errmsg); + } errorflag = 0; } else { reax->gp.vdw_type = 3; } } else { // No shielding vdWaals parameters present if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 2) { - if (me == 0) - fprintf( stderr, "Warning: inconsistent vdWaals-parameters\n" \ - "Force field parameters for element %s\n" \ - "indicate inner wall without shielding, but earlier\n" \ - "atoms indicate different vdWaals-method.\n" \ - "This may cause division-by-zero errors.\n" \ - "Keeping vdWaals-setting for earlier atoms.\n", - reax->sbp[i].name ); + if (me == 0) { + char errmsg[512]; + snprintf(errmsg, 512, "VdWaals-parameters for element %s " + "indicate inner wall without shielding, but earlier " + "atoms indicate different vdWaals-method. " + "This may cause division-by-zero errors. " + "Keeping vdWaals-setting for earlier atoms.", + reax->sbp[i].name); + lmp->error->warning(FLERR,errmsg); + } } else { reax->gp.vdw_type = 2; } @@ -290,23 +283,25 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, } else { // No Inner wall parameters present if (reax->sbp[i].gamma_w>0.5) { // Shielding vdWaals if (reax->gp.vdw_type != 0 && reax->gp.vdw_type != 1) { - if (me == 0) - fprintf( stderr, "Warning: inconsistent vdWaals-parameters\n" \ - "Force field parameters for element %s\n" \ - "indicate shielding without inner wall, but earlier\n" \ - "atoms indicate different vdWaals-method.\n" \ - "This may cause division-by-zero errors.\n" \ - "Keeping vdWaals-setting for earlier atoms.\n", - reax->sbp[i].name ); + if (me == 0) { + char errmsg[512]; + snprintf(errmsg, 512, "VdWaals parameters for element %s " + "indicate shielding without inner wall, but earlier " + "elements indicate different vdWaals-method. " + "This may cause division-by-zero errors. " + "Keeping vdWaals-setting for earlier atoms.", + reax->sbp[i].name); + lmp->error->warning(FLERR,errmsg); + } } else { reax->gp.vdw_type = 1; } } else { - if (me == 0) - fprintf( stderr, "Error: inconsistent vdWaals-parameters\n" \ - "No shielding or inner-wall set for element %s\n", - reax->sbp[i].name ); - MPI_Abort( comm, INVALID_INPUT ); + char errmsg[256]; + snprintf(errmsg, 256, "Inconsistent vdWaals-parameters " + "No shielding or inner-wall set for element %s", + reax->sbp[i].name); + lmp->error->all(FLERR, errmsg); } } } @@ -315,15 +310,23 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, for( i = 0; i < reax->num_atom_types; i++ ) if( reax->sbp[i].mass < 21 && reax->sbp[i].valency_val != reax->sbp[i].valency_boc ) { - if (me == 0) - fprintf(stderr,"Warning: changed valency_val to valency_boc for %s\n", - reax->sbp[i].name ); + if (me == 0) { + char errmsg[256]; + snprintf(errmsg, 256, "Changed valency_val to valency_boc for %s", + reax->sbp[i].name); + lmp->error->warning(FLERR,errmsg); + } reax->sbp[i].valency_val = reax->sbp[i].valency_boc; } /* next line is number of two body combination and some comments */ fgets(s,MAX_LINE,fp); c=Tokenize(s,&tmp); + + if (c == 2 && !lgflag) { + lmp->error->all(FLERR, "Force field file requires using 'lgvdw yes'"); + } + l = atoi(tmp[0]); /* a line of comments */ @@ -334,6 +337,8 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, fgets(s,MAX_LINE,fp); c=Tokenize(s,&tmp); + + j = atoi(tmp[0]) - 1; k = atoi(tmp[1]) - 1; diff --git a/src/USER-REAXC/reaxc_ffield.h b/src/USER-REAXC/reaxc_ffield.h index 7cef730f91..225f207de9 100644 --- a/src/USER-REAXC/reaxc_ffield.h +++ b/src/USER-REAXC/reaxc_ffield.h @@ -29,6 +29,6 @@ #include "reaxc_types.h" -char Read_Force_Field( FILE*, reax_interaction*, control_params* ); +char Read_Force_Field( LAMMPS_NS::LAMMPS*, FILE*, reax_interaction*, control_params* ); #endif diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index 848c03f5a1..4adec04f0c 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -39,15 +39,12 @@ #include "reaxc_valence_angles.h" #include "reaxc_vector.h" -#include "lammps.h" -#include "error.h" interaction_function Interaction_Functions[NUM_INTRS]; -using namespace LAMMPS_NS; void Dummy_Interaction( reax_system * /*system*/, control_params * /*control*/, simulation_data * /*data*/, storage * /*workspace*/, - reax_list **/*lists*/, output_controls * /*out_control*/ ) + reax_list ** /*lists*/, output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* = NULL ) { } @@ -79,7 +76,7 @@ void Compute_Bonded_Forces( reax_system *system, control_params *control, /* Implement all force calls as function pointers */ for( i = 0; i < NUM_INTRS; i++ ) { (Interaction_Functions[i])( system, control, data, workspace, - lists, out_control ); + lists, out_control, NULL ); } } @@ -118,7 +115,7 @@ void Compute_Total_Force( reax_system *system, control_params *control, } -void Validate_Lists( LAMMPS *lmp, reax_system *system, storage * /*workspace*/, reax_list **lists, +void Validate_Lists( LAMMPS_NS::LAMMPS *lmp, reax_system *system, storage * /*workspace*/, reax_list **lists, int step, int /*n*/, int N, int numH, MPI_Comm comm ) { int i, comp, Hindex; @@ -138,9 +135,10 @@ void Validate_Lists( LAMMPS *lmp, reax_system *system, storage * /*workspace*/, else comp = bonds->num_intrs; if (End_Index(i, bonds) > comp) { - fprintf( stderr, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", + char errmsg[256]; + snprintf(errmsg, 256, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", step, i, End_Index(i,bonds), comp ); - lmp->error->all(FLERR,"Failure in bond list."); + lmp->error->all(FLERR,errmsg); } } } @@ -165,9 +163,10 @@ void Validate_Lists( LAMMPS *lmp, reax_system *system, storage * /*workspace*/, else comp = hbonds->num_intrs; if (End_Index(Hindex, hbonds) > comp) { - fprintf(stderr,"step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", + char errmsg[256]; + snprintf(errmsg, 256, "step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", step, Hindex, End_Index(Hindex,hbonds), comp ); - lmp->error->all(FLERR, "Failure in hydrogen bonds."); + lmp->error->all(FLERR, errmsg); } } } @@ -175,7 +174,7 @@ void Validate_Lists( LAMMPS *lmp, reax_system *system, storage * /*workspace*/, } -void Init_Forces_noQEq( LAMMPS *lmp, reax_system *system, control_params *control, +void Init_Forces_noQEq( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls * /*out_control*/, MPI_Comm comm ) { @@ -435,7 +434,7 @@ void Estimate_Storages( reax_system *system, control_params *control, } -void Compute_Forces( LAMMPS *lmp, reax_system *system, control_params *control, +void Compute_Forces( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data ) diff --git a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp index be34df7571..489a43cfc1 100644 --- a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp +++ b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp @@ -33,7 +33,7 @@ void Hydrogen_Bonds( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/ ) + reax_list **lists, output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* lmp ) { int i, j, k, pi, pk; int type_i, type_j, type_k; diff --git a/src/USER-REAXC/reaxc_hydrogen_bonds.h b/src/USER-REAXC/reaxc_hydrogen_bonds.h index 04d3d26d5c..2a448439ea 100644 --- a/src/USER-REAXC/reaxc_hydrogen_bonds.h +++ b/src/USER-REAXC/reaxc_hydrogen_bonds.h @@ -30,6 +30,6 @@ #include "reaxc_types.h" void Hydrogen_Bonds( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); + storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL ); #endif diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 4565fd067d..6ee68d6c46 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -82,7 +82,7 @@ int Init_Simulation_Data( reax_system *system, control_params *control, return SUCCESS; } -void Init_Taper( control_params *control, storage *workspace, MPI_Comm comm ) +void Init_Taper( LAMMPS_NS::LAMMPS* lmp, control_params *control, storage *workspace, MPI_Comm comm ) { double d1, d7; double swa, swa2, swa3; @@ -92,14 +92,16 @@ void Init_Taper( control_params *control, storage *workspace, MPI_Comm comm ) swb = control->nonb_cut; if (fabs( swa ) > 0.01) - fprintf( stderr, "Warning: non-zero lower Taper-radius cutoff\n" ); + lmp->error->warning( FLERR, "Non-zero lower Taper-radius cutoff" ); if (swb < 0) { - fprintf( stderr, "Negative upper Taper-radius cutoff\n" ); - MPI_Abort( comm, INVALID_INPUT ); + lmp->error->all(FLERR,"Negative upper Taper-radius cutoff"); + } + else if( swb < 5 ) { + char errmsg[256]; + snprintf(errmsg, 256, "Very low Taper-radius cutoff: %f", swb ); + lmp->error->warning( FLERR, errmsg ); } - else if( swb < 5 ) - fprintf( stderr, "Warning: very low Taper-radius cutoff: %f\n", swb ); d1 = swb - swa; d7 = pow( d1, 7.0 ); @@ -120,12 +122,12 @@ void Init_Taper( control_params *control, storage *workspace, MPI_Comm comm ) } -int Init_Workspace( reax_system *system, control_params *control, +int Init_Workspace( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, storage *workspace, MPI_Comm comm, char *msg ) { int ret; - ret = Allocate_Workspace( system, control, workspace, + ret = Allocate_Workspace( lmp, system, control, workspace, system->local_cap, system->total_cap, comm, msg ); if (ret != SUCCESS) return ret; @@ -134,7 +136,7 @@ int Init_Workspace( reax_system *system, control_params *control, Reset_Workspace( system, workspace ); /* Initialize the Taper function */ - Init_Taper( control, workspace, comm ); + Init_Taper( lmp, control, workspace, comm ); return SUCCESS; } @@ -179,10 +181,9 @@ int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, } total_hbonds = (int)(MAX( total_hbonds*saferzone, mincap*MIN_HBONDS )); - if( !Make_List( system->Hcap, total_hbonds, TYP_HBOND, + if( !Make_List( lmp, system->Hcap, total_hbonds, TYP_HBOND, *lists+HBONDS, comm ) ) { - fprintf( stderr, "not enough space for hbonds list. terminating!\n" ); - lmp->error->all(FLERR, "Can't allocate space for hbonds."); + lmp->error->one(FLERR, "Not enough space for hbonds list."); } } @@ -193,18 +194,16 @@ int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, } bond_cap = (int)(MAX( total_bonds*safezone, mincap*MIN_BONDS )); - if( !Make_List( system->total_cap, bond_cap, TYP_BOND, + if( !Make_List( lmp, system->total_cap, bond_cap, TYP_BOND, *lists+BONDS, comm ) ) { - fprintf( stderr, "not enough space for bonds list. terminating!\n" ); - lmp->error->all(FLERR, "Can't allocate space for hbonds."); + lmp->error->one(FLERR, "Not enough space for bonds list."); } /* 3bodies list */ cap_3body = (int)(MAX( num_3body*safezone, MIN_3BODIES )); - if( !Make_List( bond_cap, cap_3body, TYP_THREE_BODY, + if( !Make_List( lmp, bond_cap, cap_3body, TYP_THREE_BODY, *lists+THREE_BODIES, comm ) ){ - fprintf( stderr, "Problem in initializing angles list. Terminating!\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + lmp->error->one(FLERR,"Problem in initializing angles list."); } free( hb_top ); @@ -219,60 +218,53 @@ void Initialize( LAMMPS *lmp, reax_system *system, control_params *control, mpi_datatypes *mpi_data, MPI_Comm comm ) { char msg[MAX_STR]; + char errmsg[128]; if (Init_MPI_Datatypes(system, workspace, mpi_data, comm, msg) == FAILURE) { - fprintf( stderr, "p%d: init_mpi_datatypes: could not create datatypes\n", - system->my_rank ); - fprintf( stderr, "p%d: mpi_data couldn't be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + + snprintf(errmsg, 128, "Could not create datatypes on thread %d", + system->my_rank); + lmp->error->one(FLERR,errmsg); } if (Init_System(system, control, msg) == FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: system could not be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf(errmsg, 128, "System could not be initialized on thread %d", + system->my_rank); + lmp->error->one(FLERR,errmsg); } if (Init_Simulation_Data( system, control, data, msg ) == FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: sim_data couldn't be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf(errmsg, 128, "Sim_data could not be initialized on thread %d", + system->my_rank); + lmp->error->one(FLERR,errmsg); } - if (Init_Workspace( system, control, workspace, mpi_data->world, msg ) == + if (Init_Workspace( lmp, system, control, workspace, mpi_data->world, msg ) == FAILURE) { - fprintf( stderr, "p%d:init_workspace: not enough memory\n", - system->my_rank ); - fprintf( stderr, "p%d:workspace couldn't be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf(errmsg, 128, "Workspace could not be initialized on thread %d", + system->my_rank); + lmp->error->one(FLERR,errmsg); } if (Init_Lists( lmp, system, control, data, workspace, lists, mpi_data, msg ) == FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: system could not be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf(errmsg, 128, "System could not be initialized on thread %d", + system->my_rank); + lmp->error->one(FLERR,errmsg); } - if (Init_Output_Files(system,control,out_control,mpi_data,msg)== FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: could not open output files! terminating...\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + if (Init_Output_Files(lmp, system,control,out_control,mpi_data,msg)== FAILURE) { + snprintf(errmsg, 128, "Could not open output files on thread %d", + system->my_rank); + lmp->error->one(FLERR,errmsg); } if (control->tabulate) { - if (Init_Lookup_Tables( system, control, workspace, mpi_data, msg ) == FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: couldn't create lookup table! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + if (Init_Lookup_Tables( lmp, system, control, workspace, mpi_data, msg ) == FAILURE) { + snprintf(errmsg, 128, "Lookup table could not be created on thread %d", + system->my_rank); + lmp->error->one(FLERR,errmsg); } } diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index f71fcbec8e..aa7e7fcea7 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -34,7 +34,7 @@ #include "reaxc_traj.h" #include "reaxc_vector.h" -int Init_Output_Files( reax_system *system, control_params *control, +int Init_Output_Files( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, output_controls *out_control, mpi_datatypes *mpi_data, char *msg ) { @@ -42,7 +42,7 @@ int Init_Output_Files( reax_system *system, control_params *control, int ret; if (out_control->write_steps > 0) { - ret = Init_Traj( system, control, out_control, mpi_data, msg ); + ret = Init_Traj( lmp, system, control, out_control, mpi_data, msg ); if (ret == FAILURE) return ret; } @@ -107,7 +107,7 @@ int Close_Output_Files( reax_system *system, control_params *control, } -void Output_Results( reax_system *system, control_params *control, +void Output_Results( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, simulation_data *data, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data ) { @@ -146,7 +146,7 @@ void Output_Results( reax_system *system, control_params *control, /* write current frame */ if( out_control->write_steps > 0 && (data->step-data->prev_steps) % out_control->write_steps == 0 ) { - Append_Frame( system, control, data, lists, out_control, mpi_data ); + Append_Frame( lmp, system, control, data, lists, out_control, mpi_data ); } } diff --git a/src/USER-REAXC/reaxc_io_tools.h b/src/USER-REAXC/reaxc_io_tools.h index a3f22fccc2..80202d5c83 100644 --- a/src/USER-REAXC/reaxc_io_tools.h +++ b/src/USER-REAXC/reaxc_io_tools.h @@ -29,10 +29,10 @@ #include "reaxc_types.h" -int Init_Output_Files( reax_system*, control_params*, +int Init_Output_Files( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, output_controls*, mpi_datatypes*, char* ); int Close_Output_Files( reax_system*, control_params*, output_controls*, mpi_datatypes* ); -void Output_Results( reax_system*, control_params*, simulation_data*, +void Output_Results( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, simulation_data*, reax_list**, output_controls*, mpi_datatypes* ); #endif diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index 8a3bb9d322..5d4ab2f3c8 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -29,116 +29,118 @@ #include "reaxc_tool_box.h" /************* allocate list space ******************/ -int Make_List(int n, int num_intrs, int type, reax_list *l, MPI_Comm comm) +int Make_List( LAMMPS_NS::LAMMPS *lmp, int n, int num_intrs, int type, reax_list *l, MPI_Comm comm) { l->allocated = 1; l->n = n; l->num_intrs = num_intrs; - if (l->index) sfree(l->index, "list:index"); - if (l->end_index) sfree(l->end_index, "list:end_index"); - l->index = (int*) smalloc( n * sizeof(int), "list:index", comm ); - l->end_index = (int*) smalloc( n * sizeof(int), "list:end_index", comm ); + if (l->index) sfree(lmp, l->index, "list:index"); + if (l->end_index) sfree(lmp, l->end_index, "list:end_index"); + l->index = (int*) smalloc(lmp, n * sizeof(int), "list:index", comm ); + l->end_index = (int*) smalloc(lmp, n * sizeof(int), "list:end_index", comm ); l->type = type; switch(l->type) { case TYP_VOID: - if (l->select.v) sfree(l->select.v, "list:v"); - l->select.v = (void*) smalloc(l->num_intrs * sizeof(void*), "list:v", comm); + if (l->select.v) sfree(lmp, l->select.v, "list:v"); + l->select.v = (void*) smalloc(lmp, l->num_intrs * sizeof(void*), "list:v", comm); break; case TYP_THREE_BODY: - if (l->select.three_body_list) sfree(l->select.three_body_list,"list:three_bodies"); + if (l->select.three_body_list) sfree(lmp, l->select.three_body_list,"list:three_bodies"); l->select.three_body_list = (three_body_interaction_data*) - smalloc( l->num_intrs * sizeof(three_body_interaction_data), + smalloc(lmp, l->num_intrs * sizeof(three_body_interaction_data), "list:three_bodies", comm ); break; case TYP_BOND: - if (l->select.bond_list) sfree(l->select.bond_list,"list:bonds"); + if (l->select.bond_list) sfree(lmp, l->select.bond_list,"list:bonds"); l->select.bond_list = (bond_data*) - smalloc( l->num_intrs * sizeof(bond_data), "list:bonds", comm ); + smalloc(lmp, l->num_intrs * sizeof(bond_data), "list:bonds", comm ); break; case TYP_DBO: - if (l->select.dbo_list) sfree(l->select.dbo_list,"list:dbonds"); + if (l->select.dbo_list) sfree(lmp, l->select.dbo_list,"list:dbonds"); l->select.dbo_list = (dbond_data*) - smalloc( l->num_intrs * sizeof(dbond_data), "list:dbonds", comm ); + smalloc(lmp, l->num_intrs * sizeof(dbond_data), "list:dbonds", comm ); break; case TYP_DDELTA: - if (l->select.dDelta_list) sfree(l->select.dDelta_list,"list:dDeltas"); + if (l->select.dDelta_list) sfree(lmp, l->select.dDelta_list,"list:dDeltas"); l->select.dDelta_list = (dDelta_data*) - smalloc( l->num_intrs * sizeof(dDelta_data), "list:dDeltas", comm ); + smalloc(lmp, l->num_intrs * sizeof(dDelta_data), "list:dDeltas", comm ); break; case TYP_FAR_NEIGHBOR: - if (l->select.far_nbr_list) sfree(l->select.far_nbr_list,"list:far_nbrs"); + if (l->select.far_nbr_list) sfree(lmp, l->select.far_nbr_list,"list:far_nbrs"); l->select.far_nbr_list = (far_neighbor_data*) - smalloc(l->num_intrs * sizeof(far_neighbor_data), "list:far_nbrs", comm); + smalloc(lmp, l->num_intrs * sizeof(far_neighbor_data), "list:far_nbrs", comm); break; case TYP_HBOND: - if (l->select.hbond_list) sfree(l->select.hbond_list,"list:hbonds"); + if (l->select.hbond_list) sfree(lmp, l->select.hbond_list,"list:hbonds"); l->select.hbond_list = (hbond_data*) - smalloc( l->num_intrs * sizeof(hbond_data), "list:hbonds", comm ); + smalloc(lmp, l->num_intrs * sizeof(hbond_data), "list:hbonds", comm ); break; default: - fprintf( stderr, "ERROR: no %d list type defined!\n", l->type ); - MPI_Abort( comm, INVALID_INPUT ); + char errmsg[128]; + snprintf(errmsg, 128, "No %d list type defined", l->type); + lmp->error->all(FLERR,errmsg); } return SUCCESS; } -void Delete_List( reax_list *l, MPI_Comm comm ) +void Delete_List( LAMMPS_NS::LAMMPS *lmp, reax_list *l, MPI_Comm comm ) { if (l->allocated == 0) return; l->allocated = 0; - sfree( l->index, "list:index" ); - sfree( l->end_index, "list:end_index" ); + sfree(lmp, l->index, "list:index" ); + sfree(lmp, l->end_index, "list:end_index" ); l->index = NULL; l->end_index = NULL; switch(l->type) { case TYP_VOID: - sfree( l->select.v, "list:v" ); + sfree(lmp, l->select.v, "list:v" ); l->select.v = NULL; break; case TYP_HBOND: - sfree( l->select.hbond_list, "list:hbonds" ); + sfree(lmp, l->select.hbond_list, "list:hbonds" ); l->select.hbond_list = NULL; break; case TYP_FAR_NEIGHBOR: - sfree( l->select.far_nbr_list, "list:far_nbrs" ); + sfree(lmp, l->select.far_nbr_list, "list:far_nbrs" ); l->select.far_nbr_list = NULL; break; case TYP_BOND: - sfree( l->select.bond_list, "list:bonds" ); + sfree(lmp, l->select.bond_list, "list:bonds" ); l->select.bond_list = NULL; break; case TYP_DBO: - sfree( l->select.dbo_list, "list:dbos" ); + sfree(lmp, l->select.dbo_list, "list:dbos" ); l->select.dbo_list = NULL; break; case TYP_DDELTA: - sfree( l->select.dDelta_list, "list:dDeltas" ); + sfree(lmp, l->select.dDelta_list, "list:dDeltas" ); l->select.dDelta_list = NULL; break; case TYP_THREE_BODY: - sfree( l->select.three_body_list, "list:three_bodies" ); + sfree(lmp, l->select.three_body_list, "list:three_bodies" ); l->select.three_body_list = NULL; break; default: - fprintf( stderr, "ERROR: no %d list type defined!\n", l->type ); - MPI_Abort( comm, INVALID_INPUT ); + char errmsg[128]; + snprintf(errmsg, 128, "No %d list type defined", l->type); + lmp->error->all(FLERR,errmsg); } } diff --git a/src/USER-REAXC/reaxc_list.h b/src/USER-REAXC/reaxc_list.h index ab7fbce19c..1df2338b0f 100644 --- a/src/USER-REAXC/reaxc_list.h +++ b/src/USER-REAXC/reaxc_list.h @@ -29,8 +29,8 @@ #include "reaxc_types.h" -int Make_List( int, int, int, reax_list*, MPI_Comm ); -void Delete_List( reax_list*, MPI_Comm ); +int Make_List( LAMMPS_NS::LAMMPS*, int, int, int, reax_list*, MPI_Comm ); +void Delete_List( LAMMPS_NS::LAMMPS*, reax_list*, MPI_Comm ); inline int Num_Entries(int,reax_list*); inline int Start_Index( int, reax_list* ); diff --git a/src/USER-REAXC/reaxc_lookup.cpp b/src/USER-REAXC/reaxc_lookup.cpp index 92945ebdb5..41ad5e99d4 100644 --- a/src/USER-REAXC/reaxc_lookup.cpp +++ b/src/USER-REAXC/reaxc_lookup.cpp @@ -50,7 +50,7 @@ void Tridiagonal_Solve( const double *a, const double *b, } -void Natural_Cubic_Spline( const double *h, const double *f, +void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const double *f, cubic_spline_coef *coef, unsigned int n, MPI_Comm comm ) { @@ -58,11 +58,11 @@ void Natural_Cubic_Spline( const double *h, const double *f, double *a, *b, *c, *d, *v; /* allocate space for the linear system */ - a = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); - b = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); - c = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); - d = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); - v = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); + a = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + b = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + c = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + d = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + v = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); /* build the linear system */ a[0] = a[1] = a[n-1] = 0; @@ -92,16 +92,16 @@ void Natural_Cubic_Spline( const double *h, const double *f, coef[i-1].a = f[i]; } - sfree( a, "cubic_spline:a" ); - sfree( b, "cubic_spline:b" ); - sfree( c, "cubic_spline:c" ); - sfree( d, "cubic_spline:d" ); - sfree( v, "cubic_spline:v" ); + sfree(lmp, a, "cubic_spline:a" ); + sfree(lmp, b, "cubic_spline:b" ); + sfree(lmp, c, "cubic_spline:c" ); + sfree(lmp, d, "cubic_spline:d" ); + sfree(lmp, v, "cubic_spline:v" ); } -void Complete_Cubic_Spline( const double *h, const double *f, double v0, double vlast, +void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const double *f, double v0, double vlast, cubic_spline_coef *coef, unsigned int n, MPI_Comm comm ) { @@ -109,11 +109,11 @@ void Complete_Cubic_Spline( const double *h, const double *f, double v0, double double *a, *b, *c, *d, *v; /* allocate space for the linear system */ - a = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); - b = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); - c = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); - d = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); - v = (double*) smalloc( n * sizeof(double), "cubic_spline:a", comm ); + a = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + b = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + c = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + d = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + v = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); /* build the linear system */ a[0] = 0; @@ -142,15 +142,15 @@ void Complete_Cubic_Spline( const double *h, const double *f, double v0, double coef[i-1].a = f[i]; } - sfree( a, "cubic_spline:a" ); - sfree( b, "cubic_spline:b" ); - sfree( c, "cubic_spline:c" ); - sfree( d, "cubic_spline:d" ); - sfree( v, "cubic_spline:v" ); + sfree(lmp, a, "cubic_spline:a" ); + sfree(lmp, b, "cubic_spline:b" ); + sfree(lmp, c, "cubic_spline:c" ); + sfree(lmp, d, "cubic_spline:d" ); + sfree(lmp, v, "cubic_spline:v" ); } -int Init_Lookup_Tables( reax_system *system, control_params *control, +int Init_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, storage *workspace, mpi_datatypes *mpi_data, char * /*msg*/ ) { int i, j, r; @@ -171,23 +171,23 @@ int Init_Lookup_Tables( reax_system *system, control_params *control, num_atom_types = system->reax_param.num_atom_types; dr = control->nonb_cut / control->tabulate; h = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:h", comm ); + smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:h", comm ); fh = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fh", comm ); + smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fh", comm ); fvdw = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fvdw", comm ); + smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fvdw", comm ); fCEvd = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fCEvd", comm ); + smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fCEvd", comm ); fele = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fele", comm ); + smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fele", comm ); fCEclmb = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fCEclmb", comm ); + smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb", comm ); LR = (LR_lookup_table**) - scalloc( num_atom_types, sizeof(LR_lookup_table*), "lookup:LR", comm ); + scalloc(lmp, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR", comm ); for( i = 0; i < num_atom_types; ++i ) LR[i] = (LR_lookup_table*) - scalloc( num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]", comm ); + scalloc(lmp, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]", comm ); for( i = 0; i < MAX_ATOM_TYPES; ++i ) existing_types[i] = 0; @@ -207,21 +207,21 @@ int Init_Lookup_Tables( reax_system *system, control_params *control, LR[i][j].dx = dr; LR[i][j].inv_dx = control->tabulate / control->nonb_cut; LR[i][j].y = (LR_data*) - smalloc( LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y", comm ); + smalloc(lmp, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y", comm ); LR[i][j].H = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H" , + smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H" , comm ); LR[i][j].vdW = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW", + smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW", comm); LR[i][j].CEvd = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd", + smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd", comm); LR[i][j].ele = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele", + smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele", comm ); LR[i][j].CEclmb = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef), + smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef), "lookup:LR[i,j].CEclmb", comm ); for( r = 1; r <= control->tabulate; ++r ) { @@ -246,22 +246,22 @@ int Init_Lookup_Tables( reax_system *system, control_params *control, vlast_vdw = fCEvd[r-1]; vlast_ele = fele[r-1]; - Natural_Cubic_Spline( &h[1], &fh[1], + Natural_Cubic_Spline( lmp, &h[1], &fh[1], &(LR[i][j].H[1]), control->tabulate+1, comm ); - Complete_Cubic_Spline( &h[1], &fvdw[1], v0_vdw, vlast_vdw, + Complete_Cubic_Spline( lmp, &h[1], &fvdw[1], v0_vdw, vlast_vdw, &(LR[i][j].vdW[1]), control->tabulate+1, comm ); - Natural_Cubic_Spline( &h[1], &fCEvd[1], + Natural_Cubic_Spline( lmp, &h[1], &fCEvd[1], &(LR[i][j].CEvd[1]), control->tabulate+1, comm ); - Complete_Cubic_Spline( &h[1], &fele[1], v0_ele, vlast_ele, + Complete_Cubic_Spline( lmp, &h[1], &fele[1], v0_ele, vlast_ele, &(LR[i][j].ele[1]), control->tabulate+1, comm ); - Natural_Cubic_Spline( &h[1], &fCEclmb[1], + Natural_Cubic_Spline( lmp, &h[1], &fCEclmb[1], &(LR[i][j].CEclmb[1]), control->tabulate+1, comm ); } else { @@ -281,7 +281,7 @@ int Init_Lookup_Tables( reax_system *system, control_params *control, } -void Deallocate_Lookup_Tables( reax_system *system ) +void Deallocate_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system ) { int i, j; int ntypes; @@ -291,14 +291,14 @@ void Deallocate_Lookup_Tables( reax_system *system ) for( i = 0; i < ntypes; ++i ) { for( j = i; j < ntypes; ++j ) if (LR[i][j].n) { - sfree( LR[i][j].y, "LR[i,j].y" ); - sfree( LR[i][j].H, "LR[i,j].H" ); - sfree( LR[i][j].vdW, "LR[i,j].vdW" ); - sfree( LR[i][j].CEvd, "LR[i,j].CEvd" ); - sfree( LR[i][j].ele, "LR[i,j].ele" ); - sfree( LR[i][j].CEclmb, "LR[i,j].CEclmb" ); + sfree(lmp, LR[i][j].y, "LR[i,j].y" ); + sfree(lmp, LR[i][j].H, "LR[i,j].H" ); + sfree(lmp, LR[i][j].vdW, "LR[i,j].vdW" ); + sfree(lmp, LR[i][j].CEvd, "LR[i,j].CEvd" ); + sfree(lmp, LR[i][j].ele, "LR[i,j].ele" ); + sfree(lmp, LR[i][j].CEclmb, "LR[i,j].CEclmb" ); } - sfree( LR[i], "LR[i]" ); + sfree(lmp, LR[i], "LR[i]" ); } - sfree( LR, "LR" ); + sfree(lmp, LR, "LR" ); } diff --git a/src/USER-REAXC/reaxc_lookup.h b/src/USER-REAXC/reaxc_lookup.h index 66fa3c407c..2d33ad82de 100644 --- a/src/USER-REAXC/reaxc_lookup.h +++ b/src/USER-REAXC/reaxc_lookup.h @@ -32,17 +32,17 @@ void Tridiagonal_Solve( const double *a, const double *b, double *c, double *d, double *x, unsigned int n); -void Natural_Cubic_Spline( const double *h, const double *f, +void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS*, const double *h, const double *f, cubic_spline_coef *coef, unsigned int n, MPI_Comm comm ); -void Complete_Cubic_Spline( const double *h, const double *f, double v0, double vlast, +void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS*, const double *h, const double *f, double v0, double vlast, cubic_spline_coef *coef, unsigned int n, MPI_Comm comm ); -int Init_Lookup_Tables( reax_system*, control_params*, storage*, +int Init_Lookup_Tables( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, storage*, mpi_datatypes*, char* ); -void Deallocate_Lookup_Tables( reax_system* ); +void Deallocate_Lookup_Tables( LAMMPS_NS::LAMMPS*, reax_system* ); #endif diff --git a/src/USER-REAXC/reaxc_multi_body.cpp b/src/USER-REAXC/reaxc_multi_body.cpp index f7d72a2678..a16c4eb42b 100644 --- a/src/USER-REAXC/reaxc_multi_body.cpp +++ b/src/USER-REAXC/reaxc_multi_body.cpp @@ -32,7 +32,7 @@ void Atom_Energy( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, - output_controls * /*out_control*/ ) + output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* lmp ) { int i, j, pj, type_i, type_j; double Delta_lpcorr, dfvl; diff --git a/src/USER-REAXC/reaxc_multi_body.h b/src/USER-REAXC/reaxc_multi_body.h index a17c9f484e..dc2c1040eb 100644 --- a/src/USER-REAXC/reaxc_multi_body.h +++ b/src/USER-REAXC/reaxc_multi_body.h @@ -30,6 +30,6 @@ #include "reaxc_types.h" void Atom_Energy( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); + storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL ); #endif diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index d9cb5f22fe..49a9f096dd 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -144,10 +144,10 @@ void Reset_Neighbor_Lists( LAMMPS *lmp, reax_system *system, control_params *con if (total_bonds >= bonds->num_intrs * DANGER_ZONE) { workspace->realloc.bonds = 1; if (total_bonds >= bonds->num_intrs) { - fprintf(stderr, - "p%d: not enough space for bonds! total=%d allocated=%d\n", - system->my_rank, total_bonds, bonds->num_intrs ); - lmp->error->all(FLERR, "Can't allocate space for hbonds."); + char errmsg[256]; + snprintf(errmsg, 256, "p%d: not enough space for bonds! total=%d allocated=%d\n", + system->my_rank, total_bonds, bonds->num_intrs); + lmp->error->one(FLERR, errmsg); } } } @@ -170,10 +170,10 @@ void Reset_Neighbor_Lists( LAMMPS *lmp, reax_system *system, control_params *con if (total_hbonds >= hbonds->num_intrs * 0.90/*DANGER_ZONE*/) { workspace->realloc.hbonds = 1; if (total_hbonds >= hbonds->num_intrs) { - fprintf(stderr, - "p%d: not enough space for hbonds! total=%d allocated=%d\n", - system->my_rank, total_hbonds, hbonds->num_intrs ); - lmp->error->all(FLERR, "Can't allocate space for hbonds."); + char errmsg[256]; + snprintf(errmsg, 256, "p%d: not enough space for hbonds! total=%d allocated=%d\n", + system->my_rank, total_hbonds, hbonds->num_intrs); + lmp->error->one(FLERR, errmsg); } } } diff --git a/src/USER-REAXC/reaxc_tool_box.cpp b/src/USER-REAXC/reaxc_tool_box.cpp index 9e662e7a45..eaa6765f36 100644 --- a/src/USER-REAXC/reaxc_tool_box.cpp +++ b/src/USER-REAXC/reaxc_tool_box.cpp @@ -53,23 +53,25 @@ int Tokenize( char* s, char*** tok ) return count; } + + /* safe malloc */ -void *smalloc( rc_bigint n, const char *name, MPI_Comm comm ) +void *smalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, const char *name, MPI_Comm comm ) { void *ptr; + char errmsg[256]; if (n <= 0) { - fprintf( stderr, "WARNING: trying to allocate %ld bytes for array %s. ", - n, name ); - fprintf( stderr, "returning NULL.\n" ); + snprintf(errmsg, 256, "Trying to allocate %ld bytes for array %s. " + "returning NULL.", n, name); + lmp->error->warning(FLERR,errmsg); return NULL; } ptr = malloc( n ); if (ptr == NULL) { - fprintf( stderr, "ERROR: failed to allocate %ld bytes for array %s", - n, name ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + snprintf(errmsg, 256, "Failed to allocate %ld bytes for array %s", n, name); + lmp->error->one(FLERR,errmsg); } return ptr; @@ -77,29 +79,30 @@ void *smalloc( rc_bigint n, const char *name, MPI_Comm comm ) /* safe calloc */ -void *scalloc( rc_bigint n, rc_bigint size, const char *name, MPI_Comm comm ) +void *scalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, rc_bigint size, const char *name, MPI_Comm comm ) { void *ptr; + char errmsg[256]; if (n <= 0) { - fprintf( stderr, "WARNING: trying to allocate %ld elements for array %s. ", - n, name ); - fprintf( stderr, "returning NULL.\n" ); + snprintf(errmsg, 256, "Trying to allocate %ld elements for array %s. " + "returning NULL.\n", n, name ); + lmp->error->warning(FLERR,errmsg); return NULL; } if (size <= 0) { - fprintf( stderr, "WARNING: elements size for array %s is %ld. ", - name, size ); - fprintf( stderr, "returning NULL.\n" ); + snprintf(errmsg, 256, "Elements size for array %s is %ld. " + "returning NULL", name, size ); + lmp->error->warning(FLERR,errmsg); return NULL; } ptr = calloc( n, size ); if (ptr == NULL) { - fprintf( stderr, "ERROR: failed to allocate %ld bytes for array %s", - n*size, name ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + char errmsg[256]; + snprintf(errmsg, 256, "Failed to allocate %ld bytes for array %s", n*size, name); + lmp->error->one(FLERR,errmsg); } return ptr; @@ -107,11 +110,12 @@ void *scalloc( rc_bigint n, rc_bigint size, const char *name, MPI_Comm comm ) /* safe free */ -void sfree( void *ptr, const char *name ) +void sfree( LAMMPS_NS::LAMMPS* lmp, void *ptr, const char *name ) { if (ptr == NULL) { - fprintf( stderr, "WARNING: trying to free the already NULL pointer %s!\n", - name ); + char errmsg[256]; + snprintf(errmsg, 256, "Trying to free the already NULL pointer %s", name ); + lmp->error->one(FLERR,errmsg); return; } diff --git a/src/USER-REAXC/reaxc_tool_box.h b/src/USER-REAXC/reaxc_tool_box.h index 7f8dd455ca..7c5ab12587 100644 --- a/src/USER-REAXC/reaxc_tool_box.h +++ b/src/USER-REAXC/reaxc_tool_box.h @@ -37,7 +37,7 @@ double Get_Time( ); int Tokenize( char*, char*** ); /* from lammps */ -void *smalloc( rc_bigint, const char*, MPI_Comm ); -void *scalloc( rc_bigint, rc_bigint, const char*, MPI_Comm ); -void sfree( void*, const char* ); +void *smalloc( LAMMPS_NS::LAMMPS*, rc_bigint, const char*, MPI_Comm ); +void *scalloc( LAMMPS_NS::LAMMPS*, rc_bigint, rc_bigint, const char*, MPI_Comm ); +void sfree( LAMMPS_NS::LAMMPS*, void*, const char* ); #endif diff --git a/src/USER-REAXC/reaxc_torsion_angles.cpp b/src/USER-REAXC/reaxc_torsion_angles.cpp index ed76368d68..50c3412928 100644 --- a/src/USER-REAXC/reaxc_torsion_angles.cpp +++ b/src/USER-REAXC/reaxc_torsion_angles.cpp @@ -120,7 +120,8 @@ double Calculate_Omega( rvec dvec_ij, double r_ij, void Torsion_Angles( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control ) + reax_list **lists, output_controls *out_control, + LAMMPS_NS::LAMMPS* lmp ) { int i, j, k, l, pi, pj, pk, pl, pij, plk, natoms; int type_i, type_j, type_k, type_l; diff --git a/src/USER-REAXC/reaxc_torsion_angles.h b/src/USER-REAXC/reaxc_torsion_angles.h index 755e8c6532..38236cb7dc 100644 --- a/src/USER-REAXC/reaxc_torsion_angles.h +++ b/src/USER-REAXC/reaxc_torsion_angles.h @@ -30,6 +30,7 @@ #include "reaxc_types.h" void Torsion_Angles( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); + storage*, reax_list**, output_controls*, + LAMMPS_NS::LAMMPS* = NULL ); #endif diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 54d8b3219c..ee2939d662 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -29,7 +29,7 @@ #include "reaxc_list.h" #include "reaxc_tool_box.h" -int Reallocate_Output_Buffer( output_controls *out_control, int req_space, +int Reallocate_Output_Buffer( LAMMPS_NS::LAMMPS *lmp, output_controls *out_control, int req_space, MPI_Comm comm ) { if (out_control->buffer_len > 0) @@ -38,10 +38,9 @@ int Reallocate_Output_Buffer( output_controls *out_control, int req_space, out_control->buffer_len = (int)(req_space*SAFE_ZONE); out_control->buffer = (char*) malloc(out_control->buffer_len*sizeof(char)); if (out_control->buffer == NULL) { - fprintf( stderr, - "insufficient memory for required buffer size %d. terminating!\n", - (int) (req_space*SAFE_ZONE) ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + char errmsg[256]; + snprintf(errmsg, 256, "Insufficient memory for required buffer size %d", (int) (req_space*SAFE_ZONE)); + lmp->error->one(FLERR,errmsg); } return SUCCESS; @@ -57,7 +56,7 @@ void Write_Skip_Line( output_controls *out_control, mpi_datatypes * /*mpi_data*/ } -int Write_Header( reax_system *system, control_params *control, +int Write_Header( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, output_controls *out_control, mpi_datatypes *mpi_data ) { int num_hdr_lines, my_hdr_lines, buffer_req; @@ -83,7 +82,7 @@ int Write_Header( reax_system *system, control_params *control, my_hdr_lines = num_hdr_lines * ( system->my_rank == MASTER_NODE ); buffer_req = my_hdr_lines * HEADER_LINE_LEN; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); /* only the master node writes into trajectory header */ if (system->my_rank == MASTER_NODE) { @@ -259,7 +258,7 @@ int Write_Header( reax_system *system, control_params *control, } -int Write_Init_Desc( reax_system *system, control_params * /*control*/, +int Write_Init_Desc( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params * /*control*/, output_controls *out_control, mpi_datatypes *mpi_data ) { int i, me, np, cnt, buffer_len, buffer_req; @@ -278,7 +277,7 @@ int Write_Init_Desc( reax_system *system, control_params * /*control*/, else buffer_req = system->n * INIT_DESC_LEN + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); out_control->line[0] = 0; out_control->buffer[0] = 0; @@ -311,7 +310,7 @@ int Write_Init_Desc( reax_system *system, control_params * /*control*/, } -int Init_Traj( reax_system *system, control_params *control, +int Init_Traj( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, output_controls *out_control, mpi_datatypes *mpi_data, char *msg ) { @@ -348,14 +347,14 @@ int Init_Traj( reax_system *system, control_params *control, strcpy( msg, "init_traj: unknown trajectory option" ); return FAILURE; } - Write_Header( system, control, out_control, mpi_data ); - Write_Init_Desc( system, control, out_control, mpi_data ); + Write_Header( lmp, system, control, out_control, mpi_data ); + Write_Init_Desc( lmp, system, control, out_control, mpi_data ); return SUCCESS; } -int Write_Frame_Header( reax_system *system, control_params *control, +int Write_Frame_Header( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, output_controls *out_control, mpi_datatypes *mpi_data ) { @@ -367,7 +366,7 @@ int Write_Frame_Header( reax_system *system, control_params *control, my_frm_hdr_lines = num_frm_hdr_lines * ( me == MASTER_NODE ); buffer_req = my_frm_hdr_lines * HEADER_LINE_LEN; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); /* only the master node writes into trajectory header */ if (me == MASTER_NODE) { @@ -481,7 +480,7 @@ int Write_Frame_Header( reax_system *system, control_params *control, -int Write_Atoms( reax_system *system, control_params * /*control*/, +int Write_Atoms( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params * /*control*/, output_controls *out_control, mpi_datatypes *mpi_data ) { int i, me, np, line_len, buffer_len, buffer_req, cnt; @@ -500,7 +499,7 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, else buffer_req = system->n * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); /* fill in buffer */ out_control->line[0] = 0; @@ -531,9 +530,7 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q ); break; default: - fprintf( stderr, - "write_traj_atoms: unknown atom trajectroy format!\n"); - MPI_Abort( mpi_data->world, UNKNOWN_OPTION ); + lmp->error->all(FLERR,"Write_traj_atoms: unknown atom trajectory format"); } strncpy( out_control->buffer + i*line_len, out_control->line, line_len+1 ); @@ -559,7 +556,7 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, } -int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, +int Write_Bonds( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, reax_list *bonds, output_controls *out_control, mpi_datatypes *mpi_data) { int i, j, pj, me, np; @@ -592,7 +589,7 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, else buffer_req = my_bonds * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); /* fill in the buffer */ out_control->line[0] = 0; @@ -619,8 +616,7 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, bo_ij->bo_data.BO_pi, bo_ij->bo_data.BO_pi2 ); break; default: - fprintf(stderr, "write_traj_bonds: FATAL! invalid bond_info option"); - MPI_Abort( mpi_data->world, UNKNOWN_OPTION ); + lmp->error->all(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); } strncpy( out_control->buffer + my_bonds*line_len, out_control->line, line_len+1 ); @@ -649,7 +645,7 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, } -int Write_Angles( reax_system *system, control_params *control, +int Write_Angles( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, reax_list *bonds, reax_list *thb_intrs, output_controls *out_control, mpi_datatypes *mpi_data ) { @@ -693,7 +689,7 @@ int Write_Angles( reax_system *system, control_params *control, else buffer_req = my_angles * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); /* fill in the buffer */ my_angles = 0; @@ -744,20 +740,20 @@ int Write_Angles( reax_system *system, control_params *control, } -int Append_Frame( reax_system *system, control_params *control, +int Append_Frame( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, simulation_data *data, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data ) { - Write_Frame_Header( system, control, data, out_control, mpi_data ); + Write_Frame_Header( lmp, system, control, data, out_control, mpi_data ); if (out_control->write_atoms) - Write_Atoms( system, control, out_control, mpi_data ); + Write_Atoms( lmp, system, control, out_control, mpi_data ); if (out_control->write_bonds) - Write_Bonds( system, control, (*lists + BONDS), out_control, mpi_data ); + Write_Bonds( lmp, system, control, (*lists + BONDS), out_control, mpi_data ); if (out_control->write_angles) - Write_Angles( system, control, (*lists + BONDS), (*lists + THREE_BODIES), + Write_Angles( lmp, system, control, (*lists + BONDS), (*lists + THREE_BODIES), out_control, mpi_data ); return SUCCESS; diff --git a/src/USER-REAXC/reaxc_traj.h b/src/USER-REAXC/reaxc_traj.h index 72c56637eb..5508d27cdb 100644 --- a/src/USER-REAXC/reaxc_traj.h +++ b/src/USER-REAXC/reaxc_traj.h @@ -73,11 +73,11 @@ enum BOND_LINE_OPTS { OPT_NOBOND, OPT_BOND_BASIC, OPT_BOND_FULL, NR_OPT_BOND }; enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; -int Init_Traj( reax_system*, control_params*, output_controls*, +int Init_Traj( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, output_controls*, mpi_datatypes*, char* ); int End_Traj( int, output_controls* ); -int Append_Frame( reax_system*, control_params*, simulation_data*, +int Append_Frame( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, simulation_data*, reax_list**, output_controls*, mpi_datatypes* ); #endif diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 2666fcf85c..cf6d5dcddc 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -39,6 +39,9 @@ #include #include "accelerator_kokkos.h" +#include "lammps.h" +#include "error.h" + #if defined LMP_USER_OMP #define OMP_TIMING 0 @@ -899,9 +902,9 @@ typedef void (*evolve_function)(reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*, mpi_datatypes* ); -typedef void (*interaction_function) (reax_system*, control_params*, +typedef void (*interaction_function) ( reax_system*, control_params*, simulation_data*, storage*, - reax_list**, output_controls*); + reax_list**, output_controls*, LAMMPS_NS::LAMMPS*); typedef void (*print_interaction)(reax_system*, control_params*, simulation_data*, storage*, diff --git a/src/USER-REAXC/reaxc_valence_angles.cpp b/src/USER-REAXC/reaxc_valence_angles.cpp index af1f1f8003..d762dc1611 100644 --- a/src/USER-REAXC/reaxc_valence_angles.cpp +++ b/src/USER-REAXC/reaxc_valence_angles.cpp @@ -76,7 +76,7 @@ void Calculate_dCos_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, void Valence_Angles( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/ ) + reax_list **lists, output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* lmp) { int i, j, pi, k, pk, t; int type_i, type_j, type_k; @@ -405,9 +405,10 @@ void Valence_Angles( reax_system *system, control_params *control, if (num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE) { workspace->realloc.num_3body = num_thb_intrs; if (num_thb_intrs > thb_intrs->num_intrs) { - fprintf( stderr, "step%d-ran out of space on angle_list: top=%d, max=%d", - data->step, num_thb_intrs, thb_intrs->num_intrs ); - MPI_Abort( MPI_COMM_WORLD, INSUFFICIENT_MEMORY ); + char errmsg[128]; + snprintf(errmsg, 128, "step%d-ran out of space on angle_list: top=%d, max=%d", + data->step, num_thb_intrs, thb_intrs->num_intrs); + lmp->error->one(FLERR, errmsg); } } diff --git a/src/USER-REAXC/reaxc_valence_angles.h b/src/USER-REAXC/reaxc_valence_angles.h index 31936ba190..27bda3ba09 100644 --- a/src/USER-REAXC/reaxc_valence_angles.h +++ b/src/USER-REAXC/reaxc_valence_angles.h @@ -30,7 +30,7 @@ #include "reaxc_types.h" void Valence_Angles( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls* ); + storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL); void Calculate_Theta( rvec, double, rvec, double, double*, double* ); From 75ddde438c13cf32564a9271c03d6867c5db92bc Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 12 Mar 2019 14:38:49 -0600 Subject: [PATCH 0221/1242] Commit JT 031219 - correct errors in fix_prec_spin - clean version of spinmin --- src/REPLICA/fix_neb_spin.cpp | 3 +- src/SPIN/fix_precession_spin.cpp | 10 +- src/SPIN/min_spinmin.cpp | 242 +++++++++---------------------- src/SPIN/min_spinmin.h | 4 +- src/min.cpp | 8 + src/min.h | 5 + 6 files changed, 86 insertions(+), 186 deletions(-) diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/REPLICA/fix_neb_spin.cpp index 42450c2f0f..7a72936200 100644 --- a/src/REPLICA/fix_neb_spin.cpp +++ b/src/REPLICA/fix_neb_spin.cpp @@ -337,7 +337,8 @@ void FixNEB_spin::min_post_force(int /*vflag*/) //printf("test veng: %g / %g / %g \n",veng,vprev,vnext); //error->universe_all(FLERR,"End test"); - if (FreeEndFinal && ireplica == nreplica-1 && (update->ntimestep == 0)) EFinalIni = veng; + if (FreeEndFinal && ireplica == nreplica-1 && (update->ntimestep == 0)) + EFinalIni = veng; if (ireplica == 0) vIni=veng; diff --git a/src/SPIN/fix_precession_spin.cpp b/src/SPIN/fix_precession_spin.cpp index 08e4fd5a63..433a260e83 100644 --- a/src/SPIN/fix_precession_spin.cpp +++ b/src/SPIN/fix_precession_spin.cpp @@ -173,8 +173,6 @@ void FixPrecessionSpin::setup(int vflag) void FixPrecessionSpin::post_force(int /*vflag*/) { - printf("test inside post force (precession) \n"); - // update mag field with time (potential improvement) if (varflag != CONSTANT) { @@ -204,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]; @@ -232,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; } /* ---------------------------------------------------------------------- */ diff --git a/src/SPIN/min_spinmin.cpp b/src/SPIN/min_spinmin.cpp index 2e03086bf0..cdd0d45287 100644 --- a/src/SPIN/min_spinmin.cpp +++ b/src/SPIN/min_spinmin.cpp @@ -46,14 +46,13 @@ MinSpinMin::MinSpinMin(LAMMPS *lmp) : Min(lmp) {} void MinSpinMin::init() { + alpha_damp = 1.0; + discret_factor = 10.0; + Min::init(); - dt = update->dt; + dts = dt = update->dt; last_negative = update->ntimestep; - - // test dts - dts = dt; - } /* ---------------------------------------------------------------------- */ @@ -94,8 +93,7 @@ void MinSpinMin::reset_vectors() int MinSpinMin::iterate(int maxiter) { bigint ntimestep; - //double vmax,vdotf,vdotfall,fdotf,fdotfall,scale; - //double dtvone,dtv,dtf,dtfm; + double fmdotfm,fmdotfmall; int flag,flagall; for (int iter = 0; iter < maxiter; iter++) { @@ -114,106 +112,6 @@ int MinSpinMin::iterate(int maxiter) advance_spins(dts); - - //// zero velocity if anti-parallel to force - //// else project velocity in direction of force - - //double **v = atom->v; - //double **f = atom->f; - //int nlocal = atom->nlocal; - - //vdotf = 0.0; - //for (int i = 0; i < nlocal; i++) - // vdotf += v[i][0]*f[i][0] + v[i][1]*f[i][1] + v[i][2]*f[i][2]; - //MPI_Allreduce(&vdotf,&vdotfall,1,MPI_DOUBLE,MPI_SUM,world); - - // sum vdotf over replicas, if necessary - // this communicator would be invalid for multiprocess replicas - - //if (update->multireplica == 1) { - // vdotf = vdotfall; - // MPI_Allreduce(&vdotf,&vdotfall,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - //} - - //if (vdotfall < 0.0) { - // last_negative = ntimestep; - // for (int i = 0; i < nlocal; i++) - // v[i][0] = v[i][1] = v[i][2] = 0.0; - - //} else { - // fdotf = 0.0; - // for (int i = 0; i < nlocal; i++) - // fdotf += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - // MPI_Allreduce(&fdotf,&fdotfall,1,MPI_DOUBLE,MPI_SUM,world); - - // // sum fdotf over replicas, if necessary - // // this communicator would be invalid for multiprocess replicas - - // if (update->multireplica == 1) { - // fdotf = fdotfall; - // MPI_Allreduce(&fdotf,&fdotfall,1,MPI_DOUBLE,MPI_SUM,universe->uworld); - // } - - // if (fdotfall == 0.0) scale = 0.0; - // else scale = vdotfall/fdotfall; - // for (int i = 0; i < nlocal; i++) { - // v[i][0] = scale * f[i][0]; - // v[i][1] = scale * f[i][1]; - // v[i][2] = scale * f[i][2]; - // } - //} - - //// limit timestep so no particle moves further than dmax - - //double *rmass = atom->rmass; - //double *mass = atom->mass; - //int *type = atom->type; - - //dtvone = dt; - - //for (int i = 0; i < nlocal; i++) { - // vmax = MAX(fabs(v[i][0]),fabs(v[i][1])); - // vmax = MAX(vmax,fabs(v[i][2])); - // if (dtvone*vmax > dmax) dtvone = dmax/vmax; - //} - //MPI_Allreduce(&dtvone,&dtv,1,MPI_DOUBLE,MPI_MIN,world); - - //// min dtv over replicas, if necessary - //// this communicator would be invalid for multiprocess replicas - - //if (update->multireplica == 1) { - // dtvone = dtv; - // MPI_Allreduce(&dtvone,&dtv,1,MPI_DOUBLE,MPI_MIN,universe->uworld); - //} - - //dtf = dtv * force->ftm2v; - - //// Euler integration step - - //double **x = atom->x; - - //if (rmass) { - // for (int i = 0; i < nlocal; i++) { - // dtfm = dtf / rmass[i]; - // x[i][0] += dtv * v[i][0]; - // x[i][1] += dtv * v[i][1]; - // x[i][2] += dtv * v[i][2]; - // v[i][0] += dtfm * f[i][0]; - // v[i][1] += dtfm * f[i][1]; - // v[i][2] += dtfm * f[i][2]; - // } - //} else { - // for (int i = 0; i < nlocal; i++) { - // dtfm = dtf / mass[type[i]]; - // x[i][0] += dtv * v[i][0]; - // x[i][1] += dtv * v[i][1]; - // x[i][2] += dtv * v[i][2]; - // v[i][0] += dtfm * f[i][0]; - // v[i][1] += dtfm * f[i][1]; - // v[i][2] += dtfm * f[i][2]; - // } - //} - eprevious = ecurrent; ecurrent = energy_force(0); neval++; @@ -237,37 +135,22 @@ int MinSpinMin::iterate(int maxiter) } } - //// magnetic force tolerance criterion - //// sync across replicas if running multi-replica minimization + // magnetic torque tolerance criterion + // sync across replicas if running multi-replica minimization - //if (update->fmtol > 0.0) { - // fmdotfm = fmnorm_sqr(); - // if (update->multireplica == 0) { - // if (fmdotfm < update->fmtol*update->fmtol) return FTOL; - // } else { - // if (fmdotfm < update->fmtol*update->fmtol) flag = 0; - // else flag = 1; - // MPI_Allreduce(&fmlag,&fmlagall,1,MPI_INT,MPI_SUM,universe->uworld); - // if (fmlagall == 0) return FTOL; - // } - //} - - //// force 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; + } + } - //if (update->ftol > 0.0) { - // fdotf = fnorm_sqr(); - // if (update->multireplica == 0) { - // if (fdotf < update->ftol*update->ftol) return FTOL; - // } else { - // if (fdotf < 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 + // output for thermo, dump, restart files if (output->next == ntimestep) { timer->stamp(); @@ -299,12 +182,6 @@ double MinSpinMin::evaluate_dt() fmsq = fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]; fmaxsqone = MAX(fmaxsqone,fmsq); } - //printf("test inside evaluate dt, fmaxsqone = %g \n",fmaxsqone); - //for (int i = 0; i < nlocal; i++) - // if (mask[i] & groupbit) { - // 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 @@ -320,15 +197,13 @@ double MinSpinMin::evaluate_dt() MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); } - //if (fmaxsqall < fmaxsqloc) - // error->all(FLERR,"Incorrect fmaxall calc."); + if (fmaxsqall == 0.0) + error->all(FLERR,"Incorrect fmaxsqall calculation"); - // define max timestep - // dividing by 10 the inverse of max frequency - //printf("test inside evaluate dt, fmaxsqall = %g \n",fmaxsqall); + // define max timestep by dividing by the + // inverse of max frequency by discret_factor - dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); - //printf("test inside evaluate dt, dtmax = %g \n",dtmax); + dtmax = MY_2PI/(discret_factor*sqrt(fmaxsqall)); return dtmax; } @@ -345,28 +220,19 @@ void MinSpinMin::advance_spins(double dts) double **fm = atom->fm; double tdampx,tdampy,tdampz; double msq,scale,fm2,energy,dts2; - double alpha; double cp[3],g[3]; dts2 = dts*dts; - // fictitious Gilbert damping of 1 - - alpha = 1.0; - - // loop on all spins on proc. - //if (ireplica != nreplica-1 && ireplica != 0) - // for (int i = 0; i < nlocal; i++) - // if (mask[i] & groupbit) { for (int i = 0; i < nlocal; i++) { // calc. damping torque - tdampx = -alpha*(fm[i][1]*sp[i][2] - fm[i][2]*sp[i][1]); - tdampy = -alpha*(fm[i][2]*sp[i][0] - fm[i][0]*sp[i][2]); - tdampz = -alpha*(fm[i][0]*sp[i][1] - fm[i][1]*sp[i][0]); + 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) @@ -401,22 +267,44 @@ void MinSpinMin::advance_spins(double dts) sp[i][1] *= scale; sp[i][2] *= scale; - // comm. sp[i] to atoms with same tag (for serial algo) - - // no need for simplecticity - //if (sector_flag == 0) { - // if (sametag[i] >= 0) { - // j = sametag[i]; - // while (j >= 0) { - // sp[j][0] = sp[i][0]; - // sp[j][1] = sp[i][1]; - // sp[j][2] = sp[i][2]; - // j = sametag[j]; - // } - // } - //} - // + // no comm. to atoms with same tag + // because no need for simplecticity } - +} + +/* ---------------------------------------------------------------------- + compute and return ||mag. torque||_2^2 +------------------------------------------------------------------------- */ + +double MinSpinMin::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_spinmin.h b/src/SPIN/min_spinmin.h index 943b2d2749..abc532a3d5 100644 --- a/src/SPIN/min_spinmin.h +++ b/src/SPIN/min_spinmin.h @@ -34,12 +34,12 @@ class MinSpinMin : public Min { int iterate(int); double evaluate_dt(); void advance_spins(double); - - class FixNEB_spin *fneb; + double fmnorm_sqr(); private: // global and spin timesteps + double dt; double dts; diff --git a/src/min.cpp b/src/min.cpp index cd9253f8d3..c75db6e2b0 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -655,6 +655,14 @@ 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 if (strcmp(arg[iarg],"alpha_damp") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command"); + alpha_damp = force->numeric(FLERR,arg[iarg+1]); + iarg += 2; + } else if (strcmp(arg[iarg],"discret_factor") == 0) { + if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command"); + discret_factor = force->numeric(FLERR,arg[iarg+1]); + iarg += 2; } else error->all(FLERR,"Illegal min_modify command"); } } diff --git a/src/min.h b/src/min.h index 92da97c664..ba1885671e 100644 --- a/src/min.h +++ b/src/min.h @@ -58,6 +58,11 @@ class Min : protected Pointers { double dmax; // max dist to move any atom in one step int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero + // spinmin quantities + + double alpha_damp; // damping for spin minimization + double discret_factor; // factor for spin timestep evaluation + int nelist_global,nelist_atom; // # of PE,virial computes to check int nvlist_global,nvlist_atom; class Compute **elist_global; // lists of PE,virial Computes From b51d06b3ea598eab8114337e136b3591a2e01582 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 12 Mar 2019 15:33:28 -0600 Subject: [PATCH 0222/1242] Change default binsize for Kokkos if running on GPUs --- src/KOKKOS/neighbor_kokkos.cpp | 9 +++++++++ src/KOKKOS/neighbor_kokkos.h | 1 + src/neighbor.cpp | 3 +++ src/neighbor.h | 1 + 4 files changed, 14 insertions(+) diff --git a/src/KOKKOS/neighbor_kokkos.cpp b/src/KOKKOS/neighbor_kokkos.cpp index 6cd5c4e6e5..7aaeda4b37 100644 --- a/src/KOKKOS/neighbor_kokkos.cpp +++ b/src/KOKKOS/neighbor_kokkos.cpp @@ -30,6 +30,7 @@ #include "style_nstencil.h" #include "style_npair.h" #include "style_ntopo.h" +#include "comm.h" using namespace LAMMPS_NS; @@ -359,6 +360,14 @@ void NeighborKokkos::modify_mol_intra_grow_kokkos(){ k_ex_mol_intra.modify(); } +/* ---------------------------------------------------------------------- */ +void NeighborKokkos::set_binsize_kokkos() { + if (!binsizeflag && lmp->kokkos->ngpu > 0) { + binsize_user = cutneighmax; + binsizeflag = 1; + } +} + /* ---------------------------------------------------------------------- */ void NeighborKokkos::init_topology() { diff --git a/src/KOKKOS/neighbor_kokkos.h b/src/KOKKOS/neighbor_kokkos.h index 5c98c4d26d..3829502c0d 100644 --- a/src/KOKKOS/neighbor_kokkos.h +++ b/src/KOKKOS/neighbor_kokkos.h @@ -87,6 +87,7 @@ class NeighborKokkos : public Neighbor { void modify_ex_group_grow_kokkos(); void modify_mol_group_grow_kokkos(); void modify_mol_intra_grow_kokkos(); + void set_binsize_kokkos(); }; } diff --git a/src/neighbor.cpp b/src/neighbor.cpp index 84494bfbc5..2dc65541e4 100644 --- a/src/neighbor.cpp +++ b/src/neighbor.cpp @@ -471,6 +471,9 @@ void Neighbor::init() error->warning(FLERR,"Neighbor exclusions used with KSpace solver " "may give inconsistent Coulombic energies"); + if (lmp->kokkos) + set_binsize_kokkos(); + // ------------------------------------------------------------------ // create pairwise lists // one-time call to init_styles() to scan style files and setup diff --git a/src/neighbor.h b/src/neighbor.h index 751beeae4b..ffe181313b 100644 --- a/src/neighbor.h +++ b/src/neighbor.h @@ -233,6 +233,7 @@ class Neighbor : protected Pointers { virtual void init_ex_bit_kokkos() {} virtual void init_ex_mol_bit_kokkos() {} virtual void grow_ex_mol_intra_kokkos() {} + virtual void set_binsize_kokkos() {} }; namespace NeighConst { From 0d73fe99fd94c35a3c894c4ab1d4c26ec51aea5b Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 12 Mar 2019 15:34:12 -0600 Subject: [PATCH 0223/1242] Update Kokkos docs --- doc/src/Speed_kokkos.txt | 4 ++-- doc/src/package.txt | 44 ++++++++++++++++++++-------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/doc/src/Speed_kokkos.txt b/doc/src/Speed_kokkos.txt index ef193d7401..d04f8ac6f1 100644 --- a/doc/src/Speed_kokkos.txt +++ b/doc/src/Speed_kokkos.txt @@ -242,13 +242,13 @@ pairwise and bonded interactions, along with threaded communication. When running on Maxwell or Kepler GPUs, this will typically be best. For Pascal GPUs, using "half" neighbor lists and setting the Newton flag to "on" may be faster. For many pair styles, setting the -neighbor binsize equal to the ghost atom cutoff will give speedup. +neighbor binsize equal to twice the CPU default value will give speedup, +which is the default when running on GPUs. Use the "-pk kokkos" "command-line switch"_Run_options.html to change the default "package kokkos"_package.html options. See its doc page for details and default settings. Experimenting with its options can provide a speed-up for specific calculations. For example: -mpirun -np 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -pk kokkos binsize 2.8 -in in.lj # Set binsize = neighbor ghost cutoff mpirun -np 2 lmp_kokkos_cuda_openmpi -k on g 2 -sf kk -pk kokkos newton on neigh half binsize 2.8 -in in.lj # Newton on, half neighbor list, set binsize = neighbor ghost cutoff :pre NOTE: For good performance of the KOKKOS package on GPUs, you must diff --git a/doc/src/package.txt b/doc/src/package.txt index c226d7942f..89cfd03f5f 100644 --- a/doc/src/package.txt +++ b/doc/src/package.txt @@ -450,20 +450,20 @@ computation is done, but less communication. However, when running in MPI-only mode with 1 thread per MPI task, a value of {on} will typically be faster, just as it is for non-accelerated pair styles. -The {binsize} keyword sets the size of bins used to bin atoms in -neighbor list builds. The same value can be set by the "neigh_modify -binsize"_neigh_modify.html command. Making it an option in the -package kokkos command allows it to be set from the command line. The -default value is 0.0, which means the LAMMPS default will be used, -which is bins = 1/2 the size of the pairwise cutoff + neighbor skin -distance. This is fine when neighbor lists are built on the CPU. For -GPU builds, a 2x larger binsize equal to the pairwise cutoff + -neighbor skin, is often faster, which can be set by this keyword. -Note that if you use a longer-than-usual pairwise cutoff, e.g. to -allow for a smaller fraction of KSpace work with a "long-range -Coulombic solver"_kspace_style.html because the GPU is faster at -performing pairwise interactions, then this rule of thumb may give too -large a binsize. +The {binsize} keyword sets the size of bins used to bin atoms in +neighbor list builds. The same value can be set by the "neigh_modify +binsize"_neigh_modify.html command. Making it an option in the package +kokkos command allows it to be set from the command line. The default +value for CPUs is 0.0, which means the LAMMPS default will be used, +which is bins = 1/2 the size of the pairwise cutoff + neighbor skin +distance. This is fine when neighbor lists are built on the CPU. For GPU +builds, a 2x larger binsize equal to the pairwise cutoff + neighbor skin +is often faster, which is the default. Note that if you use a +longer-than-usual pairwise cutoff, e.g. to allow for a smaller fraction +of KSpace work with a "long-range Coulombic solver"_kspace_style.html +because the GPU is faster at performing pairwise interactions, then this +rule of thumb may give too large a binsize and the default should be +overridden with a smaller value. The {comm} and {comm/exchange} and {comm/forward} and {comm/reverse} keywords determine whether the host or device performs the packing and unpacking of data @@ -623,14 +623,14 @@ not used, you must invoke the package intel command in your input script or or via the "-pk intel" "command-line switch"_Run_options.html. -For the KOKKOS package, the option defaults neigh = full, neigh/qeq = -full, newton = off, binsize = 0.0, and comm = device, gpu/direct = on. -When LAMMPS can safely detect, that GPU-direct is not available, the -default value of gpu/direct becomes "off". -These settings are made automatically by the required "-k on" -"command-line switch"_Run_options.html. You can change them by -using the package kokkos command in your input script or via the -"-pk kokkos command-line switch"_Run_options.html. +For the KOKKOS package, the option defaults neigh = full, neigh/qeq = +full, newton = off, binsize for CPUs = 0.0, binsize for GPUs = 2x LAMMPS +default value, and comm = device, gpu/direct = on. When LAMMPS can +safely detect, that GPU-direct is not available, the default value of +gpu/direct becomes "off". These settings are made automatically by the +required "-k on" "command-line switch"_Run_options.html. You can change +them by using the package kokkos command in your input script or via the +"-pk kokkos command-line switch"_Run_options.html. For the OMP package, the default is Nthreads = 0 and the option defaults are neigh = yes. These settings are made automatically if From f6fb8b220d3b436d8ae003a62aa094f80f166d2e Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 12 Mar 2019 16:59:13 -0600 Subject: [PATCH 0224/1242] Commit 2 JT 031219 - modified examples (gneb and spinmin now distinct) - started documention for spinmin --- doc/src/min_modify.txt | 11 +- doc/src/min_style.txt | 15 +- examples/SPIN/{gneb_bfo => gneb}/README | 0 .../SPIN/{gneb_bfo => gneb}/final.iron_spin | 0 examples/SPIN/{gneb_bfo => gneb}/in.gneb.iron | 0 .../SPIN/{gneb_bfo => gneb}/initial.iron_spin | 0 .../SPIN/{gneb_bfo => spinmin}/in.spinmin.bfo | 14 +- .../{gneb_bfo => spinmin}/in.spinmin.iron | 21 +-- src/REPLICA/fix_neb_spin.cpp | 144 ------------------ 9 files changed, 42 insertions(+), 163 deletions(-) rename examples/SPIN/{gneb_bfo => gneb}/README (100%) rename examples/SPIN/{gneb_bfo => gneb}/final.iron_spin (100%) rename examples/SPIN/{gneb_bfo => gneb}/in.gneb.iron (100%) rename examples/SPIN/{gneb_bfo => gneb}/initial.iron_spin (100%) rename examples/SPIN/{gneb_bfo => spinmin}/in.spinmin.bfo (78%) rename examples/SPIN/{gneb_bfo => spinmin}/in.spinmin.iron (62%) diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index 9408eea167..bb5ad513c1 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 = defines a dividing factor for adaptive spin timestep (adim) :pre :ule [Examples:] @@ -65,6 +69,9 @@ 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 {spinmin} minimization style is declared. + [Restrictions:] none [Related commands:] diff --git a/doc/src/min_style.txt b/doc/src/min_style.txt index 4948a34864..b1a9da997d 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 {spinmin} :ul [Examples:] min_style cg +min_style spinmin min_style fire :pre [Description:] @@ -61,9 +62,21 @@ 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 {spinmin} is a damped spin dynamics with a variable +timestep as described in "(Tranchida)"_#Tranchida. +The value of the fictitious Gilbert damping and of the dividing +factor for the adaptive timestep can be modified by the +{alpha_damp} and {discret_factor} options respectively. +Those options can be defined using the "min_modify"_min_modify.html +command. + Either the {quickmin} and {fire} styles are useful in the context of nudged elastic band (NEB) calculations via the "neb"_neb.html command. +The {spinmin} style is useful in the context of geodesic nudged +elastic band (GNEB) calculations via the "neb/spin"_neb_spin.html +command. + NOTE: The damped dynamic minimizers use whatever timestep you have defined via the "timestep"_timestep.html command. Often they will converge more quickly if you use a timestep about 10x larger than you diff --git a/examples/SPIN/gneb_bfo/README b/examples/SPIN/gneb/README similarity index 100% rename from examples/SPIN/gneb_bfo/README rename to examples/SPIN/gneb/README diff --git a/examples/SPIN/gneb_bfo/final.iron_spin b/examples/SPIN/gneb/final.iron_spin similarity index 100% rename from examples/SPIN/gneb_bfo/final.iron_spin rename to examples/SPIN/gneb/final.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.gneb.iron b/examples/SPIN/gneb/in.gneb.iron similarity index 100% rename from examples/SPIN/gneb_bfo/in.gneb.iron rename to examples/SPIN/gneb/in.gneb.iron diff --git a/examples/SPIN/gneb_bfo/initial.iron_spin b/examples/SPIN/gneb/initial.iron_spin similarity index 100% rename from examples/SPIN/gneb_bfo/initial.iron_spin rename to examples/SPIN/gneb/initial.iron_spin diff --git a/examples/SPIN/gneb_bfo/in.spinmin.bfo b/examples/SPIN/spinmin/in.spinmin.bfo similarity index 78% rename from examples/SPIN/gneb_bfo/in.spinmin.bfo rename to examples/SPIN/spinmin/in.spinmin.bfo index 15a4d6e0f9..a00af8833c 100644 --- a/examples/SPIN/gneb_bfo/in.spinmin.bfo +++ b/examples/SPIN/spinmin/in.spinmin.bfo @@ -1,4 +1,4 @@ -# bcc iron in a 3d periodic box +# bfo in a 3d periodic box units metal dimension 3 @@ -9,7 +9,7 @@ atom_style spin atom_modify map array lattice sc 3.96 -region box block 0.0 68.0 0.0 68.0 0.0 1.0 +region box block 0.0 34.0 0.0 34.0 0.0 1.0 create_box 1 box create_atoms 1 box @@ -17,7 +17,6 @@ create_atoms 1 box mass 1 1.0 set group all spin/random 11 2.50 -#set group all spin 2.5 -1.0 0.0 0.0 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 @@ -30,7 +29,8 @@ 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 2 all langevin/spin 0.1 0.0 21 +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 @@ -50,8 +50,8 @@ 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 200 all custom 1 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] +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 spinmin -minimize 1.0e-6 1.0e-6 10000 10000 -#minimize 1.0e-8 1.0e-8 10000 1000 +min_modify alpha_damp 1.0 discret_factor 10.0 +minimize 0.0 0.0 10000 1000 diff --git a/examples/SPIN/gneb_bfo/in.spinmin.iron b/examples/SPIN/spinmin/in.spinmin.iron similarity index 62% rename from examples/SPIN/gneb_bfo/in.spinmin.iron rename to examples/SPIN/spinmin/in.spinmin.iron index 67d8095c06..5a15082122 100644 --- a/examples/SPIN/gneb_bfo/in.spinmin.iron +++ b/examples/SPIN/spinmin/in.spinmin.iron @@ -9,7 +9,7 @@ atom_style spin atom_modify map array lattice bcc 2.8665 -region box block 0.0 4.0 0.0 4.0 0.0 1.0 +region box block 0.0 4.0 0.0 4.0 0.0 4.0 create_box 1 box create_atoms 1 box @@ -17,7 +17,7 @@ create_atoms 1 box mass 1 55.845 set group all spin/random 31 2.2 -#set group all spin 2.2 -1.0 0.0 0.0 +#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 @@ -26,8 +26,9 @@ 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.001 0.0 0.0 1.0 -fix 2 all langevin/spin 0.1 0.0 21 +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 @@ -37,18 +38,20 @@ 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 1 -thermo_style custom step time v_magnorm v_emag v_tmag temp etotal +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 1 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] +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 spinmin -minimize 1.0e-6 1.0e-6 1000 10000 -#minimize 1.0e-8 1.0e-6 1000 10000 +min_modify alpha_damp 1.0 discret_factor 10.0 +minimize 1.0e-10 1.0e-10 100000 1000 diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/REPLICA/fix_neb_spin.cpp index 7a72936200..d8f9e655fd 100644 --- a/src/REPLICA/fix_neb_spin.cpp +++ b/src/REPLICA/fix_neb_spin.cpp @@ -843,156 +843,12 @@ double FixNEB_spin::geodesic_distance(double spi[3], double spj[3]) return dist; } -/* ---------------------------------------------------------------------- - geometric damped advance os spins ----------------------------------------------------------------------- */ - -//void FixNEB_spin::advance_spins(double dts) -//{ -// //int j=0; -// //int *sametag = atom->sametag; -// 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 alpha; -// double spi[3],fmi[3]; -// double cp[3],g[3]; -// -// //cp[0] = cp[1] = cp[2] = 0.0; -// //g[0] = g[1] = g[2] = 0.0; -// dts2 = dts*dts; -// -// // fictitious Gilbert damping of 1 -// alpha = 1.0; -// -// // loop on all spins on proc. -// -// if (ireplica != nreplica-1 && ireplica != 0) -// for (int i = 0; i < nlocal; i++) -// if (mask[i] & groupbit) { -// -// spi[0] = sp[i][0]; -// spi[1] = sp[i][1]; -// spi[2] = sp[i][2]; -// -// fmi[0] = fm[i][0]; -// fmi[1] = fm[i][1]; -// fmi[2] = fm[i][2]; -// -// // calc. damping torque -// -// tdampx = -alpha*(fmi[1]*spi[2] - fmi[2]*spi[1]); -// tdampy = -alpha*(fmi[2]*spi[0] - fmi[0]*spi[2]); -// tdampz = -alpha*(fmi[0]*spi[1] - fmi[1]*spi[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] += (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]; -// -// // 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; -// -// // comm. sp[i] to atoms with same tag (for serial algo) -// -// // no need for simplecticity -// //if (sector_flag == 0) { -// // if (sametag[i] >= 0) { -// // j = sametag[i]; -// // while (j >= 0) { -// // sp[j][0] = sp[i][0]; -// // sp[j][1] = sp[i][1]; -// // sp[j][2] = sp[i][2]; -// // j = sametag[j]; -// // } -// // } -// //} -// // -// -// } -//} - -/* ---------------------------------------------------------------------- - evaluate max timestep ----------------------------------------------------------------------- */ - -//double FixNEB_spin::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++) -// if (mask[i] & groupbit) { -// 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 -// -// if (update->multireplica == 1) { -// fmaxsqall = fmaxsqloc; -// MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); -// } -// -// if (fmaxsqall < fmaxsqloc) -// error->all(FLERR,"Incorrect fmaxall calc."); -// -// // define max timestep -// // dividing by 10 the inverse of max frequency -// -// dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); -// -// return dtmax; -//} - /* ---------------------------------------------------------------------- send/recv NEB atoms to/from adjacent replicas received atoms matching my local atoms are stored in xprev,xnext replicas 0 and N-1 send but do not receive any atoms ------------------------------------------------------------------------- */ - void FixNEB_spin::inter_replica_comm() { int i,m; From 2cc35ee7771f9fed8be9cba1521fd198485bad04 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Wed, 13 Mar 2019 00:42:08 -0600 Subject: [PATCH 0225/1242] 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 0226/1242] 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 0227/1242] 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 0228/1242] 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 0229/1242] 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 0230/1242] 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 0231/1242] 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 0232/1242] 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 0233/1242] 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 0234/1242] 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 0235/1242] 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 0236/1242] 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 0237/1242] 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 0238/1242] 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 8c50c3d7c87be57f356b9ad454fbe66799c3c7ef Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 13 Mar 2019 17:02:40 -0600 Subject: [PATCH 0239/1242] Commit JT 031319 - improved gneb functions - correct name in fix_neb (Weinan) --- doc/src/fix_neb.txt | 6 +- doc/src/min_modify.txt | 1 + src/REPLICA/fix_neb_spin.cpp | 72 ++---- src/REPLICA/neb_spin.cpp | 417 ++++++----------------------------- src/REPLICA/neb_spin.h | 6 +- 5 files changed, 82 insertions(+), 420 deletions(-) diff --git a/doc/src/fix_neb.txt b/doc/src/fix_neb.txt index 410ab3d4d1..87292bb5cd 100644 --- a/doc/src/fix_neb.txt +++ b/doc/src/fix_neb.txt @@ -97,7 +97,7 @@ Note that in this case the specified {Kspring} is in force/distance units. With a value of {ideal}, the spring force is computed as suggested in -"(WeinenE)"_#WeinenE : +"(WeinanE)"_#WeinanE : Fnudge_parallel = -{Kspring} * (RD-RDideal) / (2 * meanDist) :pre @@ -224,8 +224,8 @@ specified (no inter-replica force on the end replicas). [(Henkelman2)] Henkelman, Uberuaga, Jonsson, J Chem Phys, 113, 9901-9904 (2000). -:link(WeinenE) -[(WeinenE)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002). +:link(WeinanE) +[(WeinanE)] E, Ren, Vanden-Eijnden, Phys Rev B, 66, 052301 (2002). :link(Jonsson) [(Jonsson)] Jonsson, Mills and Jacobsen, in Classical and Quantum diff --git a/doc/src/min_modify.txt b/doc/src/min_modify.txt index bb5ad513c1..701f579af4 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -71,6 +71,7 @@ could move in the gradient direction to reduce forces further. Keywords {alpha_damp} and {discret_factor} only make sense when a {spinmin} minimization style is declared. +Default values are alpha_damp = 1.0 and discret_factor = 10.0. [Restrictions:] none diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/REPLICA/fix_neb_spin.cpp index d8f9e655fd..015ff1a313 100644 --- a/src/REPLICA/fix_neb_spin.cpp +++ b/src/REPLICA/fix_neb_spin.cpp @@ -69,65 +69,25 @@ FixNEB_spin::FixNEB_spin(LAMMPS *lmp, int narg, char **arg) : kspringPerp = 0.0; kspringIni = 1.0; kspringFinal = 1.0; - // only regular neb for now - SpinLattice = false; - + SpinLattice = false; // no spin-lattice neb for now + // no available fix neb/spin options for now int iarg = 4; while (iarg < narg) { - if (strcmp(arg[iarg],"lattice") == 0) - error->all(FLERR,"Illegal fix neb command"); - } - - /* if (strcmp(arg[iarg],"parallel") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix neb command"); - if (strcmp(arg[iarg+1],"ideal") == 0) { - NEBLongRange = true; - StandardNEB = false; - } else if (strcmp(arg[iarg+1],"neigh") == 0) { - NEBLongRange = false; - StandardNEB = true; - } else error->all(FLERR,"Illegal fix neb command"); + error->all(FLERR,"Illegal fix neb command"); iarg += 2; - } else if (strcmp(arg[iarg],"perp") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal fix neb command"); - PerpSpring = true; - kspringPerp = force->numeric(FLERR,arg[iarg+1]); - if (kspringPerp == 0.0) PerpSpring = false; - if (kspringPerp < 0.0) error->all(FLERR,"Illegal fix neb command"); + error->all(FLERR,"Illegal fix neb command"); iarg += 2; - } else if (strcmp (arg[iarg],"end") == 0) { - if (iarg+3 > narg) error->all(FLERR,"Illegal fix neb command"); - if (strcmp(arg[iarg+1],"first") == 0) { - FreeEndIni = true; - kspringIni = force->numeric(FLERR,arg[iarg+2]); - } else if (strcmp(arg[iarg+1],"last") == 0) { - FreeEndFinal = true; - FinalAndInterWithRespToEIni = false; - FreeEndFinalWithRespToEIni = false; - kspringFinal = force->numeric(FLERR,arg[iarg+2]); - } else if (strcmp(arg[iarg+1],"last/efirst") == 0) { - FreeEndFinal = false; - FinalAndInterWithRespToEIni = false; - FreeEndFinalWithRespToEIni = true; - kspringFinal = force->numeric(FLERR,arg[iarg+2]); - } else if (strcmp(arg[iarg+1],"last/efirst/middle") == 0) { - FreeEndFinal = false; - FinalAndInterWithRespToEIni = true; - FreeEndFinalWithRespToEIni = true; - kspringFinal = force->numeric(FLERR,arg[iarg+2]); - } else error->all(FLERR,"Illegal fix neb command"); - iarg += 3; - + } else if (strcmp (arg[iarg],"lattice") == 0) { + iarg += 2; } else error->all(FLERR,"Illegal fix neb command"); } - */ - + // nreplica = number of partitions // ireplica = which world I am in universe // nprocs_universe = # of procs in all replicase @@ -172,10 +132,6 @@ FixNEB_spin::FixNEB_spin(LAMMPS *lmp, int narg, char **arg) : modify->add_compute(3,newarg); delete [] newarg; - // might need a test - // => check if pe does not compute mech potentials - - // initialize local storage maxlocal = -1; @@ -374,14 +330,12 @@ void FixNEB_spin::min_post_force(int /*vflag*/) pe->addstep(update->ntimestep+1); double **x = atom->x; - // spin quantities double **sp = atom->sp; int *mask = atom->mask; double dot = 0.0; double prefactor = 0.0; - double **f = atom->f; - // spin quantities + //double **f = atom->f; double **fm = atom->fm; int nlocal = atom->nlocal; @@ -397,9 +351,10 @@ void FixNEB_spin::min_post_force(int /*vflag*/) // computation of the tangent vector - // final replica if (ireplica == nreplica-1) { + // final replica + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -470,8 +425,10 @@ void FixNEB_spin::min_post_force(int /*vflag*/) //} } - // initial replica } else if (ireplica == 0) { + + // initial replica + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -537,7 +494,6 @@ void FixNEB_spin::min_post_force(int /*vflag*/) //} } - // in-between replica } else { // not the first or last replica @@ -770,7 +726,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) //prefactor = -2.0*dot; } else { if (NEBLongRange) { - error->all(FLERR,"NEB_spin climber option not yet active"); + error->all(FLERR,"Long Range NEB_spin climber option not yet active"); //prefactor = -dot - kspring*(lenuntilIm-idealPos)/(2*meanDist); } else if (StandardNEB) { prefactor = -dot + kspring*(nlen-plen); diff --git a/src/REPLICA/neb_spin.cpp b/src/REPLICA/neb_spin.cpp index 6249797e95..e82b08e354 100644 --- a/src/REPLICA/neb_spin.cpp +++ b/src/REPLICA/neb_spin.cpp @@ -72,7 +72,8 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, double delspx,delspy,delspz; etol = etol_in; - ftol = ftol_in; + //ftol = ftol_in; + ttol = ftol_in; n1steps = n1steps_in; n2steps = n2steps_in; nevery = nevery_in; @@ -85,12 +86,10 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, uworld = universe->uworld; MPI_Comm_rank(world,&me); - // generate linear interpolate replica + // fraction to interpolate intermediate replica double fraction = ireplica/(nreplica-1.0); - double **x = atom->x; - // spin quantitites double **sp = atom->sp; int nlocal = atom->nlocal; @@ -111,19 +110,11 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, sp[i][1] = spfinal[1]; sp[i][2] = spfinal[2]; - //delx = buf_final[ii] - buf_init[ii]; - //dely = buf_final[ii+1] - buf_init[ii+1]; - //delz = buf_final[ii+2] - buf_init[ii+2]; - // adjust distance if pbc - // not implemented yet //domain->minimum_image(delx,dely,delz); - // need to define a procedure for circular initialization - - //x[i][0] = buf_init[ii] + fraction*delx; - //x[i][1] = buf_init[ii+1] + fraction*dely; - //x[i][2] = buf_init[ii+2] + fraction*delz; + // need to define a better procedure for circular initialization + ii += 3; } } @@ -143,22 +134,14 @@ NEB_spin::~NEB_spin() void NEB_spin::command(int narg, char **arg) { - - //printf("test 1 \n"); - - // test 1 - double **sp1 = atom->sp; - //printf("test 1 atom: i=%d,%g,%g,%g \n",1,sp1[1][0],sp1[1][1],sp1[1][2]); - //error->all(FLERR,"end neb_spin test"); - - if (domain->box_exist == 0) error->all(FLERR,"NEB_spin command before simulation box is defined"); if (narg < 6) error->universe_all(FLERR,"Illegal NEB_spin command"); etol = force->numeric(FLERR,arg[0]); - ftol = force->numeric(FLERR,arg[1]); + //ftol = force->numeric(FLERR,arg[1]); + ttol = force->numeric(FLERR,arg[1]); n1steps = force->inumeric(FLERR,arg[2]); n2steps = force->inumeric(FLERR,arg[3]); nevery = force->inumeric(FLERR,arg[4]); @@ -166,7 +149,8 @@ void NEB_spin::command(int narg, char **arg) // error checks if (etol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); - if (ftol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); + //if (ftol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); + if (ttol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); if (nevery <= 0) error->universe_all(FLERR,"Illegal NEB_spin command"); if (n1steps % nevery || n2steps % nevery) error->universe_all(FLERR,"Illegal NEB_spin command"); @@ -209,14 +193,6 @@ void NEB_spin::command(int narg, char **arg) verbose=false; if (strcmp(arg[narg-1],"verbose") == 0) verbose=true; - - - // test 1 - double **sp = atom->sp; - //printf("test 2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); - //error->all(FLERR,"end neb_spin test"); - - // run the NEB_spin calculation run(); } @@ -250,22 +226,24 @@ void NEB_spin::run() update->whichflag = 2; update->etol = etol; - update->ftol = ftol; + //update->ftol = ftol; + update->ftol = ttol; // update->ftol is a torque tolerance update->multireplica = 1; lmp->init(); - // put flag to check gilbert damping procedure is set + // check if correct minimizer is setup - //if (update->minimize->searchflag) - // error->all(FLERR,"NEB_spin requires damped dynamics minimizer"); + if (update->minimize->searchflag) + error->all(FLERR,"NEB_spin requires damped dynamics minimizer"); + if (strcmp(update->minimize_style,"spinmin") != 0) + error->all(FLERR,"NEB_spin requires spinmin minimizer"); // setup regular NEB_spin minimization + FILE *uscreen = universe->uscreen; FILE *ulogfile = universe->ulogfile; - //printf("test before run 1 \n"); - if (me_universe == 0 && uscreen) fprintf(uscreen,"Setting up regular NEB_spin ...\n"); @@ -276,22 +254,23 @@ void NEB_spin::run() if (update->laststep < 0) error->all(FLERR,"Too many timesteps for NEB_spin"); - //printf("test before run 2 \n"); - update->minimize->setup(); - //printf("test before run 3 \n"); - if (me_universe == 0) { if (uscreen) { if (verbose) { - fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " - "... ReplicaForceN MaxAtomForceN\n"); + "... ReplicaTorqueN MaxAtomTorqueN\n"); + //fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + // "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " + // "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " + // "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " + // "... ReplicaForceN MaxAtomForceN\n"); } else { - fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " "RDN PEN\n"); } @@ -299,21 +278,19 @@ void NEB_spin::run() if (ulogfile) { if (verbose) { - fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " - "... ReplicaForceN MaxAtomForceN\n"); + "... ReplicaTorqueN MaxAtomTorqueN\n"); } else { - fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " "RDN PEN\n"); } } } - //printf("test before run 4 \n"); print_status(); - //printf("test before run 5 \n"); // perform regular NEB_spin for n1steps or until replicas converge // retrieve PE values from fix NEB_spin and print every nevery iterations @@ -323,35 +300,11 @@ void NEB_spin::run() timer->init(); timer->barrier_start(); - // test import fix_nve scheme - - //printf("test 2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); - //error->all(FLERR,"end neb_spin test"); - double dts; while (update->minimize->niter < n1steps) { - //dts = evaluate_dt(); - //advance_spins(dts); - //fneb-> - - //dts = fneb->evaluate_dt(); - //fneb->advance_spins(dts); - - // no minimizer for spins update->minimize->run(nevery); - - - // no minimizer for spins - //update->minimize->run(nevery); - // - // evaluate dts - // loop on spins, damped advance - // print_status(); if (update->minimize->stop_condition) break; } - - // test neb end - //error->all(FLERR,"end neb_spin test"); timer->barrier_stop(); @@ -393,22 +346,19 @@ void NEB_spin::run() update->minimize->init(); fneb->rclimber = top; - printf("test print 6.2 \n"); update->minimize->setup(); - printf("test print 6.3 \n"); - if (me_universe == 0) { if (uscreen) { if (verbose) { - fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " "pathangle1 angletangrad1 anglegrad1 gradV1 " "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " "... ReplicaForceN MaxAtomForceN\n"); } else { - fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " + fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc " "EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN\n"); @@ -416,14 +366,14 @@ void NEB_spin::run() } if (ulogfile) { if (verbose) { - fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " "pathangle1 angletangrad1 anglegrad1 gradV1 " "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " "... ReplicaForceN MaxAtomForceN\n"); } else { - fprintf(ulogfile,"Step MaxReplicaForce MaxAtomForce " + fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc " "EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN\n"); @@ -441,10 +391,6 @@ void NEB_spin::run() timer->barrier_start(); while (update->minimize->niter < n2steps) { - //dts = evaluate_dt(); - //advance_spins(dts); - //dts = fneb->evaluate_dt(); - //fneb->advance_spins(dts); update->minimize->run(nevery); print_status(); if (update->minimize->stop_condition) break; @@ -462,174 +408,6 @@ void NEB_spin::run() update->beginstep = update->endstep = 0; } -/* ---------------------------------------------------------------------- - geodesic distance calculation (Vincenty's formula) -------------------------------------------------------------------------- */ - -//double NEB_spin::geodesic_distance2(double spi[3], double spj[3]) -//{ -// double dist; -// double crossx,crossy,crossz; -// double dotx,doty,dotz; -// double crosslen,dots; -// -// crossx = spi[1]*spj[2]-spi[2]*spj[1]; -// crossy = spi[2]*spj[0]-spi[0]*spj[2]; -// crossz = spi[0]*spj[1]-spi[1]*spj[0]; -// crosslen = sqrt(crossx*crossx + crossy*crossy + crossz*crossz); -// dotx = spi[0]*spj[0]; -// doty = spi[1]*spj[1]; -// dotz = spi[2]*spj[2]; -// dots = dotx+doty+dotz; -// -// dist = atan2(crosslen,dots); -// -// return dist; -//} - -/* ---------------------------------------------------------------------- - evaluate max timestep ----------------------------------------------------------------------- */ - -//double NEB_spin::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++) -// if (mask[i] & groupbit) { -// 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 -// -// if (update->multireplica == 1) { -// fmaxsqall = fmaxsqloc; -// MPI_Allreduce(&fmaxsqloc,&fmaxsqall,1,MPI_DOUBLE,MPI_MAX,universe->uworld); -// } -// -// if (fmaxsqall < fmaxsqloc) -// error->all(FLERR,"Incorrect fmaxall calc."); -// -// // define max timestep -// // dividing by 10 the inverse of max frequency -// -// dtmax = MY_2PI/(10.0*sqrt(fmaxsqall)); -// -// return dtmax; -//} - -/* ---------------------------------------------------------------------- - geometric damped advance os spins ----------------------------------------------------------------------- */ - -//void NEB_spin::advance_spins(double dts) -//{ -// //int j=0; -// //int *sametag = atom->sametag; -// 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 alpha; -// double spi[3],fmi[3]; -// double cp[3],g[3]; -// -// //cp[0] = cp[1] = cp[2] = 0.0; -// //g[0] = g[1] = g[2] = 0.0; -// dts2 = dts*dts; -// -// // fictitious Gilbert damping of 1 -// alpha = 1.0; -// -// // loop on all spins on proc. -// -// if (ireplica != nreplica-1 && ireplica != 0) -// for (int i = 0; i < nlocal; i++) -// if (mask[i] & groupbit) { -// -// spi[0] = sp[i][0]; -// spi[1] = sp[i][1]; -// spi[2] = sp[i][2]; -// -// fmi[0] = fm[i][0]; -// fmi[1] = fm[i][1]; -// fmi[2] = fm[i][2]; -// -// // calc. damping torque -// -// tdampx = -alpha*(fmi[1]*spi[2] - fmi[2]*spi[1]); -// tdampy = -alpha*(fmi[2]*spi[0] - fmi[0]*spi[2]); -// tdampz = -alpha*(fmi[0]*spi[1] - fmi[1]*spi[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] += (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]; -// -// // 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; -// -// // comm. sp[i] to atoms with same tag (for serial algo) -// -// // no need for simplecticity -// //if (sector_flag == 0) { -// // if (sametag[i] >= 0) { -// // j = sametag[i]; -// // while (j >= 0) { -// // sp[j][0] = sp[i][0]; -// // sp[j][1] = sp[i][1]; -// // sp[j][2] = sp[i][2]; -// // j = sametag[j]; -// // } -// // } -// //} -// // -// -// } -//} - /* ---------------------------------------------------------------------- read initial config atom coords from file flag = 0 @@ -654,7 +432,6 @@ void NEB_spin::readfile(char *file, int flag) double xx,yy,zz,delx,dely,delz; // spin quantities double musp,spx,spy,spz; - //,delx,dely,delz; if (me_universe == 0 && screen) fprintf(screen,"Reading NEB_spin coordinate file(s) ...\n"); @@ -703,12 +480,6 @@ void NEB_spin::readfile(char *file, int flag) double spinit[3],spfinal[3]; int nlocal = atom->nlocal; - // test 1.2 - //double **sp = atom->sp; - //printf("test 1.2 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); - //error->all(FLERR,"end neb_spin test"); - - // loop over chunks of lines read from file // two versions of read_lines_from_file() for world vs universe bcast // count # of atom coords changed so can check for invalid atom IDs in file @@ -765,44 +536,27 @@ void NEB_spin::readfile(char *file, int flag) spx = atof(values[5]); spy = atof(values[6]); spz = atof(values[7]); - //xx = atof(values[1]); - //yy = atof(values[2]); - //zz = atof(values[3]); if (flag == 0) { - // here, function interp. spin states - - //spinit[0] = x[m][0]; - //spinit[1] = x[m][1]; - //spinit[2] = x[m][2]; spinit[0] = sp[m][0]; spinit[1] = sp[m][1]; spinit[2] = sp[m][2]; spfinal[0] = spx; spfinal[1] = spy; spfinal[2] = spz; - //domain->minimum_image(delx,dely,delz); + + // to be used it atomic displacements with pbc + //domain->minimum_image(delx,dely,delz); - // test - //printf("spinit: %g %g %g \n",spinit[0],spinit[1],spinit[2]); - //printf("spfinal bef: %g %g %g \n",spfinal[0],spfinal[1],spfinal[2]); + // interpolate intermediate spin states initial_rotation(spinit,spfinal,fraction); - - // test - //printf("spfinal aft: %g %g %g \n",spfinal[0],spfinal[1],spfinal[2]); sp[m][0] = spfinal[0]; sp[m][1] = spfinal[1]; sp[m][2] = spfinal[2]; sp[m][3] = musp; - //delx = xx - x[m][0]; - //dely = yy - x[m][1]; - //delz = zz - x[m][2]; - //x[m][0] += fraction*delx; - //x[m][1] += fraction*dely; - //x[m][2] += fraction*delz; } else { sp[m][3] = musp; x[m][0] = xx; @@ -820,12 +574,6 @@ void NEB_spin::readfile(char *file, int flag) nread += nchunk; } - // test 1.3 - //double **sp = atom->sp; - //printf("test 1.3 atom: i=%d,%g,%g,%g \n",1,sp[1][0],sp[1][1],sp[1][2]); - //error->all(FLERR,"end neb_spin test"); - - // check that all atom IDs in file were found by a proc if (flag == 0) { @@ -867,13 +615,11 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) { // implementing initial rotation using atan2 - //atan2(crosslen,dots); - // this is not a sufficient routine, // we need more accurate verifications - // initial and final and inter ang. values + // initial, final and inter ang. values double itheta,iphi,ftheta,fphi,ktheta,kphi; double spix,spiy,spiz,spfx,spfy,spfz; double spkx,spky,spkz,iknorm; @@ -909,58 +655,6 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) sploc[1] = spky; sploc[2] = spkz; - //double theta,spdot; - //double inormdot,ispinorm; - //double kix,kiy,kiz; - //double kinorm, ikinorm; - //double crossx,crossy,crossz; - - ////printf("inside rot, spi %g, spf %g \n",spi[0],sploc[0]); - - //spdot = spi[0]*sploc[0]+spi[1]*sploc[1]+spi[2]*sploc[2]; - //theta = fraction*acos(spdot); - - //printf("inside rot, theta %g \n",theta); - - //kix = spi[1]*sploc[2]-spi[2]*sploc[1]; - //kiy = spi[2]*sploc[0]-spi[0]*sploc[2]; - //kiz = spi[0]*sploc[1]-spi[1]*sploc[0]; - // - ////printf("inside rot1.1, ki %g %g %g \n",kix,kiy,kiz); - - //inormdot = 1.0/sqrt(spdot); - //kinorm = kix*kix+kiy*kiy+kiz*kiz; - //if (kinorm == 0.0) { - // kix = 0.0; - // kiy = 0.0; - // kiz = 0.0; - //} else { - // ikinorm = 1.0/kinorm; - // kix *= ikinorm; - // kiy *= ikinorm; - // kiz *= ikinorm; - //} - - ////printf("inside rot1.2, kin %g %g %g \n",kix,kiy,kiz); - - //crossx = kiy*spi[2]-kiz*spi[1]; - //crossy = kiz*spi[0]-kix*spi[2]; - //crossz = kix*spi[1]-kiy*spi[0]; - // - ////printf("inside rot1.3, cross %g %g %g \n",crossx,crossy,crossz); - - //sploc[0] = spi[0]*cos(theta)+crossx*sin(theta); - //sploc[1] = spi[1]*cos(theta)+crossy*sin(theta); - //sploc[2] = spi[2]*cos(theta)+crossz*sin(theta); - // - ////printf("inside rot2, spf %g %g %g \n",sploc[0],sploc[1],sploc[2]); - - //ispinorm = 1.0/sqrt(sploc[0]*sploc[0]+sploc[1]*sploc[1]+sploc[2]*sploc[2]); - - //sploc[0] *= ispinorm; - //sploc[1] *= ispinorm; - //sploc[2] *= ispinorm; - //printf("inside rot2, spf %g %g %g \n",sploc[0],sploc[1],sploc[2]); } /* ---------------------------------------------------------------------- @@ -1007,30 +701,43 @@ void NEB_spin::print_status() //double fnorm2 = sqrt(update->minimize->fnorm_sqr()); - // test fmax spin int nlocal = atom->nlocal; + double tx,ty,tz; + double tnorm2,local_norm_inf,temp_inf; + double **sp = atom->sp; double **fm = atom->fm; - double fnorm2; - for (int i = 0; i < nlocal; i++) - fnorm2 += (fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]); - //for (int i = 0; i < nlocal; i++) - // if (mask[i] & groupbit) { - // fnorm2 += (fm[i][0]*fm[i][0]+fm[i][1]*fm[i][1]+fm[i][2]*fm[i][2]); - // } + + // calc. magnetic torques + tnorm2 = local_norm_inf = temp_inf = 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]); + tnorm2 += tx*tx + ty*ty + tz*tz; + + temp_inf = MAX(fabs(tx),fabs(ty)); + temp_inf = MAX(fabs(tz),temp_inf); + local_norm_inf = MAX(temp_inf,local_norm_inf); + + } + double fmaxreplica; - MPI_Allreduce(&fnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); + //MPI_Allreduce(&fnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); + MPI_Allreduce(&tnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); - // no minimize->fnorm_inf for spins //double fnorminf = update->minimize->fnorm_inf(); //double fmaxatom; //MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); double fnorminf = 0.0; - double fmaxatom = 0.0; + MPI_Allreduce(&local_norm_inf,&fnorminf,1,MPI_DOUBLE,MPI_MAX,world); + double fmaxatom; + MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); if (verbose) { freplica = new double[nreplica]; - MPI_Allgather(&fnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); + //MPI_Allgather(&fnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); + MPI_Allgather(&tnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); fmaxatomInRepl = new double[nreplica]; MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); } diff --git a/src/REPLICA/neb_spin.h b/src/REPLICA/neb_spin.h index 6541658fd7..f6d742c46c 100644 --- a/src/REPLICA/neb_spin.h +++ b/src/REPLICA/neb_spin.h @@ -45,7 +45,8 @@ class NEB_spin : protected Pointers { FILE *fp; int compressed; double etol; // energy tolerance convergence criterion - double ftol; // force tolerance convergence criterion + //double ftol; // force tolerance convergence criterion + double ttol; // torque tolerance convergence criterion int n1steps, n2steps; // number of steps in stage 1 and 2 int nevery; // output interval char *infile; // name of file containing final state @@ -57,9 +58,6 @@ class NEB_spin : protected Pointers { double *freplica; // force on an image double *fmaxatomInRepl; // force on an image - //double geodesic_distance2(double *, double *); - //double evaluate_dt(); - //void advance_spins(double); void readfile(char *, int); void initial_rotation(double *, double *, double); void open(char *); From 5608f87c15a94fc4ab1ce4b0302b5a2ecc2dcd37 Mon Sep 17 00:00:00 2001 From: jrgissing Date: Wed, 13 Mar 2019 21:55:17 -0600 Subject: [PATCH 0240/1242] 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 033a5c27210d5bfd443a9e5c42fbfdb4e0c4f61b Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 14 Mar 2019 11:07:24 -0600 Subject: [PATCH 0241/1242] Commit JT 031419 - cleaned fix_neb_spin - first working version --- examples/SPIN/gneb/in.gneb.iron | 35 +++- src/REPLICA/fix_neb_spin.cpp | 334 ++++++++------------------------ src/REPLICA/neb_spin.cpp | 6 - src/REPLICA/neb_spin.h | 1 - 4 files changed, 110 insertions(+), 266 deletions(-) diff --git a/examples/SPIN/gneb/in.gneb.iron b/examples/SPIN/gneb/in.gneb.iron index 80ab698c16..7aab0c04c3 100644 --- a/examples/SPIN/gneb/in.gneb.iron +++ b/examples/SPIN/gneb/in.gneb.iron @@ -3,7 +3,6 @@ units metal dimension 3 boundary p p f - atom_style spin # necessary for the serial algorithm (sametag) @@ -14,7 +13,7 @@ region box block 0.0 4.0 0.0 4.0 0.0 1.0 #create_box 1 box #create_atoms 1 box -read_data ../examples/SPIN/gneb_bfo/initial.iron_spin +read_data initial.iron_spin # setting mass, mag. moments, and interactions for bcc iron @@ -27,16 +26,36 @@ 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 2 all langevin/spin 0.1 0.0 21 -fix 3 all neb/spin 1.0 +fix 1 all precession/spin zeeman 0.1 0.0 0.0 1.0 anisotropy 0.0001 1.0 0.0 0.0 +fix_modify 1 energy yes +fix 2 all langevin/spin 0.0 0.0 21 +fix 3 all neb/spin 1.0 #fix 4 all nve/spin lattice no -#parallel ideal timestep 0.0001 thermo 100 +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] + +thermo 100 +thermo_style custom step time v_magx v_magz v_magnorm etotal +thermo_modify format float %20.15g + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +variable u universe 1 2 3 4 +#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] +dump 1 all custom 200 dump.$u type x y z c_outsp[1] c_outsp[2] c_outsp[3] min_style spinmin -neb/spin 0.0 0.1 100 10 10 final ../examples/SPIN/gneb_bfo/final.iron_spin -#neb/spin 0.0 0.1 1000 1000 100 final ../examples/SPIN/gneb_bfo/final.iron_spin +min_modify alpha_damp 1.0 discret_factor 10.0 +neb/spin 1.0e-12 1.0e-12 50000 50000 10 final final.iron_spin +#neb/spin 1.0e-6 1.0e-6 1000 10 10 final final.iron_spin diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/REPLICA/fix_neb_spin.cpp index 015ff1a313..95d5e19f25 100644 --- a/src/REPLICA/fix_neb_spin.cpp +++ b/src/REPLICA/fix_neb_spin.cpp @@ -15,7 +15,6 @@ #include #include #include -//#include "fix_neb.h" #include "fix_neb_spin.h" #include "universe.h" #include "update.h" @@ -41,18 +40,13 @@ enum{SINGLE_PROC_DIRECT,SINGLE_PROC_MAP,MULTI_PROC}; /* ---------------------------------------------------------------------- */ FixNEB_spin::FixNEB_spin(LAMMPS *lmp, int narg, char **arg) : - Fix(lmp, narg, arg), - id_pe(NULL), pe(NULL), nlenall(NULL), xprev(NULL), xnext(NULL), - fnext(NULL), - spprev(NULL), spnext(NULL), fmnext(NULL), - springF(NULL), tangent(NULL), - xsend(NULL), xrecv(NULL), fsend(NULL), frecv(NULL), - spsend(NULL), sprecv(NULL), fmsend(NULL), fmrecv(NULL), - tagsend(NULL), tagrecv(NULL), - xsendall(NULL), xrecvall(NULL), fsendall(NULL), frecvall(NULL), - spsendall(NULL), sprecvall(NULL), fmsendall(NULL), fmrecvall(NULL), - tagsendall(NULL), tagrecvall(NULL), counts(NULL), - displacements(NULL) + Fix(lmp, narg, arg), id_pe(NULL), pe(NULL), nlenall(NULL), xprev(NULL), + xnext(NULL), fnext(NULL), spprev(NULL), spnext(NULL), fmnext(NULL), springF(NULL), + tangent(NULL), xsend(NULL), xrecv(NULL), fsend(NULL), frecv(NULL), spsend(NULL), + sprecv(NULL), fmsend(NULL), fmrecv(NULL), tagsend(NULL), tagrecv(NULL), + xsendall(NULL), xrecvall(NULL), fsendall(NULL), frecvall(NULL), spsendall(NULL), + sprecvall(NULL), fmsendall(NULL), fmrecvall(NULL), tagsendall(NULL), tagrecvall(NULL), + counts(NULL), displacements(NULL) { if (narg < 4) error->all(FLERR,"Illegal fix neb_spin command"); @@ -145,11 +139,12 @@ FixNEB_spin::~FixNEB_spin() modify->delete_compute(id_pe); delete [] id_pe; + // memory destroy of all spin and lattice arrays + memory->destroy(xprev); memory->destroy(xnext); memory->destroy(tangent); memory->destroy(fnext); - // spin quantities memory->destroy(spprev); memory->destroy(spnext); memory->destroy(fmnext); @@ -158,7 +153,6 @@ FixNEB_spin::~FixNEB_spin() memory->destroy(xrecv); memory->destroy(fsend); memory->destroy(frecv); - // spin quantities memory->destroy(spsend); memory->destroy(sprecv); memory->destroy(fmsend); @@ -170,7 +164,6 @@ FixNEB_spin::~FixNEB_spin() memory->destroy(xrecvall); memory->destroy(fsendall); memory->destroy(frecvall); - // spin quantities memory->destroy(spsendall); memory->destroy(sprecvall); memory->destroy(fmsendall); @@ -237,7 +230,6 @@ void FixNEB_spin::init() memory->create(frecvall,ntotal,3,"neb:frecvall"); memory->create(tagsendall,ntotal,"neb:tagsendall"); memory->create(tagrecvall,ntotal,"neb:tagrecvall"); - // spin quantities memory->create(spsendall,ntotal,3,"neb:xsendall"); memory->create(sprecvall,ntotal,3,"neb:xrecvall"); memory->create(fmsendall,ntotal,3,"neb:fsendall"); @@ -263,14 +255,10 @@ void FixNEB_spin::min_setup(int vflag) void FixNEB_spin::min_post_force(int /*vflag*/) { double vprev,vnext; - //double delxp,delyp,delzp,delxn,delyn,delzn; - // spin quantities double delspxp,delspyp,delspzp; double delspxn,delspyn,delspzn; double templen; double vIni=0.0; - - // local spin values for geo. dist. calc. double spi[3],spj[3]; vprev = vnext = veng = pe->compute_scalar(); @@ -290,36 +278,17 @@ void FixNEB_spin::min_post_force(int /*vflag*/) MPI_Bcast(&vnext,1,MPI_DOUBLE,0,world); } - //printf("test veng: %g / %g / %g \n",veng,vprev,vnext); - //error->universe_all(FLERR,"End test"); - if (FreeEndFinal && ireplica == nreplica-1 && (update->ntimestep == 0)) - EFinalIni = veng; + error->all(FLERR,"NEB_spin Free End option not yet active"); if (ireplica == 0) vIni=veng; - if (FreeEndFinalWithRespToEIni) { - if (cmode == SINGLE_PROC_DIRECT || cmode == SINGLE_PROC_MAP) { - int procFirst; - procFirst=universe->root_proc[0]; - MPI_Bcast(&vIni,1,MPI_DOUBLE,procFirst,uworld); - } else { - if (me == 0) - MPI_Bcast(&vIni,1,MPI_DOUBLE,0,rootworld); + if (FreeEndFinalWithRespToEIni) + error->all(FLERR,"NEB_spin Free End option not yet active"); - MPI_Bcast(&vIni,1,MPI_DOUBLE,0,world); - } - } + if (FreeEndIni && ireplica == 0 && (update->ntimestep == 0)) + error->all(FLERR,"NEB_spin Free End option not yet active"); - if (FreeEndIni && ireplica == 0 && (update->ntimestep == 0)) EIniIni = veng; - /* if (FreeEndIni && ireplica == 0) { - // if (me == 0 ) - if (update->ntimestep == 0) { - EIniIni = veng; - // if (cmode == MULTI_PROC) - // MPI_Bcast(&EIniIni,1,MPI_DOUBLE,0,world); - } - }*/ // communicate atoms to/from adjacent replicas to fill xprev,xnext @@ -329,15 +298,13 @@ void FixNEB_spin::min_post_force(int /*vflag*/) pe->addstep(update->ntimestep+1); + int nlocal = atom->nlocal; + int *mask = atom->mask; double **x = atom->x; double **sp = atom->sp; - int *mask = atom->mask; double dot = 0.0; double prefactor = 0.0; - - //double **f = atom->f; double **fm = atom->fm; - int nlocal = atom->nlocal; //calculating separation between images @@ -351,10 +318,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) // computation of the tangent vector - if (ireplica == nreplica-1) { - - // final replica - + if (ireplica == nreplica-1) { // final replica for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -371,64 +335,26 @@ void FixNEB_spin::min_post_force(int /*vflag*/) delspyp -= delpdots*sp[i][1]; delspzp -= delpdots*sp[i][2]; - // adjust distance if pbc - //domain->minimum_image(delspxp,delspyp,delspzp); - // calc. geodesic length - spi[0]=sp[i][0]; - spi[1]=sp[i][1]; - spi[2]=sp[i][2]; - spj[0]=spprev[i][0]; - spj[1]=spprev[i][1]; - spj[2]=spprev[i][2]; - templen = geodesic_distance(spi, spj); + spi[0] = sp[i][0]; + spi[1] = sp[i][1]; + spi[2] = sp[i][2]; + spj[0] = spprev[i][0]; + spj[1] = spprev[i][1]; + spj[2] = spprev[i][2]; + templen = geodesic_distance(spi,spj); plen += templen*templen; dottangrad += delspxp*fm[i][0]+ delspyp*fm[i][1]+delspzp*fm[i][2]; gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; - - //plen += delxp*delxp + delyp*delyp + delzp*delzp; - //dottangrad += delxp* f[i][0]+ delyp*f[i][1]+delzp*f[i][2]; - //gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - // final replica, no need for the tangent vector - // (unless FreeEnd option) - if (FreeEndFinal||FreeEndFinalWithRespToEIni) { - error->all(FLERR,"Free End option not yet active"); - //tangent[i][0]=delspxp; - //tangent[i][1]=delspyp; - //tangent[i][2]=delspzp; - //// if needed, tlen has to be modified - //tlen += tangent[i][0]*tangent[i][0] + - // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - //dot += fm[i][0]*tangent[i][0] + fm[i][1]*tangent[i][1] + - // fm[i][2]*tangent[i][2]; - } - - - //delxp = x[i][0] - xprev[i][0]; - //delyp = x[i][1] - xprev[i][1]; - //delzp = x[i][2] - xprev[i][2]; - //domain->minimum_image(delxp,delyp,delzp); + // no free end option for now - //plen += delxp*delxp + delyp*delyp + delzp*delzp; - //dottangrad += delxp* f[i][0]+ delyp*f[i][1]+delzp*f[i][2]; - //gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - //if (FreeEndFinal||FreeEndFinalWithRespToEIni) { - // tangent[i][0]=delxp; - // tangent[i][1]=delyp; - // tangent[i][2]=delzp; - // tlen += tangent[i][0]*tangent[i][0] + - // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - // dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + - // f[i][2]*tangent[i][2]; - //} + if (FreeEndFinal||FreeEndFinalWithRespToEIni) + error->all(FLERR,"Free End option not yet active"); + } - - } else if (ireplica == 0) { - - // initial replica - + } else if (ireplica == 0) { // initial replica for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { @@ -444,9 +370,6 @@ void FixNEB_spin::min_post_force(int /*vflag*/) delspxn -= delndots*sp[i][0]; delspyn -= delndots*sp[i][1]; delspzn -= delndots*sp[i][2]; - - // adjust del. if pbc - //domain->minimum_image(delspxn,delspyn,delspzn); // calc. geodesic length @@ -456,70 +379,40 @@ void FixNEB_spin::min_post_force(int /*vflag*/) spj[0]=spnext[i][0]; spj[1]=spnext[i][1]; spj[2]=spnext[i][2]; - templen = geodesic_distance(spi, spj); + templen = geodesic_distance(spi,spj); nlen += templen*templen; dottangrad += delspxn*fm[i][0] + delspyn*fm[i][1] + delspzn*fm[i][2]; gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; - if (FreeEndIni) { + + // no free end option for now + + if (FreeEndIni) error->all(FLERR,"Free End option not yet active"); - //tangent[i][0]=delxn; - //tangent[i][1]=delyn; - //tangent[i][2]=delzn; - //// if needed, tlen has to be modified - //tlen += tangent[i][0]*tangent[i][0] + - // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - //dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + - // f[i][2]*tangent[i][2]; - } - //delxn = xnext[i][0] - x[i][0]; - //delyn = xnext[i][1] - x[i][1]; - //delzn = xnext[i][2] - x[i][2]; - //domain->minimum_image(delxn,delyn,delzn); - //nlen += delxn*delxn + delyn*delyn + delzn*delzn; - //gradnextlen += fnext[i][0]*fnext[i][0] - // + fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; - //dotgrad += f[i][0]*fnext[i][0] - // + f[i][1]*fnext[i][1] + f[i][2]*fnext[i][2]; - //dottangrad += delxn*f[i][0]+ delyn*f[i][1] + delzn*f[i][2]; - //gradlen += f[i][0]*f[i][0] + f[i][1]*f[i][1] + f[i][2]*f[i][2]; - //if (FreeEndIni) { - // tangent[i][0]=delxn; - // tangent[i][1]=delyn; - // tangent[i][2]=delzn; - // tlen += tangent[i][0]*tangent[i][0] + - // tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; - // dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + - // f[i][2]*tangent[i][2]; - //} } - - } else { - - // not the first or last replica + } else { // intermediate replica double vmax = MAX(fabs(vnext-veng),fabs(vprev-veng)); double vmin = MIN(fabs(vnext-veng),fabs(vprev-veng)); - for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { // calc. delp vector + delspxp = sp[i][0] - spprev[i][0]; delspyp = sp[i][1] - spprev[i][1]; delspzp = sp[i][2] - spprev[i][2]; // project delp vector on tangent space + delndots = delspxp*sp[i][0]+delspyp*sp[i][1]+delspzp*sp[i][2]; delspxp -= delpdots*sp[i][0]; delspyp -= delpdots*sp[i][1]; delspzp -= delpdots*sp[i][2]; - - // adjust distance if pbc - //domain->minimum_image(delspxp,delspyp,delspzp); - // calc. geodesic length + // calc. prev. geodesic length + spi[0]=sp[i][0]; spi[1]=sp[i][1]; spi[2]=sp[i][2]; @@ -530,18 +423,19 @@ void FixNEB_spin::min_post_force(int /*vflag*/) plen += templen*templen; // calc. deln vector - delspxn = spnext[i][0] - sp[i][0]; + + delspxn = spnext[i][0] - sp[i][0]; delspyn = spnext[i][1] - sp[i][1]; delspzn = spnext[i][2] - sp[i][2]; // project deln vector on tangent space + delndots = delspxn*sp[i][0]+delspyn*sp[i][1]+delspzn*sp[i][2]; delspxn -= delndots*sp[i][0]; delspyn -= delndots*sp[i][1]; delspzn -= delndots*sp[i][2]; - - // adjust distance if pbc - //domain->minimum_image(delspxn,delspyn,delspzn); + + // evaluate best path tangent if (vnext > veng && veng > vprev) { tangent[i][0] = delspxn; @@ -567,7 +461,8 @@ void FixNEB_spin::min_post_force(int /*vflag*/) } } - // calc. geodesic length + // calc. next geodesic length + spi[0]=sp[i][0]; spi[1]=sp[i][1]; spi[2]=sp[i][2]; @@ -576,27 +471,26 @@ void FixNEB_spin::min_post_force(int /*vflag*/) spj[2]=spnext[i][2]; templen = geodesic_distance(spi, spj); nlen += templen*templen; - //nlen += delxn*delxn + delyn*delyn + delzn*delzn; - tlen += tangent[i][0]*tangent[i][0] + - tangent[i][1]*tangent[i][1] + tangent[i][2]*tangent[i][2]; + + tlen += tangent[i][0]*tangent[i][0] + tangent[i][1]*tangent[i][1] + + tangent[i][2]*tangent[i][2]; gradlen += fm[i][0]*fm[i][0] + fm[i][1]*fm[i][1] + fm[i][2]*fm[i][2]; dotpath += delspxp*delspxn + delspyp*delspyn + delspzp*delspzn; - dottangrad += tangent[i][0]*fm[i][0] + - tangent[i][1]*fm[i][1] + tangent[i][2]*fm[i][2]; - gradnextlen += fnext[i][0]*fnext[i][0] + - fnext[i][1]*fnext[i][1] +fnext[i][2] * fnext[i][2]; + dottangrad += tangent[i][0]*fm[i][0] + tangent[i][1]*fm[i][1] + + tangent[i][2]*fm[i][2]; + gradnextlen += fnext[i][0]*fnext[i][0] + fnext[i][1]*fnext[i][1] + + fnext[i][2]*fnext[i][2]; dotgrad += fm[i][0]*fnext[i][0] + fm[i][1]*fnext[i][1] + fm[i][2]*fnext[i][2]; // no Perpendicular nudging force option active yet - // see fix_neb for example - if (kspringPerp != 0.0) + + if (kspringPerp != 0.0) error->all(FLERR,"NEB_spin Perpendicular nudging force not yet active"); } } - // MPI reduce if more than one proc for world double bufin[BUFSIZE], bufout[BUFSIZE]; @@ -618,8 +512,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) dottangrad = bufout[6]; dotgrad = bufout[7]; - - // project tangent vector on tangent space + // project tangent vector on tangent space and normalize it double buftan[3]; double tandots; @@ -633,20 +526,14 @@ void FixNEB_spin::min_post_force(int /*vflag*/) tangent[i][0] = buftan[0]; tangent[i][1] = buftan[1]; tangent[i][2] = buftan[2]; - } - - // normalize tangent vector - - if (tlen > 0.0) { - double tleninv = 1.0/tlen; - for (int i = 0; i < nlocal; i++) - if (mask[i] & groupbit) { + if (tlen > 0.0) { + double tleninv = 1.0/tlen; tangent[i][0] *= tleninv; tangent[i][1] *= tleninv; tangent[i][2] *= tleninv; } - } + } // first or last replica has no change to forces, just return @@ -659,32 +546,21 @@ void FixNEB_spin::min_post_force(int /*vflag*/) if (ireplica < nreplica-1) dotgrad = dotgrad /(gradlen*gradnextlen); - // no Free End option active yet - // see fix_neb for example - if (FreeEndIni && ireplica == 0) { + // no Free End options active yet + + if (FreeEndIni && ireplica == 0) error->all(FLERR,"NEB_spin Free End option not yet active"); - } - - // no Free End option active yet - // see fix_neb for example - if (FreeEndFinal && ireplica == nreplica -1) { + if (FreeEndFinal && ireplica == nreplica -1) error->all(FLERR,"NEB_spin Free End option not yet active"); - } - - // no Free End option active yet - // see fix_neb for example - if (FreeEndFinalWithRespToEIni&&ireplica == nreplica -1) { + if (FreeEndFinalWithRespToEIni&&ireplica == nreplica -1) error->all(FLERR,"NEB_spin Free End option not yet active"); - } // no NEB_spin long range option - // see fix_neb for example - double lentot = 0; - double meanDist,idealPos,lenuntilIm,lenuntilClimber; - lenuntilClimber=0; - if (NEBLongRange) { + + if (NEBLongRange) error->all(FLERR,"NEB_spin long range option not yet active"); - } + + // exit calc. if first or last replica (no gneb force) if (ireplica == 0 || ireplica == nreplica-1) return ; @@ -692,47 +568,30 @@ void FixNEB_spin::min_post_force(int /*vflag*/) dotpath = dotpath/(plen*nlen); AngularContr = 0.5 *(1+cos(MY_PI * dotpath)); - double dotSpringTangent; - dotSpringTangent=0; - for (int i = 0; i < nlocal; i++) { + for (int i = 0; i < nlocal; i++) if (mask[i] & groupbit) { dot += fm[i][0]*tangent[i][0] + fm[i][1]*tangent[i][1] + fm[i][2]*tangent[i][2]; - // springF defined for perp. spring option - // not defined here - //dotSpringTangent += springF[i][0]*tangent[i][0] + - springF[i][1]*tangent[i][1] + springF[i][2]*tangent[i][2];} - //dot += f[i][0]*tangent[i][0] + f[i][1]*tangent[i][1] + - // f[i][2]*tangent[i][2]; - //dotSpringTangent += springF[i][0]*tangent[i][0] + - // springF[i][1]*tangent[i][1] + springF[i][2]*tangent[i][2];} - } + } - // gather all dot and dotSpring for this replica (world) - double dotSpringTangentall; - MPI_Allreduce(&dotSpringTangent,&dotSpringTangentall,1, - MPI_DOUBLE,MPI_SUM,world); - dotSpringTangent=dotSpringTangentall; + // gather all dot for this replica + double dotall; MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall; + // calc. GNEB force prefactor - // implement climbing image here - - if (ireplica == rclimber) { - error->all(FLERR,"NEB_spin climber option not yet active"); - //prefactor = -2.0*dot; - } else { - if (NEBLongRange) { + if (ireplica == rclimber) prefactor = -2.0*dot; // for climbing replica + else { + if (NEBLongRange) { // for intermediate replica error->all(FLERR,"Long Range NEB_spin climber option not yet active"); - //prefactor = -dot - kspring*(lenuntilIm-idealPos)/(2*meanDist); } else if (StandardNEB) { prefactor = -dot + kspring*(nlen-plen); } - if (FinalAndInterWithRespToEIni&& vengall(FLERR,"Incorrect calc. of geodesic_distance in Fix NEB/spin"); + + dist = atan2(normcross,dots); return dist; } @@ -818,7 +672,6 @@ void FixNEB_spin::inter_replica_comm() double **x = atom->x; double **f = atom->f; - // spin quantities double **sp = atom->sp; double **fm = atom->fm; tagint *tag = atom->tag; @@ -880,7 +733,6 @@ void FixNEB_spin::inter_replica_comm() fsend[m][0] = f[i][0]; fsend[m][1] = f[i][1]; fsend[m][2] = f[i][2]; - // spin quantities spsend[m][0] = sp[i][0]; spsend[m][1] = sp[i][1]; spsend[m][2] = sp[i][2]; @@ -892,13 +744,11 @@ void FixNEB_spin::inter_replica_comm() if (ireplica > 0) { MPI_Irecv(xrecv[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); - // spin quantities MPI_Irecv(sprecv[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); MPI_Irecv(tagrecv,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld,&requests[1]); } if (ireplica < nreplica-1) { MPI_Send(xsend[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld); - // spin quantities MPI_Send(spsend[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld); MPI_Send(tagsend,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld); } @@ -910,7 +760,6 @@ void FixNEB_spin::inter_replica_comm() xprev[m][0] = xrecv[i][0]; xprev[m][1] = xrecv[i][1]; xprev[m][2] = xrecv[i][2]; - // spin quantities spprev[m][0] = sprecv[i][0]; spprev[m][1] = sprecv[i][1]; spprev[m][2] = sprecv[i][2]; @@ -919,7 +768,6 @@ void FixNEB_spin::inter_replica_comm() if (ireplica < nreplica-1) { MPI_Irecv(xrecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(frecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); - // spin quantities MPI_Irecv(sprecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(fmrecv[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(tagrecv,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld,&requests[1]); @@ -927,7 +775,6 @@ void FixNEB_spin::inter_replica_comm() if (ireplica > 0) { MPI_Send(xsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); MPI_Send(fsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); - // spin quantities MPI_Send(spsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); MPI_Send(fmsend[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); MPI_Send(tagsend,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld); @@ -943,7 +790,6 @@ void FixNEB_spin::inter_replica_comm() fnext[m][0] = frecv[i][0]; fnext[m][1] = frecv[i][1]; fnext[m][2] = frecv[i][2]; - // spin quantities spnext[m][0] = sprecv[i][0]; spnext[m][1] = sprecv[i][1]; spnext[m][2] = sprecv[i][2]; @@ -972,7 +818,6 @@ void FixNEB_spin::inter_replica_comm() fsend[m][0] = f[i][0]; fsend[m][1] = f[i][1]; fsend[m][2] = f[i][2]; - // spin quantities spsend[m][0] = sp[i][0]; spsend[m][1] = sp[i][1]; spsend[m][2] = sp[i][2]; @@ -1002,7 +847,6 @@ void FixNEB_spin::inter_replica_comm() MPI_Gatherv(NULL,3*m,MPI_DOUBLE, fsendall[0],counts,displacements,MPI_DOUBLE,0,world); } - // spin quantities if (spsend) { MPI_Gatherv(spsend[0],3*m,MPI_DOUBLE, spsendall[0],counts,displacements,MPI_DOUBLE,0,world); @@ -1017,14 +861,12 @@ void FixNEB_spin::inter_replica_comm() if (ireplica > 0 && me == 0) { MPI_Irecv(xrecvall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); - // spin quantities MPI_Irecv(sprecvall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld,&requests[0]); MPI_Irecv(tagrecvall,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld, &requests[1]); } if (ireplica < nreplica-1 && me == 0) { MPI_Send(xsendall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld); - // spin quantities MPI_Send(spsendall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld); MPI_Send(tagsendall,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld); } @@ -1034,7 +876,6 @@ void FixNEB_spin::inter_replica_comm() MPI_Bcast(tagrecvall,nebatoms,MPI_INT,0,world); MPI_Bcast(xrecvall[0],3*nebatoms,MPI_DOUBLE,0,world); - // spin quantities MPI_Bcast(sprecvall[0],3*nebatoms,MPI_DOUBLE,0,world); for (i = 0; i < nebatoms; i++) { @@ -1043,7 +884,6 @@ void FixNEB_spin::inter_replica_comm() xprev[m][0] = xrecvall[i][0]; xprev[m][1] = xrecvall[i][1]; xprev[m][2] = xrecvall[i][2]; - // spin quantities spprev[m][0] = sprecvall[i][0]; spprev[m][1] = sprecvall[i][1]; spprev[m][2] = sprecvall[i][2]; @@ -1053,7 +893,6 @@ void FixNEB_spin::inter_replica_comm() if (ireplica < nreplica-1 && me == 0) { MPI_Irecv(xrecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(frecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); - // spin quantities MPI_Irecv(sprecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(sprecvall[0],3*nebatoms,MPI_DOUBLE,procnext,0,uworld,&requests[0]); MPI_Irecv(tagrecvall,nebatoms,MPI_LMP_TAGINT,procnext,0,uworld, @@ -1062,7 +901,6 @@ void FixNEB_spin::inter_replica_comm() if (ireplica > 0 && me == 0) { MPI_Send(xsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); MPI_Send(fsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); - // spin quantities MPI_Send(spsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); MPI_Send(fmsendall[0],3*nebatoms,MPI_DOUBLE,procprev,0,uworld); MPI_Send(tagsendall,nebatoms,MPI_LMP_TAGINT,procprev,0,uworld); @@ -1074,7 +912,6 @@ void FixNEB_spin::inter_replica_comm() MPI_Bcast(tagrecvall,nebatoms,MPI_INT,0,world); MPI_Bcast(xrecvall[0],3*nebatoms,MPI_DOUBLE,0,world); MPI_Bcast(frecvall[0],3*nebatoms,MPI_DOUBLE,0,world); - // spin quantities MPI_Bcast(sprecvall[0],3*nebatoms,MPI_DOUBLE,0,world); MPI_Bcast(fmrecvall[0],3*nebatoms,MPI_DOUBLE,0,world); @@ -1087,7 +924,6 @@ void FixNEB_spin::inter_replica_comm() fnext[m][0] = frecvall[i][0]; fnext[m][1] = frecvall[i][1]; fnext[m][2] = frecvall[i][2]; - // spin quantities spnext[m][0] = sprecvall[i][0]; spnext[m][1] = sprecvall[i][1]; spnext[m][2] = sprecvall[i][2]; @@ -1112,7 +948,6 @@ void FixNEB_spin::reallocate() memory->destroy(tangent); memory->destroy(fnext); memory->destroy(springF); - // spin quantities memory->destroy(spprev); memory->destroy(spnext); memory->destroy(fmnext); @@ -1122,7 +957,6 @@ void FixNEB_spin::reallocate() memory->create(tangent,maxlocal,3,"neb:tangent"); memory->create(fnext,maxlocal,3,"neb:fnext"); memory->create(springF,maxlocal,3,"neb:springF"); - // spin quantities memory->create(spprev,maxlocal,3,"neb:xprev"); memory->create(spnext,maxlocal,3,"neb:xnext"); memory->create(fmnext,maxlocal,3,"neb:fnext"); @@ -1132,7 +966,6 @@ void FixNEB_spin::reallocate() memory->destroy(fsend); memory->destroy(xrecv); memory->destroy(frecv); - // spin quantities memory->destroy(spsend); memory->destroy(fmsend); memory->destroy(sprecv); @@ -1143,7 +976,6 @@ void FixNEB_spin::reallocate() memory->create(fsend,maxlocal,3,"neb:fsend"); memory->create(xrecv,maxlocal,3,"neb:xrecv"); memory->create(frecv,maxlocal,3,"neb:frecv"); - // spin quantities memory->create(spsend,maxlocal,3,"neb:xsend"); memory->create(fmsend,maxlocal,3,"neb:fsend"); memory->create(sprecv,maxlocal,3,"neb:xrecv"); diff --git a/src/REPLICA/neb_spin.cpp b/src/REPLICA/neb_spin.cpp index e82b08e354..680d4a373b 100644 --- a/src/REPLICA/neb_spin.cpp +++ b/src/REPLICA/neb_spin.cpp @@ -20,12 +20,9 @@ #include #include #include -//#include "neb.h" -// test spin #include "neb_spin.h" #include "compute.h" #include "force.h" - #include "universe.h" #include "atom.h" #include "update.h" @@ -34,10 +31,7 @@ #include "min.h" #include "modify.h" #include "fix.h" -//#include "fix_neb.h" -// test spin #include "fix_neb_spin.h" - #include "output.h" #include "thermo.h" #include "finish.h" diff --git a/src/REPLICA/neb_spin.h b/src/REPLICA/neb_spin.h index f6d742c46c..b579793fe6 100644 --- a/src/REPLICA/neb_spin.h +++ b/src/REPLICA/neb_spin.h @@ -45,7 +45,6 @@ class NEB_spin : protected Pointers { FILE *fp; int compressed; double etol; // energy tolerance convergence criterion - //double ftol; // force tolerance convergence criterion double ttol; // torque tolerance convergence criterion int n1steps, n2steps; // number of steps in stage 1 and 2 int nevery; // output interval From a3c936d2839329bfd9a0dd4c3cafb5220879d84a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Thu, 14 Mar 2019 15:13:02 -0600 Subject: [PATCH 0242/1242] 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 d66b07dabeb0d4804826b8e396e298b95eba1ddb Mon Sep 17 00:00:00 2001 From: julient31 Date: Thu, 14 Mar 2019 15:39:45 -0600 Subject: [PATCH 0243/1242] Commit2 JT 031419 - commit before solo tests --- src/REPLICA/neb_spin.cpp | 42 ++++++---------------------------------- src/REPLICA/neb_spin.h | 1 - 2 files changed, 6 insertions(+), 37 deletions(-) diff --git a/src/REPLICA/neb_spin.cpp b/src/REPLICA/neb_spin.cpp index 680d4a373b..6681bf56ad 100644 --- a/src/REPLICA/neb_spin.cpp +++ b/src/REPLICA/neb_spin.cpp @@ -46,7 +46,6 @@ using namespace MathConst; #define MAXLINE 256 #define CHUNK 1024 -//#define ATTRIBUTE_PERLINE 4 // 8 attributes: tag, spin norm, position (3), spin direction (3) #define ATTRIBUTE_PERLINE 8 @@ -62,11 +61,9 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, int n2steps_in, int nevery_in, double *buf_init, double *buf_final) : Pointers(lmp) { - //double delx,dely,delz; double delspx,delspy,delspz; etol = etol_in; - //ftol = ftol_in; ttol = ftol_in; n1steps = n1steps_in; n2steps = n2steps_in; @@ -98,16 +95,14 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, spfinal[1] = buf_final[ii+1]; spfinal[2] = buf_final[ii+2]; + // circular initialization + // a better procedure may be developed + initial_rotation(spinit,spfinal,fraction); sp[i][0] = spfinal[0]; sp[i][1] = spfinal[1]; sp[i][2] = spfinal[2]; - - // adjust distance if pbc - //domain->minimum_image(delx,dely,delz); - - // need to define a better procedure for circular initialization ii += 3; } @@ -134,7 +129,6 @@ void NEB_spin::command(int narg, char **arg) if (narg < 6) error->universe_all(FLERR,"Illegal NEB_spin command"); etol = force->numeric(FLERR,arg[0]); - //ftol = force->numeric(FLERR,arg[1]); ttol = force->numeric(FLERR,arg[1]); n1steps = force->inumeric(FLERR,arg[2]); n2steps = force->inumeric(FLERR,arg[3]); @@ -143,7 +137,6 @@ void NEB_spin::command(int narg, char **arg) // error checks if (etol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); - //if (ftol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); if (ttol < 0.0) error->all(FLERR,"Illegal NEB_spin command"); if (nevery <= 0) error->universe_all(FLERR,"Illegal NEB_spin command"); if (n1steps % nevery || n2steps % nevery) @@ -172,7 +165,6 @@ void NEB_spin::command(int narg, char **arg) // process file-style setting to setup initial configs for all replicas - // check what options are available if (strcmp(arg[5],"final") == 0) { if (narg != 7 && narg !=8) error->universe_all(FLERR,"Illegal NEB_spin command"); infile = arg[6]; @@ -205,6 +197,7 @@ void NEB_spin::run() MPI_Comm_split(uworld,color,0,&roots); // search for neb_spin fix, allocate it + int ineb; for (ineb = 0; ineb < modify->nfix; ineb++) if (strcmp(modify->fix[ineb]->style,"neb/spin") == 0) break; @@ -220,7 +213,6 @@ void NEB_spin::run() update->whichflag = 2; update->etol = etol; - //update->ftol = ftol; update->ftol = ttol; // update->ftol is a torque tolerance update->multireplica = 1; @@ -258,11 +250,6 @@ void NEB_spin::run() "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " "... ReplicaTorqueN MaxAtomTorqueN\n"); - //fprintf(uscreen,"Step MaxReplicaForce MaxAtomForce " - // "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " - // "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " - // "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " - // "... ReplicaForceN MaxAtomForceN\n"); } else { fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " @@ -424,7 +411,6 @@ void NEB_spin::readfile(char *file, int flag) char *eof,*start,*next,*buf; char line[MAXLINE]; double xx,yy,zz,delx,dely,delz; - // spin quantities double musp,spx,spy,spz; if (me_universe == 0 && screen) @@ -469,7 +455,6 @@ void NEB_spin::readfile(char *file, int flag) double fraction = ireplica/(nreplica-1.0); double **x = atom->x; - // spin quantities double **sp = atom->sp; double spinit[3],spfinal[3]; int nlocal = atom->nlocal; @@ -539,9 +524,6 @@ void NEB_spin::readfile(char *file, int flag) spfinal[0] = spx; spfinal[1] = spy; spfinal[2] = spz; - - // to be used it atomic displacements with pbc - //domain->minimum_image(delx,dely,delz); // interpolate intermediate spin states @@ -609,11 +591,10 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) { // implementing initial rotation using atan2 - // this is not a sufficient routine, - // we need more accurate verifications - + // this may not be a sufficient routine, need more accurate verifications // initial, final and inter ang. values + double itheta,iphi,ftheta,fphi,ktheta,kphi; double spix,spiy,spiz,spfx,spfy,spfz; double spkx,spky,spkz,iknorm; @@ -648,7 +629,6 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) sploc[0] = spkx; sploc[1] = spky; sploc[2] = spkz; - } /* ---------------------------------------------------------------------- @@ -692,9 +672,6 @@ void NEB_spin::open(char *file) void NEB_spin::print_status() { - - //double fnorm2 = sqrt(update->minimize->fnorm_sqr()); - int nlocal = atom->nlocal; double tx,ty,tz; double tnorm2,local_norm_inf,temp_inf; @@ -709,20 +686,14 @@ void NEB_spin::print_status() 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]); tnorm2 += tx*tx + ty*ty + tz*tz; - temp_inf = MAX(fabs(tx),fabs(ty)); temp_inf = MAX(fabs(tz),temp_inf); local_norm_inf = MAX(temp_inf,local_norm_inf); - } double fmaxreplica; - //MPI_Allreduce(&fnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); MPI_Allreduce(&tnorm2,&fmaxreplica,1,MPI_DOUBLE,MPI_MAX,roots); - //double fnorminf = update->minimize->fnorm_inf(); - //double fmaxatom; - //MPI_Allreduce(&fnorminf,&fmaxatom,1,MPI_DOUBLE,MPI_MAX,roots); double fnorminf = 0.0; MPI_Allreduce(&local_norm_inf,&fnorminf,1,MPI_DOUBLE,MPI_MAX,world); double fmaxatom; @@ -730,7 +701,6 @@ void NEB_spin::print_status() if (verbose) { freplica = new double[nreplica]; - //MPI_Allgather(&fnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); MPI_Allgather(&tnorm2,1,MPI_DOUBLE,&freplica[0],1,MPI_DOUBLE,roots); fmaxatomInRepl = new double[nreplica]; MPI_Allgather(&fnorminf,1,MPI_DOUBLE,&fmaxatomInRepl[0],1,MPI_DOUBLE,roots); diff --git a/src/REPLICA/neb_spin.h b/src/REPLICA/neb_spin.h index b579793fe6..5988c04a3a 100644 --- a/src/REPLICA/neb_spin.h +++ b/src/REPLICA/neb_spin.h @@ -14,7 +14,6 @@ #ifdef COMMAND_CLASS CommandStyle(neb/spin,NEB_spin) -//CommandStyle(neb,NEB_spin) #else From 71a622724042151cb2c861a69ce1209cc0de58ff Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 14 Mar 2019 15:43:50 -0600 Subject: [PATCH 0244/1242] Optimize KOKKOS package for small system sizes --- src/KOKKOS/atom_vec_atomic_kokkos.cpp | 5 ++- src/KOKKOS/domain_kokkos.cpp | 12 ++++++ src/KOKKOS/npair_kokkos.cpp | 56 ++++++++++++++++----------- src/KOKKOS/npair_kokkos.h | 30 +++++++------- src/KOKKOS/pair_kokkos.h | 13 +++---- src/neighbor.h | 4 +- 6 files changed, 72 insertions(+), 48 deletions(-) diff --git a/src/KOKKOS/atom_vec_atomic_kokkos.cpp b/src/KOKKOS/atom_vec_atomic_kokkos.cpp index 6aba49e5f3..e3c1bee956 100644 --- a/src/KOKKOS/atom_vec_atomic_kokkos.cpp +++ b/src/KOKKOS/atom_vec_atomic_kokkos.cpp @@ -24,7 +24,7 @@ using namespace LAMMPS_NS; -#define DELTA 10000 +#define DELTA 10 /* ---------------------------------------------------------------------- */ @@ -55,7 +55,8 @@ AtomVecAtomicKokkos::AtomVecAtomicKokkos(LAMMPS *lmp) : AtomVecKokkos(lmp) void AtomVecAtomicKokkos::grow(int n) { - if (n == 0) nmax += DELTA; + int step = MAX(DELTA,nmax*0.01); + if (n == 0) nmax += step; else nmax = n; atomKK->nmax = nmax; if (nmax < 0 || nmax > MAXSMALLINT) diff --git a/src/KOKKOS/domain_kokkos.cpp b/src/KOKKOS/domain_kokkos.cpp index d9c1332778..4cf3e6ab52 100644 --- a/src/KOKKOS/domain_kokkos.cpp +++ b/src/KOKKOS/domain_kokkos.cpp @@ -17,6 +17,7 @@ #include "error.h" #include "force.h" #include "kspace.h" +#include "kokkos.h" using namespace LAMMPS_NS; @@ -339,6 +340,17 @@ struct DomainPBCFunctor { void DomainKokkos::pbc() { + + if (lmp->kokkos->exchange_comm_classic) { + + // reduce GPU data movement + + atomKK->sync(Host,X_MASK|V_MASK|MASK_MASK|IMAGE_MASK); + Domain::pbc(); + atomKK->modified(Host,X_MASK|V_MASK|MASK_MASK|IMAGE_MASK); + return; + } + double *lo,*hi,*period; int nlocal = atomKK->nlocal; diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index 5e1b7b0414..f2e73ac6e6 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -15,6 +15,7 @@ #include "atom_kokkos.h" #include "atom_masks.h" #include "domain_kokkos.h" +#include "update.h" #include "neighbor_kokkos.h" #include "nbin_kokkos.h" #include "nstencil.h" @@ -27,6 +28,16 @@ namespace LAMMPS_NS { template NPairKokkos::NPairKokkos(LAMMPS *lmp) : NPair(lmp) { + // use 1D view for scalars to reduce GPU memory operations + + d_scalars = typename AT::t_int_1d("neighbor:scalars",2); + h_scalars = HAT::t_int_1d("neighbor:scalars_mirror",2); + + d_resize = Kokkos::subview(d_scalars,0); + d_new_maxneighs = Kokkos::subview(d_scalars,1); + + h_resize = Kokkos::subview(h_scalars,0); + h_new_maxneighs = Kokkos::subview(h_scalars,1); } /* ---------------------------------------------------------------------- @@ -84,27 +95,30 @@ template void NPairKokkos::copy_stencil_info() { NPair::copy_stencil_info(); - nstencil = ns->nstencil; - int maxstencil = ns->get_maxstencil(); + if (neighbor->last_setup_bins == update->ntimestep) { + // copy stencil to device as it may have changed - if (maxstencil > k_stencil.extent(0)) - k_stencil = DAT::tdual_int_1d("neighlist:stencil",maxstencil); - for (int k = 0; k < maxstencil; k++) - k_stencil.h_view(k) = ns->stencil[k]; - k_stencil.modify(); - k_stencil.sync(); - if (GHOST) { - if (maxstencil > k_stencilxyz.extent(0)) - k_stencilxyz = DAT::tdual_int_1d_3("neighlist:stencilxyz",maxstencil); - for (int k = 0; k < maxstencil; k++) { - k_stencilxyz.h_view(k,0) = ns->stencilxyz[k][0]; - k_stencilxyz.h_view(k,1) = ns->stencilxyz[k][1]; - k_stencilxyz.h_view(k,2) = ns->stencilxyz[k][2]; + int maxstencil = ns->get_maxstencil(); + + if (maxstencil > k_stencil.extent(0)) + k_stencil = DAT::tdual_int_1d("neighlist:stencil",maxstencil); + for (int k = 0; k < maxstencil; k++) + k_stencil.h_view(k) = ns->stencil[k]; + k_stencil.modify(); + k_stencil.sync(); + if (GHOST) { + if (maxstencil > k_stencilxyz.extent(0)) + k_stencilxyz = DAT::tdual_int_1d_3("neighlist:stencilxyz",maxstencil); + for (int k = 0; k < maxstencil; k++) { + k_stencilxyz.h_view(k,0) = ns->stencilxyz[k][0]; + k_stencilxyz.h_view(k,1) = ns->stencilxyz[k][1]; + k_stencilxyz.h_view(k,2) = ns->stencilxyz[k][2]; + } + k_stencilxyz.modify(); + k_stencilxyz.sync(); } - k_stencilxyz.modify(); - k_stencilxyz.sync(); } } @@ -157,7 +171,7 @@ void NPairKokkos::build(NeighList *list_) bboxhi,bboxlo, domain->xperiodic,domain->yperiodic,domain->zperiodic, domain->xprd_half,domain->yprd_half,domain->zprd_half, - skin); + skin,d_resize,h_resize,d_new_maxneighs,h_new_maxneighs); k_cutneighsq.sync(); k_ex1_type.sync(); @@ -185,8 +199,7 @@ void NPairKokkos::build(NeighList *list_) data.h_new_maxneighs() = list->maxneighs; data.h_resize() = 0; - Kokkos::deep_copy(data.resize, data.h_resize); - Kokkos::deep_copy(data.new_maxneighs, data.h_new_maxneighs); + Kokkos::deep_copy(d_scalars, h_scalars); #ifdef KOKKOS_ENABLE_CUDA #define BINS_PER_BLOCK 2 const int factor = atoms_per_bin<64?2:1; @@ -245,10 +258,9 @@ void NPairKokkos::build(NeighList *list_) } } } - deep_copy(data.h_resize, data.resize); + Kokkos::deep_copy(h_scalars, d_scalars); if(data.h_resize()) { - deep_copy(data.h_new_maxneighs, data.new_maxneighs); list->maxneighs = data.h_new_maxneighs() * 1.2; list->d_neighbors = typename ArrayTypes::t_neighbors_2d("neighbors", list->d_neighbors.extent(0), list->maxneighs); data.neigh_list.d_neighbors = list->d_neighbors; diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index 6986fc5849..edf3d2a59f 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -95,6 +95,8 @@ namespace LAMMPS_NS { template class NPairKokkos : public NPair { + typedef ArrayTypes AT; + public: NPairKokkos(class LAMMPS *); ~NPairKokkos() {} @@ -105,6 +107,12 @@ class NPairKokkos : public NPair { private: int newton_pair; + typename AT::t_int_1d d_scalars; + HAT::t_int_1d h_scalars; + typename AT::t_int_scalar d_resize; + typename AT::t_int_scalar d_new_maxneighs; + HAT::t_int_scalar h_resize; + HAT::t_int_scalar h_new_maxneighs; // data from Neighbor class @@ -251,7 +259,11 @@ class NeighborKokkosExecute const X_FLOAT *_bboxhi, const X_FLOAT* _bboxlo, const int & _xperiodic, const int & _yperiodic, const int & _zperiodic, const int & _xprd_half, const int & _yprd_half, const int & _zprd_half, - const X_FLOAT _skin): + const X_FLOAT _skin, + const typename AT::t_int_scalar _resize, + const typename ArrayTypes::t_int_scalar _h_resize, + const typename AT::t_int_scalar _new_maxneighs, + const typename ArrayTypes::t_int_scalar _h_new_maxneighs): neigh_list(_neigh_list), cutneighsq(_cutneighsq), bincount(_bincount),c_bincount(_bincount),bins(_bins),c_bins(_bins), atom2bin(_atom2bin),c_atom2bin(_atom2bin), @@ -272,7 +284,8 @@ class NeighborKokkosExecute ex_mol_intra(_ex_mol_intra), xperiodic(_xperiodic),yperiodic(_yperiodic),zperiodic(_zperiodic), xprd_half(_xprd_half),yprd_half(_yprd_half),zprd_half(_zprd_half), - skin(_skin) { + skin(_skin),resize(_resize),h_resize(_h_resize), + new_maxneighs(_new_maxneighs),h_new_maxneighs(_h_new_maxneighs) { if (molecular == 2) moltemplate = 1; else moltemplate = 0; @@ -280,20 +293,7 @@ class NeighborKokkosExecute bboxlo[0] = _bboxlo[0]; bboxlo[1] = _bboxlo[1]; bboxlo[2] = _bboxlo[2]; bboxhi[0] = _bboxhi[0]; bboxhi[1] = _bboxhi[1]; bboxhi[2] = _bboxhi[2]; - resize = typename AT::t_int_scalar(Kokkos::view_alloc("NeighborKokkosFunctor::resize",Kokkos::WithoutInitializing)); -#ifndef KOKKOS_USE_CUDA_UVM - h_resize = Kokkos::create_mirror_view(resize); -#else - h_resize = resize; -#endif h_resize() = 1; - new_maxneighs = typename AT:: - t_int_scalar(Kokkos::view_alloc("NeighborKokkosFunctor::new_maxneighs",Kokkos::WithoutInitializing)); -#ifndef KOKKOS_USE_CUDA_UVM - h_new_maxneighs = Kokkos::create_mirror_view(new_maxneighs); -#else - h_new_maxneighs = new_maxneighs; -#endif h_new_maxneighs() = neigh_list.maxneighs; }; diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 8758b2f03c..63502a1e27 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -274,7 +274,7 @@ struct PairComputeFunctor { const X_FLOAT ytmp = c.x(i,1); const X_FLOAT ztmp = c.x(i,2); const int itype = c.type(i); - + const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -388,13 +388,12 @@ struct PairComputeFunctor { const int lastatom = firstatom + atoms_per_team < inum ? firstatom + atoms_per_team : inum; Kokkos::parallel_for(Kokkos::TeamThreadRange(team, firstatom, lastatom), [&] (const int &ii) { - const int i = list.d_ilist[ii]; const X_FLOAT xtmp = c.x(i,0); const X_FLOAT ytmp = c.x(i,1); const X_FLOAT ztmp = c.x(i,2); const int itype = c.type(i); - + const AtomNeighborsConst neighbors_i = list.get_neighbors_const(i); const int jnum = list.d_numneigh[i]; @@ -875,14 +874,14 @@ EV_FLOAT pair_compute_neighlist (PairStyle* fpair, typename Kokkos::Impl::enable PairComputeFunctor ff(fpair,list); atoms_per_team = GetTeamSize(ff, atoms_per_team, vector_length); Kokkos::TeamPolicy > policy(list->inum,atoms_per_team,vector_length); - if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(policy,ff,ev); - else Kokkos::parallel_for(policy,ff); + if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(Kokkos::Experimental::require(policy,Kokkos::Experimental::WorkItemProperty::HintLightWeight),ff,ev); + else Kokkos::parallel_for(Kokkos::Experimental::require(policy,Kokkos::Experimental::WorkItemProperty::HintLightWeight),ff); } else { PairComputeFunctor ff(fpair,list); atoms_per_team = GetTeamSize(ff, atoms_per_team, vector_length); Kokkos::TeamPolicy > policy(list->inum,atoms_per_team,vector_length); - if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(policy,ff,ev); - else Kokkos::parallel_for(policy,ff); + if (fpair->eflag || fpair->vflag) Kokkos::parallel_reduce(Kokkos::Experimental::require(policy,Kokkos::Experimental::WorkItemProperty::HintLightWeight),ff,ev); + else Kokkos::parallel_for(Kokkos::Experimental::require(policy,Kokkos::Experimental::WorkItemProperty::HintLightWeight),ff); } } else { if(fpair->atom->ntypes > MAX_TYPES_STACKPARAMS) { diff --git a/src/neighbor.h b/src/neighbor.h index 751beeae4b..6184731b61 100644 --- a/src/neighbor.h +++ b/src/neighbor.h @@ -126,6 +126,8 @@ class Neighbor : protected Pointers { bigint memory_usage(); + bigint last_setup_bins; // step of last neighbor::setup_bins() call + protected: int me,nprocs; int firsttime; // flag for calling init_styles() only once @@ -139,8 +141,6 @@ class Neighbor : protected Pointers { int fix_check; // # of fixes that induce reneigh int *fixchecklist; // which fixes to check - bigint last_setup_bins; // step of last neighbor::setup_bins() call - double triggersq; // trigger = build when atom moves this dist double **xhold; // atom coords at last neighbor build From 179026dd44108f78b600ecb957be5039bdcb7c82 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 14 Mar 2019 17:13:12 -0600 Subject: [PATCH 0245/1242] Reduce GPU data movement in npair_kokkos --- src/KOKKOS/npair_kokkos.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/KOKKOS/npair_kokkos.cpp b/src/KOKKOS/npair_kokkos.cpp index f2e73ac6e6..ecf4b2d5a5 100644 --- a/src/KOKKOS/npair_kokkos.cpp +++ b/src/KOKKOS/npair_kokkos.cpp @@ -187,7 +187,18 @@ void NPairKokkos::build(NeighList *list_) k_bincount.sync(); k_bins.sync(); k_atom2bin.sync(); - atomKK->sync(Device,X_MASK|RADIUS_MASK|TYPE_MASK|MASK_MASK|MOLECULE_MASK|TAG_MASK|SPECIAL_MASK); + + if (atom->molecular) { + if (exclude) + atomKK->sync(Device,X_MASK|RADIUS_MASK|TYPE_MASK|MASK_MASK|MOLECULE_MASK|TAG_MASK|SPECIAL_MASK); + else + atomKK->sync(Device,X_MASK|RADIUS_MASK|TYPE_MASK|TAG_MASK|SPECIAL_MASK); + } else { + if (exclude) + atomKK->sync(Device,X_MASK|RADIUS_MASK|TYPE_MASK|MASK_MASK); + else + atomKK->sync(Device,X_MASK|RADIUS_MASK|TYPE_MASK); + } data.special_flag[0] = special_flag[0]; data.special_flag[1] = special_flag[1]; From 3abfce01caab080498564eaa99b093af04bfc57f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 15 Mar 2019 14:06:03 -0400 Subject: [PATCH 0246/1242] 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 0247/1242] 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 0248/1242] 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 0249/1242] 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 0250/1242] 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 0251/1242] 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 0252/1242] 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 0253/1242] 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 0254/1242] 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 0255/1242] 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 0256/1242] 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 8c4baac3f10b7d2c505a9ffe73c22bdd7e8656ee Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 15 Mar 2019 14:25:24 -0600 Subject: [PATCH 0257/1242] Only copy force on ghost atoms if newton on --- src/KOKKOS/atom_vec_atomic_kokkos.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/atom_vec_atomic_kokkos.cpp b/src/KOKKOS/atom_vec_atomic_kokkos.cpp index e3c1bee956..80321fd2ea 100644 --- a/src/KOKKOS/atom_vec_atomic_kokkos.cpp +++ b/src/KOKKOS/atom_vec_atomic_kokkos.cpp @@ -21,6 +21,7 @@ #include "atom_masks.h" #include "memory_kokkos.h" #include "error.h" +#include "force.h" using namespace LAMMPS_NS; @@ -901,7 +902,14 @@ void AtomVecAtomicKokkos::sync(ExecutionSpace space, unsigned int mask) if (space == Device) { if (mask & X_MASK) atomKK->k_x.sync(); if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); + if (mask & F_MASK) { + if (!force || force->newton) { + atomKK->k_f.sync(); + } else { + auto k_f_nlocal = Kokkos::subview(atomKK->k_f,std::make_pair(0,atom->nlocal),Kokkos::ALL); + k_f_nlocal.sync(); + } + } if (mask & TAG_MASK) atomKK->k_tag.sync(); if (mask & TYPE_MASK) atomKK->k_type.sync(); if (mask & MASK_MASK) atomKK->k_mask.sync(); @@ -909,7 +917,14 @@ void AtomVecAtomicKokkos::sync(ExecutionSpace space, unsigned int mask) } else { if (mask & X_MASK) atomKK->k_x.sync(); if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); + if (mask & F_MASK) { + if (!force || force->newton) { + atomKK->k_f.sync(); + } else { + auto k_f_nlocal = Kokkos::subview(atomKK->k_f,std::make_pair(0,atom->nlocal),Kokkos::ALL); + k_f_nlocal.sync(); + } + } if (mask & TAG_MASK) atomKK->k_tag.sync(); if (mask & TYPE_MASK) atomKK->k_type.sync(); if (mask & MASK_MASK) atomKK->k_mask.sync(); From ac20d1ab41d63096f60cdeac54d1f76cb60b5dff Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Mon, 18 Mar 2019 09:52:16 -0600 Subject: [PATCH 0258/1242] 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 36836598b1a4bbe76fac874274ae9d5f1dc635b9 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 18 Mar 2019 10:45:14 -0600 Subject: [PATCH 0259/1242] Reduce data transfer in exchange --- src/KOKKOS/comm_kokkos.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index 5aa2cbdfbe..06807b08b9 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -57,10 +57,10 @@ CommKokkos::CommKokkos(LAMMPS *lmp) : CommBrick(lmp) memory->destroy(buf_recv); buf_recv = NULL; - k_exchange_sendlist = DAT:: - tdual_int_1d("comm:k_exchange_sendlist",100); - k_exchange_copylist = DAT:: - tdual_int_1d("comm:k_exchange_copylist",100); + k_exchange_lists = DAT:: + tdual_int_1d("comm:k_exchange_lists",2,100); + k_exchange_sendlist = Kokkos::subview(k_exchange_lists,0,KOKKOS::ALL); + k_exchange_copylist = Kokkos::subview(k_exchange_lists,1,KOKKOS::ALL); k_count = DAT::tdual_int_scalar("comm:k_count"); k_sendflag = DAT::tdual_int_1d("comm:k_sendflag",100); @@ -619,8 +619,9 @@ void CommKokkos::exchange_device() k_count.h_view()=k_exchange_sendlist.h_view.extent(0); } } - k_exchange_copylist.sync(); - k_exchange_sendlist.sync(); + + auto k_exchange_lists_short = Kokkos::subview(k_exchange_lists,KOKKOS::ALL,k_count.h_view()); + k_exchange_lists_short.template sync(); k_sendflag.sync(); int sendpos = nlocal-1; @@ -634,8 +635,8 @@ void CommKokkos::exchange_device() k_exchange_copylist.h_view(i) = -1; } - k_exchange_copylist.modify(); - k_exchange_copylist.sync(); + k_exchange_copylist_short.modify(); + k_exchange_copylist_short.sync(); nsend = k_count.h_view(); if (nsend > maxsend) grow_send_kokkos(nsend,1); nsend = From b50ef59a199346141ae06bea6e474fb5ade762bd Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 18 Mar 2019 13:17:32 -0600 Subject: [PATCH 0260/1242] Optimize Kokkos comm for small systems --- src/KOKKOS/comm_kokkos.cpp | 96 ++++++++++++++++++++------------------ src/KOKKOS/comm_kokkos.h | 2 + 2 files changed, 53 insertions(+), 45 deletions(-) diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index 06807b08b9..814824bc5b 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -57,10 +57,9 @@ CommKokkos::CommKokkos(LAMMPS *lmp) : CommBrick(lmp) memory->destroy(buf_recv); buf_recv = NULL; - k_exchange_lists = DAT:: - tdual_int_1d("comm:k_exchange_lists",2,100); - k_exchange_sendlist = Kokkos::subview(k_exchange_lists,0,KOKKOS::ALL); - k_exchange_copylist = Kokkos::subview(k_exchange_lists,1,KOKKOS::ALL); + k_exchange_lists = DAT::tdual_int_2d("comm:k_exchange_lists",2,100); + k_exchange_sendlist = Kokkos::subview(k_exchange_lists,0,Kokkos::ALL); + k_exchange_copylist = Kokkos::subview(k_exchange_lists,1,Kokkos::ALL); k_count = DAT::tdual_int_scalar("comm:k_count"); k_sendflag = DAT::tdual_int_1d("comm:k_sendflag",100); @@ -188,6 +187,8 @@ void CommKokkos::forward_comm_device(int dummy) atomKK->sync(ExecutionSpaceFromDevice::space,X_MASK); if (comm->nprocs == 1) { + k_swap.sync(); + k_pbc.sync(); n = avec->pack_comm_self_fused(totalsend,k_sendlist,k_sendnum_scan, k_firstrecv,k_pbc_flag,k_pbc); } else { @@ -620,8 +621,7 @@ void CommKokkos::exchange_device() } } - auto k_exchange_lists_short = Kokkos::subview(k_exchange_lists,KOKKOS::ALL,k_count.h_view()); - k_exchange_lists_short.template sync(); + k_exchange_lists.sync(); k_sendflag.sync(); int sendpos = nlocal-1; @@ -635,6 +635,7 @@ void CommKokkos::exchange_device() k_exchange_copylist.h_view(i) = -1; } + auto k_exchange_copylist_short = Kokkos::subview(k_exchange_copylist,k_count.h_view()); k_exchange_copylist_short.modify(); k_exchange_copylist_short.sync(); nsend = k_count.h_view(); @@ -749,14 +750,16 @@ void CommKokkos::borders() if (!exchange_comm_classic) { if (exchange_comm_on_host) borders_device(); else borders_device(); - return; + } else { + atomKK->sync(Host,ALL_MASK); + k_sendlist.sync(); + CommBrick::borders(); + k_sendlist.modify(); + atomKK->modified(Host,ALL_MASK); } - atomKK->sync(Host,ALL_MASK); - k_sendlist.sync(); - CommBrick::borders(); - k_sendlist.modify(); - atomKK->modified(Host,ALL_MASK); + if (comm->nprocs == 1 && !forward_comm_classic) + copy_pbc_info(); } /* ---------------------------------------------------------------------- */ @@ -1043,40 +1046,43 @@ void CommKokkos::borders_device() { atomKK->sync(Host,TAG_MASK); atom->map_set(); } - - if (comm->nprocs == 1) { - if (nswap > k_pbc.extent(0)) { - k_pbc = DAT::tdual_int_2d("comm:pbc",nswap,6); - k_swap = DAT::tdual_int_2d("comm:swap",3,nswap); - k_pbc_flag .d_view = Kokkos::subview(k_swap.d_view,0,Kokkos::ALL); - k_firstrecv .d_view = Kokkos::subview(k_swap.d_view,1,Kokkos::ALL); - k_sendnum_scan.d_view = Kokkos::subview(k_swap.d_view,2,Kokkos::ALL); - k_pbc_flag .h_view = Kokkos::subview(k_swap.h_view,0,Kokkos::ALL); - k_firstrecv .h_view = Kokkos::subview(k_swap.h_view,1,Kokkos::ALL); - k_sendnum_scan.h_view = Kokkos::subview(k_swap.h_view,2,Kokkos::ALL); - } - int scan = 0; - for (int iswap = 0; iswap < nswap; iswap++) { - scan += sendnum[iswap]; - k_sendnum_scan.h_view[iswap] = scan; - k_firstrecv.h_view[iswap] = firstrecv[iswap]; - k_pbc_flag.h_view[iswap] = pbc_flag[iswap]; - k_pbc.h_view(iswap,0) = pbc[iswap][0]; - k_pbc.h_view(iswap,1) = pbc[iswap][1]; - k_pbc.h_view(iswap,2) = pbc[iswap][2]; - k_pbc.h_view(iswap,3) = pbc[iswap][3]; - k_pbc.h_view(iswap,4) = pbc[iswap][4]; - k_pbc.h_view(iswap,5) = pbc[iswap][5]; - } - totalsend = scan; - - k_swap.modify(); - k_pbc.modify(); - - k_swap.sync(); - k_pbc.sync(); - } } + +/* ---------------------------------------------------------------------- + copy pbc info +------------------------------------------------------------------------- */ + +void CommKokkos::copy_pbc_info() +{ + if (nswap > k_pbc.extent(0)) { + k_pbc = DAT::tdual_int_2d("comm:pbc",nswap,6); + k_swap = DAT::tdual_int_2d("comm:swap",3,nswap); + k_pbc_flag .d_view = Kokkos::subview(k_swap.d_view,0,Kokkos::ALL); + k_firstrecv .d_view = Kokkos::subview(k_swap.d_view,1,Kokkos::ALL); + k_sendnum_scan.d_view = Kokkos::subview(k_swap.d_view,2,Kokkos::ALL); + k_pbc_flag .h_view = Kokkos::subview(k_swap.h_view,0,Kokkos::ALL); + k_firstrecv .h_view = Kokkos::subview(k_swap.h_view,1,Kokkos::ALL); + k_sendnum_scan.h_view = Kokkos::subview(k_swap.h_view,2,Kokkos::ALL); + } + int scan = 0; + for (int iswap = 0; iswap < nswap; iswap++) { + scan += sendnum[iswap]; + k_sendnum_scan.h_view[iswap] = scan; + k_firstrecv.h_view[iswap] = firstrecv[iswap]; + k_pbc_flag.h_view[iswap] = pbc_flag[iswap]; + k_pbc.h_view(iswap,0) = pbc[iswap][0]; + k_pbc.h_view(iswap,1) = pbc[iswap][1]; + k_pbc.h_view(iswap,2) = pbc[iswap][2]; + k_pbc.h_view(iswap,3) = pbc[iswap][3]; + k_pbc.h_view(iswap,4) = pbc[iswap][4]; + k_pbc.h_view(iswap,5) = pbc[iswap][5]; + } + totalsend = scan; + + k_swap.modify(); + k_pbc.modify(); +} + /* ---------------------------------------------------------------------- realloc the size of the send buffer as needed with BUFFACTOR and bufextra if flag = 1, realloc diff --git a/src/KOKKOS/comm_kokkos.h b/src/KOKKOS/comm_kokkos.h index cab8124231..194826f9df 100644 --- a/src/KOKKOS/comm_kokkos.h +++ b/src/KOKKOS/comm_kokkos.h @@ -58,6 +58,7 @@ class CommKokkos : public CommBrick { DAT::tdual_int_2d k_sendlist; DAT::tdual_int_scalar k_total_send; DAT::tdual_xfloat_2d k_buf_send,k_buf_recv; + DAT::tdual_int_2d k_exchange_lists; DAT::tdual_int_1d k_exchange_sendlist,k_exchange_copylist,k_sendflag; DAT::tdual_int_scalar k_count; //double *buf_send; // send buffer for all comm @@ -81,6 +82,7 @@ class CommKokkos : public CommBrick { void grow_recv_kokkos(int, ExecutionSpace space = Host); void grow_list(int, int); void grow_swap(int); + void copy_pbc_info(); }; } From e2d28f5160d9f58c1519ee40fd289c8918f1383a Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Mon, 18 Mar 2019 15:27:35 -0600 Subject: [PATCH 0261/1242] Only copy pbc info in comm setup --- src/KOKKOS/comm_kokkos.cpp | 52 +++++++++++++++++++++++--------------- src/KOKKOS/comm_kokkos.h | 3 ++- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index 814824bc5b..c6d8424c27 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -140,6 +140,31 @@ void CommKokkos::init() forward_comm_classic = true; } +/* ---------------------------------------------------------------------- */ + +void CommKokkos::setup() +{ + CommBrick::setup(); + + k_pbc_flag = DAT::tdual_int_1d("comm:pbc_flag",nswap); + k_pbc = DAT::tdual_int_2d("comm:pbc",nswap,6); + + for (int iswap = 0; iswap < nswap; iswap++) { + k_pbc_flag.h_view[iswap] = pbc_flag[iswap]; + k_pbc.h_view(iswap,0) = pbc[iswap][0]; + k_pbc.h_view(iswap,1) = pbc[iswap][1]; + k_pbc.h_view(iswap,2) = pbc[iswap][2]; + k_pbc.h_view(iswap,3) = pbc[iswap][3]; + k_pbc.h_view(iswap,4) = pbc[iswap][4]; + k_pbc.h_view(iswap,5) = pbc[iswap][5]; + } + k_pbc_flag.modify(); + k_pbc.modify(); + + k_pbc_flag.sync(); + k_pbc.sync(); +} + /* ---------------------------------------------------------------------- forward communication of atom coords every timestep other per-atom attributes may also be sent via pack/unpack routines @@ -759,7 +784,7 @@ void CommKokkos::borders() } if (comm->nprocs == 1 && !forward_comm_classic) - copy_pbc_info(); + copy_swap_info(); } /* ---------------------------------------------------------------------- */ @@ -1049,38 +1074,25 @@ void CommKokkos::borders_device() { } /* ---------------------------------------------------------------------- - copy pbc info + copy swap info ------------------------------------------------------------------------- */ -void CommKokkos::copy_pbc_info() +void CommKokkos::copy_swap_info() { - if (nswap > k_pbc.extent(0)) { - k_pbc = DAT::tdual_int_2d("comm:pbc",nswap,6); - k_swap = DAT::tdual_int_2d("comm:swap",3,nswap); - k_pbc_flag .d_view = Kokkos::subview(k_swap.d_view,0,Kokkos::ALL); - k_firstrecv .d_view = Kokkos::subview(k_swap.d_view,1,Kokkos::ALL); - k_sendnum_scan.d_view = Kokkos::subview(k_swap.d_view,2,Kokkos::ALL); - k_pbc_flag .h_view = Kokkos::subview(k_swap.h_view,0,Kokkos::ALL); - k_firstrecv .h_view = Kokkos::subview(k_swap.h_view,1,Kokkos::ALL); - k_sendnum_scan.h_view = Kokkos::subview(k_swap.h_view,2,Kokkos::ALL); + if (nswap > k_swap.extent(1)) { + k_swap = DAT::tdual_int_2d("comm:swap",2,nswap); + k_firstrecv = Kokkos::subview(k_swap,0,Kokkos::ALL); + k_sendnum_scan = Kokkos::subview(k_swap,1,Kokkos::ALL); } int scan = 0; for (int iswap = 0; iswap < nswap; iswap++) { scan += sendnum[iswap]; k_sendnum_scan.h_view[iswap] = scan; k_firstrecv.h_view[iswap] = firstrecv[iswap]; - k_pbc_flag.h_view[iswap] = pbc_flag[iswap]; - k_pbc.h_view(iswap,0) = pbc[iswap][0]; - k_pbc.h_view(iswap,1) = pbc[iswap][1]; - k_pbc.h_view(iswap,2) = pbc[iswap][2]; - k_pbc.h_view(iswap,3) = pbc[iswap][3]; - k_pbc.h_view(iswap,4) = pbc[iswap][4]; - k_pbc.h_view(iswap,5) = pbc[iswap][5]; } totalsend = scan; k_swap.modify(); - k_pbc.modify(); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/comm_kokkos.h b/src/KOKKOS/comm_kokkos.h index 194826f9df..d5428c8b0c 100644 --- a/src/KOKKOS/comm_kokkos.h +++ b/src/KOKKOS/comm_kokkos.h @@ -33,6 +33,7 @@ class CommKokkos : public CommBrick { CommKokkos(class LAMMPS *); ~CommKokkos(); void init(); + void setup(); void forward_comm(int dummy = 0); // forward comm of atom coords void reverse_comm(); // reverse comm of atom coords @@ -82,7 +83,7 @@ class CommKokkos : public CommBrick { void grow_recv_kokkos(int, ExecutionSpace space = Host); void grow_list(int, int); void grow_swap(int); - void copy_pbc_info(); + void copy_swap_info(); }; } From 194e11c3297d6238b2ae164fa09dfab1f3eab4ea Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 19 Mar 2019 08:12:49 -0600 Subject: [PATCH 0262/1242] Commit JT 031919 - bug with sk sim - commit/push before pull up-to-date SPIN from master --- src/REPLICA/fix_neb_spin.cpp | 6 ++++++ src/REPLICA/fix_neb_spin.h | 6 ------ src/REPLICA/neb_spin.cpp | 6 ++++++ src/SPIN/min_spinmin.cpp | 6 ++++++ src/SPIN/pair_spin_dmi.cpp | 5 +++-- 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/REPLICA/fix_neb_spin.cpp index 95d5e19f25..610e6d2fe5 100644 --- a/src/REPLICA/fix_neb_spin.cpp +++ b/src/REPLICA/fix_neb_spin.cpp @@ -11,6 +11,12 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ + Contributing authors: Julien Tranchida (SNL) + + Please cite the related publication: +------------------------------------------------------------------------- */ + #include #include #include diff --git a/src/REPLICA/fix_neb_spin.h b/src/REPLICA/fix_neb_spin.h index c70f35ae2d..9bbacc8bf0 100644 --- a/src/REPLICA/fix_neb_spin.h +++ b/src/REPLICA/fix_neb_spin.h @@ -13,7 +13,6 @@ #ifdef FIX_CLASS -//FixStyle(neb,FixNEB) FixStyle(neb/spin,FixNEB_spin) #else @@ -36,8 +35,6 @@ class FixNEB_spin : public Fix { void init(); void min_setup(int); void min_post_force(int); - //void advance_spins(double); - //double evaluate_dt(); private: int me,nprocs,nprocs_universe; @@ -60,13 +57,11 @@ class FixNEB_spin : public Fix { int maxlocal; // size of xprev,xnext,tangent arrays double *nlenall; double **xprev,**xnext,**fnext; - // spin quantities double **spprev,**spnext,**fmnext; double **springF; double **tangent; double **xsend,**xrecv; // coords to send/recv to/from other replica double **fsend,**frecv; // coords to send/recv to/from other replica - // spin quantities double **spsend,**sprecv; // sp to send/recv to/from other replica double **fmsend,**fmrecv; // fm to send/recv to/from other replica tagint *tagsend,*tagrecv; // ditto for atom IDs @@ -74,7 +69,6 @@ class FixNEB_spin : public Fix { // info gathered from all procs in my replica double **xsendall,**xrecvall; // coords to send/recv to/from other replica double **fsendall,**frecvall; // force to send/recv to/from other replica - // spin quantities double **spsendall,**sprecvall; // sp to send/recv to/from other replica double **fmsendall,**fmrecvall; // fm to send/recv to/from other replica tagint *tagsendall,*tagrecvall; // ditto for atom IDs diff --git a/src/REPLICA/neb_spin.cpp b/src/REPLICA/neb_spin.cpp index 6681bf56ad..38f5b530da 100644 --- a/src/REPLICA/neb_spin.cpp +++ b/src/REPLICA/neb_spin.cpp @@ -11,6 +11,12 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ + Contributing authors: Julien Tranchida (SNL) + + Please cite the related publication: +------------------------------------------------------------------------- */ + // lmptype.h must be first b/c this file uses MAXBIGINT and includes mpi.h // due to OpenMPI bug which sets INT64_MAX via its mpi.h // before lmptype.h can set flags to insure it is done correctly diff --git a/src/SPIN/min_spinmin.cpp b/src/SPIN/min_spinmin.cpp index cdd0d45287..808a5359bc 100644 --- a/src/SPIN/min_spinmin.cpp +++ b/src/SPIN/min_spinmin.cpp @@ -11,6 +11,12 @@ See the README file in the top-level LAMMPS directory. ------------------------------------------------------------------------- */ +/* ------------------------------------------------------------------------ + Contributing authors: Julien Tranchida (SNL) + + Please cite the related publication: +------------------------------------------------------------------------- */ + #include #include #include "min_spinmin.h" diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 18682fdb9f..0862e5c618 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -173,8 +173,9 @@ void PairSpinDmi::init_style() if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; ifix++; } - if (ifix == modify->nfix) - error->all(FLERR,"pair/spin style requires nve/spin"); + // test remove if test + //if (ifix == modify->nfix) + // error->all(FLERR,"pair/spin style requires nve/spin"); // get the lattice_flag from nve/spin From cf8bee9b46da121e2c930b8cba2b96635a1ad92c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 19 Mar 2019 11:43:29 -0400 Subject: [PATCH 0263/1242] 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 0264/1242] 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 0265/1242] 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 0266/1242] 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 0267/1242] 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 0268/1242] 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 0269/1242] 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 0270/1242] 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 0271/1242] 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 0272/1242] 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 0273/1242] 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 08273c40d7489c7015b600ff7b9b5f4a7d029313 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 19 Mar 2019 14:29:45 -0600 Subject: [PATCH 0274/1242] Fix compile issue in comm_kokkos --- src/KOKKOS/comm_kokkos.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index c6d8424c27..4396637153 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -661,8 +661,8 @@ void CommKokkos::exchange_device() } auto k_exchange_copylist_short = Kokkos::subview(k_exchange_copylist,k_count.h_view()); - k_exchange_copylist_short.modify(); - k_exchange_copylist_short.sync(); + k_exchange_copylist_short.template modify(); + k_exchange_copylist_short.template sync(); nsend = k_count.h_view(); if (nsend > maxsend) grow_send_kokkos(nsend,1); nsend = From a508f1de6c8001b7c70cf75330663faf06996818 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 19 Mar 2019 22:30:44 -0600 Subject: [PATCH 0275/1242] 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 0276/1242] 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 2cbf56846a28fe7ffc751b0fd270d17a80c73653 Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 20 Mar 2019 10:41:36 -0600 Subject: [PATCH 0277/1242] Commit JT 032019 - moved gneb files from src/REPLICA to src/SPIN - changed name of min/spin - implemented read_param in min.cpp and min_spin.cpp - set sp_flag tests in min_spin.cpp and neb_spin.cpp --- doc/src/min_style.txt | 12 ++-- examples/SPIN/gneb/in.gneb.iron | 2 +- examples/SPIN/spinmin/in.spinmin.bfo | 2 +- examples/SPIN/spinmin/in.spinmin.iron | 2 +- src/SPIN/README | 5 +- src/{REPLICA => SPIN}/fix_neb_spin.cpp | 0 src/{REPLICA => SPIN}/fix_neb_spin.h | 0 src/SPIN/fix_precession_spin.cpp | 4 +- src/SPIN/{min_spinmin.cpp => min_spin.cpp} | 41 ++++++++--- src/SPIN/{min_spinmin.h => min_spin.h} | 16 +++-- src/{REPLICA => SPIN}/neb_spin.cpp | 79 ++++++++++++++++++++-- src/{REPLICA => SPIN}/neb_spin.h | 0 src/min.cpp | 14 ++-- src/min.h | 6 +- 14 files changed, 133 insertions(+), 50 deletions(-) rename src/{REPLICA => SPIN}/fix_neb_spin.cpp (100%) rename src/{REPLICA => SPIN}/fix_neb_spin.h (100%) rename src/SPIN/{min_spinmin.cpp => min_spin.cpp} (90%) rename src/SPIN/{min_spinmin.h => min_spin.h} (78%) rename src/{REPLICA => SPIN}/neb_spin.cpp (93%) rename src/{REPLICA => SPIN}/neb_spin.h (100%) diff --git a/doc/src/min_style.txt b/doc/src/min_style.txt index b1a9da997d..f8c05d5483 100644 --- a/doc/src/min_style.txt +++ b/doc/src/min_style.txt @@ -11,7 +11,7 @@ min_style command :h3 min_style style :pre -style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spinmin} :ul +style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} :ul [Examples:] @@ -62,18 +62,14 @@ 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 {spinmin} is a damped spin dynamics with a variable +Style {spin} is a damped spin dynamics with a variable timestep as described in "(Tranchida)"_#Tranchida. -The value of the fictitious Gilbert damping and of the dividing -factor for the adaptive timestep can be modified by the -{alpha_damp} and {discret_factor} options respectively. -Those options can be defined using the "min_modify"_min_modify.html -command. +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. -The {spinmin} style is useful in the context of geodesic nudged +The {spin} style is useful in the context of geodesic nudged elastic band (GNEB) calculations via the "neb/spin"_neb_spin.html command. diff --git a/examples/SPIN/gneb/in.gneb.iron b/examples/SPIN/gneb/in.gneb.iron index 7aab0c04c3..a8028392a1 100644 --- a/examples/SPIN/gneb/in.gneb.iron +++ b/examples/SPIN/gneb/in.gneb.iron @@ -55,7 +55,7 @@ variable u universe 1 2 3 4 #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] dump 1 all custom 200 dump.$u type x y z c_outsp[1] c_outsp[2] c_outsp[3] -min_style spinmin +min_style spin min_modify alpha_damp 1.0 discret_factor 10.0 neb/spin 1.0e-12 1.0e-12 50000 50000 10 final final.iron_spin #neb/spin 1.0e-6 1.0e-6 1000 10 10 final final.iron_spin diff --git a/examples/SPIN/spinmin/in.spinmin.bfo b/examples/SPIN/spinmin/in.spinmin.bfo index a00af8833c..5b678c8a4d 100644 --- a/examples/SPIN/spinmin/in.spinmin.bfo +++ b/examples/SPIN/spinmin/in.spinmin.bfo @@ -52,6 +52,6 @@ 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 spinmin +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 index 5a15082122..b87a811cc7 100644 --- a/examples/SPIN/spinmin/in.spinmin.iron +++ b/examples/SPIN/spinmin/in.spinmin.iron @@ -52,6 +52,6 @@ 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 spinmin +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/README b/src/SPIN/README index e371e39767..c3c02b1445 100644 --- a/src/SPIN/README +++ b/src/SPIN/README @@ -8,13 +8,16 @@ atom in the system * integrating the equations of motion for the coupled spin-lattice system * implementing magnetic pair interactions and magnetic forces * thermostating and applying a transverse damping to the magnetic spins +* minimizing spin configurations with an adaptive timestep scheme +* performing geodesic NEB calculations * computing and outputing magnetic quantities The different options provided by this package are explained in the LAMMPS documentation. Once you have successfully built LAMMPS with this package, you can test -it using one of the input files provided from the examples/SPIN dir: +it using one of the input files provided from the examples/SPIN dir. +For example: ./lmp_serial < lammps/examples/SPIN/cobalt_hcp/in.spin.cobalt_hcp diff --git a/src/REPLICA/fix_neb_spin.cpp b/src/SPIN/fix_neb_spin.cpp similarity index 100% rename from src/REPLICA/fix_neb_spin.cpp rename to src/SPIN/fix_neb_spin.cpp diff --git a/src/REPLICA/fix_neb_spin.h b/src/SPIN/fix_neb_spin.h similarity index 100% rename from src/REPLICA/fix_neb_spin.h rename to src/SPIN/fix_neb_spin.h 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; } diff --git a/src/SPIN/min_spinmin.cpp b/src/SPIN/min_spin.cpp similarity index 90% rename from src/SPIN/min_spinmin.cpp rename to src/SPIN/min_spin.cpp index 808a5359bc..ac8f22186e 100644 --- a/src/SPIN/min_spinmin.cpp +++ b/src/SPIN/min_spin.cpp @@ -19,7 +19,7 @@ #include #include -#include "min_spinmin.h" +#include "min_spin.h" #include "universe.h" #include "atom.h" #include "force.h" @@ -27,7 +27,6 @@ #include "output.h" #include "timer.h" #include "error.h" - #include #include #include "modify.h" @@ -46,11 +45,11 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -MinSpinMin::MinSpinMin(LAMMPS *lmp) : Min(lmp) {} +MinSpin::MinSpin(LAMMPS *lmp) : Min(lmp) {} /* ---------------------------------------------------------------------- */ -void MinSpinMin::init() +void MinSpin::init() { alpha_damp = 1.0; discret_factor = 10.0; @@ -63,21 +62,43 @@ void MinSpinMin::init() /* ---------------------------------------------------------------------- */ -void MinSpinMin::setup_style() +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 MinSpinMin::reset_vectors() +void MinSpin::reset_vectors() { // atomic dof @@ -96,7 +117,7 @@ void MinSpinMin::reset_vectors() minimization via damped spin dynamics ------------------------------------------------------------------------- */ -int MinSpinMin::iterate(int maxiter) +int MinSpin::iterate(int maxiter) { bigint ntimestep; double fmdotfm,fmdotfmall; @@ -172,7 +193,7 @@ int MinSpinMin::iterate(int maxiter) evaluate max timestep ---------------------------------------------------------------------- */ -double MinSpinMin::evaluate_dt() +double MinSpin::evaluate_dt() { double dtmax; double fmsq; @@ -218,7 +239,7 @@ double MinSpinMin::evaluate_dt() geometric damped advance of spins ---------------------------------------------------------------------- */ -void MinSpinMin::advance_spins(double dts) +void MinSpin::advance_spins(double dts) { int nlocal = atom->nlocal; int *mask = atom->mask; @@ -282,7 +303,7 @@ void MinSpinMin::advance_spins(double dts) compute and return ||mag. torque||_2^2 ------------------------------------------------------------------------- */ -double MinSpinMin::fmnorm_sqr() +double MinSpin::fmnorm_sqr() { int i,n; double *fmatom; diff --git a/src/SPIN/min_spinmin.h b/src/SPIN/min_spin.h similarity index 78% rename from src/SPIN/min_spinmin.h rename to src/SPIN/min_spin.h index abc532a3d5..569bcbaab2 100644 --- a/src/SPIN/min_spinmin.h +++ b/src/SPIN/min_spin.h @@ -13,23 +13,24 @@ #ifdef MINIMIZE_CLASS -MinimizeStyle(spinmin,MinSpinMin) +MinimizeStyle(spin,MinSpin) #else -#ifndef LMP_MIN_SPINMIN_H -#define LMP_MIN_SPINMIN_H +#ifndef LMP_MIN_SPIN_H +#define LMP_MIN_SPIN_H #include "min.h" namespace LAMMPS_NS { -class MinSpinMin : public Min { +class MinSpin : public Min { public: - MinSpinMin(class LAMMPS *); - ~MinSpinMin() {} + MinSpin(class LAMMPS *); + ~MinSpin() {} void init(); void setup_style(); + int modify_param(int, char **); void reset_vectors(); int iterate(int); double evaluate_dt(); @@ -43,6 +44,9 @@ class MinSpinMin : public Min { 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 diff --git a/src/REPLICA/neb_spin.cpp b/src/SPIN/neb_spin.cpp similarity index 93% rename from src/REPLICA/neb_spin.cpp rename to src/SPIN/neb_spin.cpp index 38f5b530da..f5d9a75020 100644 --- a/src/REPLICA/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -109,7 +109,7 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, sp[i][0] = spfinal[0]; sp[i][1] = spfinal[1]; sp[i][2] = spfinal[2]; - + ii += 3; } } @@ -228,8 +228,8 @@ void NEB_spin::run() if (update->minimize->searchflag) error->all(FLERR,"NEB_spin requires damped dynamics minimizer"); - if (strcmp(update->minimize_style,"spinmin") != 0) - error->all(FLERR,"NEB_spin requires spinmin minimizer"); + if (strcmp(update->minimize_style,"spin") != 0) + error->all(FLERR,"NEB_spin requires spin minimizer"); // setup regular NEB_spin minimization @@ -530,10 +530,14 @@ void NEB_spin::readfile(char *file, int flag) spfinal[0] = spx; spfinal[1] = spy; spfinal[2] = spz; + + printf("test spinit[0]:%g \n",sp[m][0]); // interpolate intermediate spin states initial_rotation(spinit,spfinal,fraction); + + printf("test spfinal[0]:%g \n",spfinal[0]); sp[m][0] = spfinal[0]; sp[m][1] = spfinal[1]; @@ -556,6 +560,8 @@ void NEB_spin::readfile(char *file, int flag) nread += nchunk; } + printf("test sp[1][2]:%g \n",sp[1][2]); + // check that all atom IDs in file were found by a proc if (flag == 0) { @@ -613,11 +619,15 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) spfy = sploc[1]; spfz = sploc[2]; + iphi = itheta = fphi = ftheta = 0.0; + iphi = acos(spiz); - itheta = acos(spix/sin(iphi)); + if (sin(iphi) != 0.0) + itheta = acos(spix/sin(iphi)); fphi = acos(spfz); - ftheta = acos(spfx/sin(fphi)); + if (sin(fphi) != 0.0) + ftheta = acos(spfx/sin(fphi)); kphi = iphi + fraction*(fphi-iphi); ktheta = itheta + fraction*(ftheta-itheta); @@ -626,12 +636,69 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) spky = sin(ktheta)*sin(kphi); spkz = cos(kphi); - iknorm = spkx*spkx+spky*spky+spkz*spkz; + double knormsq = spkx*spkx+spky*spky+spkz*spkz; + if (knormsq != 0.0) + iknorm = 1.0/sqrt(knormsq); spkx *= iknorm; spky *= iknorm; spkz *= iknorm; + //sploc[0] = spkx; + //sploc[1] = spky; + //sploc[2] = spkz; + + //double kx,ky,kz; + //double spix,spiy,spiz,spfx,spfy,spfz; + //double kcrossx,kcrossy,kcrossz,knormsq; + //double spkx,spky,spkz; + //double sdot,omega,iknorm; + + //spix = spi[0]; + //spiy = spi[1]; + //spiz = spi[2]; + + //spfx = sploc[0]; + //spfy = sploc[1]; + //spfz = sploc[2]; + // + //kx = spiy*spfz - spiz*spfy; + //ky = spiz*spfx - spix*spfz; + //kz = spix*spfy - spiy*spfx; + + //knormsq = kx*kx+ky*ky+kz*kz; + // + //if (knormsq != 0.0) { + // iknorm = 1.0/sqrt(knormsq); + // kx *= iknorm; + // ky *= iknorm; + // kz *= iknorm; + //} + // + //kcrossx = ky*spiz - kz*spiy; + //kcrossy = kz*spix - kx*spiz; + //kcrossz = kx*spiy - ky*spix; + + //sdot = spix*spfx + spiy*spfy + spiz*spfz; + + //omega = acos(sdot); + //omega *= fraction; + + //spkx = spix*cos(omega) + kcrossx*sin(omega); + //spky = spiy*cos(omega) + kcrossy*sin(omega); + //spkz = spiz*cos(omega) + kcrossz*sin(omega); + // + //iknorm = 1.0/sqrt(spkx*spkx+spky*spky+spkz*spkz); + //if (iknorm == 0.0) + // error->all(FLERR,"Incorrect rotation operation"); + + //spkx *= iknorm; + //spky *= iknorm; + //spkz *= iknorm; + + printf("init: %g %g %g \n",spix,spiy,spiz); + printf("fina: %g %g %g \n",spkx,spky,spkz); + sploc[0] = spkx; sploc[1] = spky; sploc[2] = spkz; diff --git a/src/REPLICA/neb_spin.h b/src/SPIN/neb_spin.h similarity index 100% rename from src/REPLICA/neb_spin.h rename to src/SPIN/neb_spin.h diff --git a/src/min.cpp b/src/min.cpp index c75db6e2b0..2a42a444a0 100644 --- a/src/min.cpp +++ b/src/min.cpp @@ -655,15 +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 if (strcmp(arg[iarg],"alpha_damp") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command"); - alpha_damp = force->numeric(FLERR,arg[iarg+1]); - iarg += 2; - } else if (strcmp(arg[iarg],"discret_factor") == 0) { - if (iarg+2 > narg) error->all(FLERR,"Illegal min_modify command"); - discret_factor = force->numeric(FLERR,arg[iarg+1]); - 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 ba1885671e..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(); @@ -58,11 +59,6 @@ class Min : protected Pointers { double dmax; // max dist to move any atom in one step int linestyle; // 0 = backtrack, 1 = quadratic, 2 = forcezero - // spinmin quantities - - double alpha_damp; // damping for spin minimization - double discret_factor; // factor for spin timestep evaluation - int nelist_global,nelist_atom; // # of PE,virial computes to check int nvlist_global,nvlist_atom; class Compute **elist_global; // lists of PE,virial Computes From d1e751d717752927b33b53fd2f613b8bd02288b7 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 20 Mar 2019 14:32:03 -0600 Subject: [PATCH 0278/1242] Fix thread safety issue in fused forward comm --- src/KOKKOS/atom_vec_kokkos.cpp | 38 +++++++++-------- src/KOKKOS/atom_vec_kokkos.h | 3 +- src/KOKKOS/comm_kokkos.cpp | 74 +++++++++++++++++++++------------- src/KOKKOS/comm_kokkos.h | 3 +- 4 files changed, 72 insertions(+), 46 deletions(-) diff --git a/src/KOKKOS/atom_vec_kokkos.cpp b/src/KOKKOS/atom_vec_kokkos.cpp index 076e3e52fa..9e7de1785b 100644 --- a/src/KOKKOS/atom_vec_kokkos.cpp +++ b/src/KOKKOS/atom_vec_kokkos.cpp @@ -281,6 +281,7 @@ struct AtomVecKokkos_PackCommSelfFused { typename ArrayTypes::t_int_1d_const _pbc_flag; typename ArrayTypes::t_int_1d_const _firstrecv; typename ArrayTypes::t_int_1d_const _sendnum_scan; + typename ArrayTypes::t_int_1d_const _g2l; X_FLOAT _xprd,_yprd,_zprd,_xy,_xz,_yz; AtomVecKokkos_PackCommSelfFused( @@ -290,6 +291,7 @@ struct AtomVecKokkos_PackCommSelfFused { const typename DAT::tdual_int_1d &pbc_flag, const typename DAT::tdual_int_1d &firstrecv, const typename DAT::tdual_int_1d &sendnum_scan, + const typename DAT::tdual_int_1d &g2l, const X_FLOAT &xprd, const X_FLOAT &yprd, const X_FLOAT &zprd, const X_FLOAT &xy, const X_FLOAT &xz, const X_FLOAT &yz): _x(x.view()),_xw(x.view()), @@ -298,6 +300,7 @@ struct AtomVecKokkos_PackCommSelfFused { _pbc_flag(pbc_flag.view()), _firstrecv(firstrecv.view()), _sendnum_scan(sendnum_scan.view()), + _g2l(g2l.view()), _xprd(xprd),_yprd(yprd),_zprd(zprd), _xy(xy),_xz(xz),_yz(yz) {}; @@ -309,43 +312,46 @@ struct AtomVecKokkos_PackCommSelfFused { int i = ii; if (iswap > 0) i = ii - _sendnum_scan[iswap-1]; - const int _nfirst = _firstrecv[iswap]; + const int _nfirst = _firstrecv[iswap]; + const int nlocal = _firstrecv[0]; + int j = _list(iswap,i); + if (j >= nlocal) + j = _g2l(j-nlocal); - const int j = _list(iswap,i); - if (_pbc_flag(iswap) == 0) { + if (_pbc_flag(ii) == 0) { _xw(i+_nfirst,0) = _x(j,0); _xw(i+_nfirst,1) = _x(j,1); _xw(i+_nfirst,2) = _x(j,2); } else { if (TRICLINIC == 0) { - _xw(i+_nfirst,0) = _x(j,0) + _pbc(iswap,0)*_xprd; - _xw(i+_nfirst,1) = _x(j,1) + _pbc(iswap,1)*_yprd; - _xw(i+_nfirst,2) = _x(j,2) + _pbc(iswap,2)*_zprd; + _xw(i+_nfirst,0) = _x(j,0) + _pbc(ii,0)*_xprd; + _xw(i+_nfirst,1) = _x(j,1) + _pbc(ii,1)*_yprd; + _xw(i+_nfirst,2) = _x(j,2) + _pbc(ii,2)*_zprd; } else { - _xw(i+_nfirst,0) = _x(j,0) + _pbc(iswap,0)*_xprd + _pbc(iswap,5)*_xy + _pbc(iswap,4)*_xz; - _xw(i+_nfirst,1) = _x(j,1) + _pbc(iswap,1)*_yprd + _pbc(iswap,3)*_yz; - _xw(i+_nfirst,2) = _x(j,2) + _pbc(iswap,2)*_zprd; + _xw(i+_nfirst,0) = _x(j,0) + _pbc(ii,0)*_xprd + _pbc(ii,5)*_xy + _pbc(ii,4)*_xz; + _xw(i+_nfirst,1) = _x(j,1) + _pbc(ii,1)*_yprd + _pbc(ii,3)*_yz; + _xw(i+_nfirst,2) = _x(j,2) + _pbc(ii,2)*_zprd; } } - } }; /* ---------------------------------------------------------------------- */ int AtomVecKokkos::pack_comm_self_fused(const int &n, const DAT::tdual_int_2d &list, const DAT::tdual_int_1d &sendnum_scan, - const DAT::tdual_int_1d &firstrecv, const DAT::tdual_int_1d &pbc_flag, const DAT::tdual_int_2d &pbc) { + const DAT::tdual_int_1d &firstrecv, const DAT::tdual_int_1d &pbc_flag, const DAT::tdual_int_2d &pbc, + const DAT::tdual_int_1d &g2l) { if(commKK->forward_comm_on_host) { sync(Host,X_MASK); modified(Host,X_MASK); if(domain->triclinic) { - struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, + struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan,g2l, domain->xprd,domain->yprd,domain->zprd, domain->xy,domain->xz,domain->yz); Kokkos::parallel_for(n,f); } else { - struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, + struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan,g2l, domain->xprd,domain->yprd,domain->zprd, domain->xy,domain->xz,domain->yz); Kokkos::parallel_for(n,f); @@ -354,18 +360,18 @@ int AtomVecKokkos::pack_comm_self_fused(const int &n, const DAT::tdual_int_2d &l sync(Device,X_MASK); modified(Device,X_MASK); if(domain->triclinic) { - struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, + struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan,g2l, domain->xprd,domain->yprd,domain->zprd, domain->xy,domain->xz,domain->yz); Kokkos::parallel_for(n,f); } else { - struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan, + struct AtomVecKokkos_PackCommSelfFused f(atomKK->k_x,list,pbc,pbc_flag,firstrecv,sendnum_scan,g2l, domain->xprd,domain->yprd,domain->zprd, domain->xy,domain->xz,domain->yz); Kokkos::parallel_for(n,f); } } - return n*3; + return n*3; } /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/atom_vec_kokkos.h b/src/KOKKOS/atom_vec_kokkos.h index ea83ef1c8f..0474a2380a 100644 --- a/src/KOKKOS/atom_vec_kokkos.h +++ b/src/KOKKOS/atom_vec_kokkos.h @@ -56,7 +56,8 @@ class AtomVecKokkos : public AtomVec { const DAT::tdual_int_1d &sendnum_scan, const DAT::tdual_int_1d &firstrecv, const DAT::tdual_int_1d &pbc_flag, - const DAT::tdual_int_2d &pbc); + const DAT::tdual_int_2d &pbc, + const DAT::tdual_int_1d &g2l); virtual int pack_comm_kokkos(const int &n, const DAT::tdual_int_2d &list, diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index 4396637153..cd6ade1c2f 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -140,31 +140,6 @@ void CommKokkos::init() forward_comm_classic = true; } -/* ---------------------------------------------------------------------- */ - -void CommKokkos::setup() -{ - CommBrick::setup(); - - k_pbc_flag = DAT::tdual_int_1d("comm:pbc_flag",nswap); - k_pbc = DAT::tdual_int_2d("comm:pbc",nswap,6); - - for (int iswap = 0; iswap < nswap; iswap++) { - k_pbc_flag.h_view[iswap] = pbc_flag[iswap]; - k_pbc.h_view(iswap,0) = pbc[iswap][0]; - k_pbc.h_view(iswap,1) = pbc[iswap][1]; - k_pbc.h_view(iswap,2) = pbc[iswap][2]; - k_pbc.h_view(iswap,3) = pbc[iswap][3]; - k_pbc.h_view(iswap,4) = pbc[iswap][4]; - k_pbc.h_view(iswap,5) = pbc[iswap][5]; - } - k_pbc_flag.modify(); - k_pbc.modify(); - - k_pbc_flag.sync(); - k_pbc.sync(); -} - /* ---------------------------------------------------------------------- forward communication of atom coords every timestep other per-atom attributes may also be sent via pack/unpack routines @@ -211,11 +186,12 @@ void CommKokkos::forward_comm_device(int dummy) k_sendlist.sync(); atomKK->sync(ExecutionSpaceFromDevice::space,X_MASK); - if (comm->nprocs == 1) { + if (comm->nprocs == 1 && !ghost_velocity) { k_swap.sync(); + k_swap2.sync(); k_pbc.sync(); n = avec->pack_comm_self_fused(totalsend,k_sendlist,k_sendnum_scan, - k_firstrecv,k_pbc_flag,k_pbc); + k_firstrecv,k_pbc_flag,k_pbc,k_g2l); } else { for (int iswap = 0; iswap < nswap; iswap++) { @@ -783,7 +759,7 @@ void CommKokkos::borders() atomKK->modified(Host,ALL_MASK); } - if (comm->nprocs == 1 && !forward_comm_classic) + if (comm->nprocs == 1 && !ghost_velocity && !forward_comm_classic) copy_swap_info(); } @@ -1092,7 +1068,49 @@ void CommKokkos::copy_swap_info() } totalsend = scan; + int* list = NULL; + memory->create(list,totalsend,"comm:list"); + if (totalsend > k_pbc.extent(0)) { + k_pbc = DAT::tdual_int_2d("comm:pbc",totalsend,6); + k_swap2 = DAT::tdual_int_2d("comm:swap2",2,totalsend); + k_pbc_flag = Kokkos::subview(k_swap2,0,Kokkos::ALL); + k_g2l = Kokkos::subview(k_swap2,1,Kokkos::ALL); + } + + // create map of ghost atoms to local atoms + // store periodic boundary transform from local to ghost + + for (int iswap = 0; iswap < nswap; iswap++) { + for (int i = 0; i < sendnum[iswap]; i++) { + int source = sendlist[iswap][i] - atom->nlocal; + int dest = firstrecv[iswap] + i - atom->nlocal; + k_pbc_flag.h_view(dest) = pbc_flag[iswap]; + k_pbc.h_view(dest,0) = pbc[iswap][0]; + k_pbc.h_view(dest,1) = pbc[iswap][1]; + k_pbc.h_view(dest,2) = pbc[iswap][2]; + k_pbc.h_view(dest,3) = pbc[iswap][3]; + k_pbc.h_view(dest,4) = pbc[iswap][4]; + k_pbc.h_view(dest,5) = pbc[iswap][5]; + k_g2l.h_view(dest) = atom->nlocal + source; + + if (source >= 0) { + k_pbc_flag.h_view(dest) = k_pbc_flag.h_view(dest) || k_pbc_flag.h_view(source); + k_pbc.h_view(dest,0) += k_pbc.h_view(source,0); + k_pbc.h_view(dest,1) += k_pbc.h_view(source,1); + k_pbc.h_view(dest,2) += k_pbc.h_view(source,2); + k_pbc.h_view(dest,3) += k_pbc.h_view(source,3); + k_pbc.h_view(dest,4) += k_pbc.h_view(source,4); + k_pbc.h_view(dest,5) += k_pbc.h_view(source,5); + k_g2l.h_view(dest) = k_g2l.h_view(source); + } + } + } + k_swap.modify(); + k_swap2.modify(); + k_pbc.modify(); + + memory->destroy(list); } /* ---------------------------------------------------------------------- diff --git a/src/KOKKOS/comm_kokkos.h b/src/KOKKOS/comm_kokkos.h index d5428c8b0c..9d8766e309 100644 --- a/src/KOKKOS/comm_kokkos.h +++ b/src/KOKKOS/comm_kokkos.h @@ -33,7 +33,6 @@ class CommKokkos : public CommBrick { CommKokkos(class LAMMPS *); ~CommKokkos(); void init(); - void setup(); void forward_comm(int dummy = 0); // forward comm of atom coords void reverse_comm(); // reverse comm of atom coords @@ -66,8 +65,10 @@ class CommKokkos : public CommBrick { //double *buf_recv; // recv buffer for all comm DAT::tdual_int_2d k_swap; + DAT::tdual_int_2d k_swap2; DAT::tdual_int_2d k_pbc; DAT::tdual_int_1d k_pbc_flag; + DAT::tdual_int_1d k_g2l; DAT::tdual_int_1d k_firstrecv; DAT::tdual_int_1d k_sendnum_scan; int totalsend; From 1f44dc2498366b80c0e0b0f36424728a2c98cf0f Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 20 Mar 2019 15:01:47 -0600 Subject: [PATCH 0279/1242] Remove unused array in comm_kokkos --- src/KOKKOS/comm_kokkos.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index cd6ade1c2f..a89889bd28 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -1068,7 +1068,9 @@ void CommKokkos::copy_swap_info() } totalsend = scan; - int* list = NULL; + // create map of ghost to local atom id + // store periodic boundary transform from local to ghost + memory->create(list,totalsend,"comm:list"); if (totalsend > k_pbc.extent(0)) { k_pbc = DAT::tdual_int_2d("comm:pbc",totalsend,6); @@ -1077,9 +1079,6 @@ void CommKokkos::copy_swap_info() k_g2l = Kokkos::subview(k_swap2,1,Kokkos::ALL); } - // create map of ghost atoms to local atoms - // store periodic boundary transform from local to ghost - for (int iswap = 0; iswap < nswap; iswap++) { for (int i = 0; i < sendnum[iswap]; i++) { int source = sendlist[iswap][i] - atom->nlocal; @@ -1109,8 +1108,6 @@ void CommKokkos::copy_swap_info() k_swap.modify(); k_swap2.modify(); k_pbc.modify(); - - memory->destroy(list); } /* ---------------------------------------------------------------------- From 744a8215dd4c2bd29c6b056a142f88e756213675 Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Wed, 20 Mar 2019 15:08:08 -0600 Subject: [PATCH 0280/1242] Fix compile error in comm_kokkos and indent in atom_vec_kokkos --- src/KOKKOS/atom_vec_kokkos.cpp | 37 +++++++++++++++++----------------- src/KOKKOS/comm_kokkos.cpp | 1 - 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/KOKKOS/atom_vec_kokkos.cpp b/src/KOKKOS/atom_vec_kokkos.cpp index 9e7de1785b..7d5df17544 100644 --- a/src/KOKKOS/atom_vec_kokkos.cpp +++ b/src/KOKKOS/atom_vec_kokkos.cpp @@ -312,28 +312,29 @@ struct AtomVecKokkos_PackCommSelfFused { int i = ii; if (iswap > 0) i = ii - _sendnum_scan[iswap-1]; - const int _nfirst = _firstrecv[iswap]; - const int nlocal = _firstrecv[0]; - int j = _list(iswap,i); - if (j >= nlocal) - j = _g2l(j-nlocal); + const int _nfirst = _firstrecv[iswap]; + const int nlocal = _firstrecv[0]; - if (_pbc_flag(ii) == 0) { - _xw(i+_nfirst,0) = _x(j,0); - _xw(i+_nfirst,1) = _x(j,1); - _xw(i+_nfirst,2) = _x(j,2); + int j = _list(iswap,i); + if (j >= nlocal) + j = _g2l(j-nlocal); + + if (_pbc_flag(ii) == 0) { + _xw(i+_nfirst,0) = _x(j,0); + _xw(i+_nfirst,1) = _x(j,1); + _xw(i+_nfirst,2) = _x(j,2); + } else { + if (TRICLINIC == 0) { + _xw(i+_nfirst,0) = _x(j,0) + _pbc(ii,0)*_xprd; + _xw(i+_nfirst,1) = _x(j,1) + _pbc(ii,1)*_yprd; + _xw(i+_nfirst,2) = _x(j,2) + _pbc(ii,2)*_zprd; } else { - if (TRICLINIC == 0) { - _xw(i+_nfirst,0) = _x(j,0) + _pbc(ii,0)*_xprd; - _xw(i+_nfirst,1) = _x(j,1) + _pbc(ii,1)*_yprd; - _xw(i+_nfirst,2) = _x(j,2) + _pbc(ii,2)*_zprd; - } else { - _xw(i+_nfirst,0) = _x(j,0) + _pbc(ii,0)*_xprd + _pbc(ii,5)*_xy + _pbc(ii,4)*_xz; - _xw(i+_nfirst,1) = _x(j,1) + _pbc(ii,1)*_yprd + _pbc(ii,3)*_yz; - _xw(i+_nfirst,2) = _x(j,2) + _pbc(ii,2)*_zprd; - } + _xw(i+_nfirst,0) = _x(j,0) + _pbc(ii,0)*_xprd + _pbc(ii,5)*_xy + _pbc(ii,4)*_xz; + _xw(i+_nfirst,1) = _x(j,1) + _pbc(ii,1)*_yprd + _pbc(ii,3)*_yz; + _xw(i+_nfirst,2) = _x(j,2) + _pbc(ii,2)*_zprd; } + } } }; diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index a89889bd28..d52011879d 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -1071,7 +1071,6 @@ void CommKokkos::copy_swap_info() // create map of ghost to local atom id // store periodic boundary transform from local to ghost - memory->create(list,totalsend,"comm:list"); if (totalsend > k_pbc.extent(0)) { k_pbc = DAT::tdual_int_2d("comm:pbc",totalsend,6); k_swap2 = DAT::tdual_int_2d("comm:swap2",2,totalsend); From c3adfcbc155859f4313503a0e1acef5c71d84b0b Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 21 Mar 2019 08:56:12 -0600 Subject: [PATCH 0281/1242] Add missing sync in comm_kokkos --- src/KOKKOS/comm_kokkos.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index d52011879d..7432f30b95 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -1071,6 +1071,8 @@ void CommKokkos::copy_swap_info() // create map of ghost to local atom id // store periodic boundary transform from local to ghost + k_sendlist.sync(); + if (totalsend > k_pbc.extent(0)) { k_pbc = DAT::tdual_int_2d("comm:pbc",totalsend,6); k_swap2 = DAT::tdual_int_2d("comm:swap2",2,totalsend); From f2ef02b6d94603b1902774dbddf488a1fd06522b Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Thu, 21 Mar 2019 09:27:18 -0600 Subject: [PATCH 0282/1242] Comm exchange is a no-op for 1 MPI rank --- src/KOKKOS/comm_kokkos.cpp | 259 ++++++++++++++++++------------------- 1 file changed, 129 insertions(+), 130 deletions(-) diff --git a/src/KOKKOS/comm_kokkos.cpp b/src/KOKKOS/comm_kokkos.cpp index 7432f30b95..720a79617f 100644 --- a/src/KOKKOS/comm_kokkos.cpp +++ b/src/KOKKOS/comm_kokkos.cpp @@ -504,9 +504,8 @@ void CommKokkos::exchange() } atomKK->sync(Host,ALL_MASK); - atomKK->modified(Host,ALL_MASK); - CommBrick::exchange(); + atomKK->modified(Host,ALL_MASK); } /* ---------------------------------------------------------------------- */ @@ -573,147 +572,149 @@ void CommKokkos::exchange_device() atom->nghost = 0; atom->avec->clear_bonus(); - // subbox bounds for orthogonal or triclinic + if (comm->nprocs > 1) { // otherwise no-op - if (triclinic == 0) { - sublo = domain->sublo; - subhi = domain->subhi; - } else { - sublo = domain->sublo_lamda; - subhi = domain->subhi_lamda; - } + // subbox bounds for orthogonal or triclinic - atomKK->sync(ExecutionSpaceFromDevice::space,ALL_MASK); + if (triclinic == 0) { + sublo = domain->sublo; + subhi = domain->subhi; + } else { + sublo = domain->sublo_lamda; + subhi = domain->subhi_lamda; + } - // loop over dimensions - for (int dim = 0; dim < 3; dim++) { + atomKK->sync(ExecutionSpaceFromDevice::space,ALL_MASK); - // fill buffer with atoms leaving my box, using < and >= - // when atom is deleted, fill it in with last atom + // loop over dimensions + for (int dim = 0; dim < 3; dim++) { - x = atom->x; - lo = sublo[dim]; - hi = subhi[dim]; - nlocal = atom->nlocal; - i = nsend = 0; + // fill buffer with atoms leaving my box, using < and >= + // when atom is deleted, fill it in with last atom - if (true) { - if (k_sendflag.h_view.extent(0)(); - k_count.h_view() = k_exchange_sendlist.h_view.extent(0); - while (k_count.h_view()>=k_exchange_sendlist.h_view.extent(0)) { - k_count.h_view() = 0; - k_count.modify(); - k_count.sync(); + x = atom->x; + lo = sublo[dim]; + hi = subhi[dim]; + nlocal = atom->nlocal; + i = nsend = 0; - BuildExchangeListFunctor - f(atomKK->k_x,k_exchange_sendlist,k_count,k_sendflag, - nlocal,dim,lo,hi); - Kokkos::parallel_for(nlocal,f); - k_exchange_sendlist.modify(); - k_sendflag.modify(); - k_count.modify(); + if (true) { + if (k_sendflag.h_view.extent(0)(); + k_count.h_view() = k_exchange_sendlist.h_view.extent(0); + while (k_count.h_view()>=k_exchange_sendlist.h_view.extent(0)) { + k_count.h_view() = 0; + k_count.modify(); + k_count.sync(); - k_count.sync(); - if (k_count.h_view()>=k_exchange_sendlist.h_view.extent(0)) { - k_exchange_sendlist.resize(k_count.h_view()*1.1); - k_exchange_copylist.resize(k_count.h_view()*1.1); - k_count.h_view()=k_exchange_sendlist.h_view.extent(0); + BuildExchangeListFunctor + f(atomKK->k_x,k_exchange_sendlist,k_count,k_sendflag, + nlocal,dim,lo,hi); + Kokkos::parallel_for(nlocal,f); + k_exchange_sendlist.modify(); + k_sendflag.modify(); + k_count.modify(); + + k_count.sync(); + if (k_count.h_view()>=k_exchange_sendlist.h_view.extent(0)) { + k_exchange_sendlist.resize(k_count.h_view()*1.1); + k_exchange_copylist.resize(k_count.h_view()*1.1); + k_count.h_view()=k_exchange_sendlist.h_view.extent(0); + } + } + + k_exchange_lists.sync(); + k_sendflag.sync(); + + int sendpos = nlocal-1; + nlocal -= k_count.h_view(); + for(int i = 0; i < k_count.h_view(); i++) { + if (k_exchange_sendlist.h_view(i)(); + k_exchange_copylist_short.template sync(); + nsend = k_count.h_view(); + if (nsend > maxsend) grow_send_kokkos(nsend,1); + nsend = + avec->pack_exchange_kokkos(k_count.h_view(),k_buf_send, + k_exchange_sendlist,k_exchange_copylist, + ExecutionSpaceFromDevice::space, + dim,lo,hi); + DeviceType::fence(); + } else { + while (i < nlocal) { + if (x[i][dim] < lo || x[i][dim] >= hi) { + if (nsend > maxsend) grow_send_kokkos(nsend,1); + nsend += avec->pack_exchange(i,&buf_send[nsend]); + avec->copy(nlocal-1,i,1); + nlocal--; + } else i++; + } + } + atom->nlocal = nlocal; + + // send/recv atoms in both directions + // if 1 proc in dimension, no send/recv, set recv buf to send buf + // if 2 procs in dimension, single send/recv + // if more than 2 procs in dimension, send/recv to both neighbors + + if (procgrid[dim] == 1) { + nrecv = nsend; + if (nrecv) { + atom->nlocal=avec-> + unpack_exchange_kokkos(k_buf_send,nrecv,atom->nlocal,dim,lo,hi, + ExecutionSpaceFromDevice::space); + DeviceType::fence(); + } + } else { + MPI_Sendrecv(&nsend,1,MPI_INT,procneigh[dim][0],0, + &nrecv1,1,MPI_INT,procneigh[dim][1],0,world,MPI_STATUS_IGNORE); + nrecv = nrecv1; + if (procgrid[dim] > 2) { + MPI_Sendrecv(&nsend,1,MPI_INT,procneigh[dim][1],0, + &nrecv2,1,MPI_INT,procneigh[dim][0],0,world,MPI_STATUS_IGNORE); + nrecv += nrecv2; + } + if (nrecv > maxrecv) grow_recv_kokkos(nrecv); + + MPI_Irecv(k_buf_recv.view().data(),nrecv1, + MPI_DOUBLE,procneigh[dim][1],0, + world,&request); + MPI_Send(k_buf_send.view().data(),nsend, + MPI_DOUBLE,procneigh[dim][0],0,world); + MPI_Wait(&request,MPI_STATUS_IGNORE); + + if (procgrid[dim] > 2) { + MPI_Irecv(k_buf_recv.view().data()+nrecv1, + nrecv2,MPI_DOUBLE,procneigh[dim][0],0, + world,&request); + MPI_Send(k_buf_send.view().data(),nsend, + MPI_DOUBLE,procneigh[dim][1],0,world); + MPI_Wait(&request,MPI_STATUS_IGNORE); + } + + if (nrecv) { + atom->nlocal = avec-> + unpack_exchange_kokkos(k_buf_recv,nrecv,atom->nlocal,dim,lo,hi, + ExecutionSpaceFromDevice::space); + DeviceType::fence(); } } - k_exchange_lists.sync(); - k_sendflag.sync(); + // check incoming atoms to see if they are in my box + // if so, add to my list - int sendpos = nlocal-1; - nlocal -= k_count.h_view(); - for(int i = 0; i < k_count.h_view(); i++) { - if (k_exchange_sendlist.h_view(i)(); - k_exchange_copylist_short.template sync(); - nsend = k_count.h_view(); - if (nsend > maxsend) grow_send_kokkos(nsend,1); - nsend = - avec->pack_exchange_kokkos(k_count.h_view(),k_buf_send, - k_exchange_sendlist,k_exchange_copylist, - ExecutionSpaceFromDevice::space, - dim,lo,hi); - DeviceType::fence(); - } else { - while (i < nlocal) { - if (x[i][dim] < lo || x[i][dim] >= hi) { - if (nsend > maxsend) grow_send_kokkos(nsend,1); - nsend += avec->pack_exchange(i,&buf_send[nsend]); - avec->copy(nlocal-1,i,1); - nlocal--; - } else i++; - } } - atom->nlocal = nlocal; - - // send/recv atoms in both directions - // if 1 proc in dimension, no send/recv, set recv buf to send buf - // if 2 procs in dimension, single send/recv - // if more than 2 procs in dimension, send/recv to both neighbors - - if (procgrid[dim] == 1) { - nrecv = nsend; - if (nrecv) { - atom->nlocal=avec-> - unpack_exchange_kokkos(k_buf_send,nrecv,atom->nlocal,dim,lo,hi, - ExecutionSpaceFromDevice::space); - DeviceType::fence(); - } - } else { - MPI_Sendrecv(&nsend,1,MPI_INT,procneigh[dim][0],0, - &nrecv1,1,MPI_INT,procneigh[dim][1],0,world,MPI_STATUS_IGNORE); - nrecv = nrecv1; - if (procgrid[dim] > 2) { - MPI_Sendrecv(&nsend,1,MPI_INT,procneigh[dim][1],0, - &nrecv2,1,MPI_INT,procneigh[dim][0],0,world,MPI_STATUS_IGNORE); - nrecv += nrecv2; - } - if (nrecv > maxrecv) grow_recv_kokkos(nrecv); - - MPI_Irecv(k_buf_recv.view().data(),nrecv1, - MPI_DOUBLE,procneigh[dim][1],0, - world,&request); - MPI_Send(k_buf_send.view().data(),nsend, - MPI_DOUBLE,procneigh[dim][0],0,world); - MPI_Wait(&request,MPI_STATUS_IGNORE); - - if (procgrid[dim] > 2) { - MPI_Irecv(k_buf_recv.view().data()+nrecv1, - nrecv2,MPI_DOUBLE,procneigh[dim][0],0, - world,&request); - MPI_Send(k_buf_send.view().data(),nsend, - MPI_DOUBLE,procneigh[dim][1],0,world); - MPI_Wait(&request,MPI_STATUS_IGNORE); - } - - if (nrecv) { - atom->nlocal = avec-> - unpack_exchange_kokkos(k_buf_recv,nrecv,atom->nlocal,dim,lo,hi, - ExecutionSpaceFromDevice::space); - DeviceType::fence(); - } - } - - // check incoming atoms to see if they are in my box - // if so, add to my list - + atomKK->modified(ExecutionSpaceFromDevice::space,ALL_MASK); } - atomKK->modified(ExecutionSpaceFromDevice::space,ALL_MASK); - if (atom->firstgroupname) { /* this is not yet implemented with Kokkos */ atomKK->sync(Host,ALL_MASK); @@ -753,7 +754,6 @@ void CommKokkos::borders() else borders_device(); } else { atomKK->sync(Host,ALL_MASK); - k_sendlist.sync(); CommBrick::borders(); k_sendlist.modify(); atomKK->modified(Host,ALL_MASK); @@ -828,7 +828,6 @@ void CommKokkos::borders_device() { AtomVecKokkos *avec = (AtomVecKokkos *) atom->avec; ExecutionSpace exec_space = ExecutionSpaceFromDevice::space; - k_sendlist.sync(); atomKK->sync(exec_space,ALL_MASK); // do swaps over all 3 dimensions From 1e8ccb17742f8cf72f06ca4780598a2e81999ff2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 04:54:06 -0400 Subject: [PATCH 0283/1242] 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 0284/1242] 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 0285/1242] 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 0286/1242] 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 0287/1242] 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 0288/1242] 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 0289/1242] 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 0290/1242] 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 0291/1242] 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 0292/1242] 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 c23ace9c972a47f3cd733f093662d14ac46fbe20 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 22 Mar 2019 11:52:09 -0600 Subject: [PATCH 0293/1242] Commit JT 032219 - fixed bug 1: precession_spin had no min_setup - fixed bug 2: incorrect init of spins in neb/spin - improved doc min_spin.txt (added eqs, and connected to related files). --- 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/fix_precession_spin.txt | 2 +- doc/src/lammps.book | 1 + doc/src/min_modify.txt | 11 +++++- doc/src/min_spin.txt | 63 ++++++++++++++++++++++++++++++ doc/src/min_style.txt | 10 ++--- doc/src/minimize.txt | 7 ++++ src/SPIN/atom_vec_spin.cpp | 4 ++ src/SPIN/fix_precession_spin.cpp | 9 ++++- src/SPIN/fix_precession_spin.h | 1 + src/SPIN/min_spin.cpp | 6 ++- src/SPIN/neb_spin.cpp | 63 ++++++++++++++++++------------ src/SPIN/pair_spin_dmi.cpp | 6 +-- 16 files changed, 168 insertions(+), 42 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 create mode 100644 doc/src/min_spin.txt 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/fix_precession_spin.txt b/doc/src/fix_precession_spin.txt index f16522c7b6..05814931ea 100644 --- a/doc/src/fix_precession_spin.txt +++ b/doc/src/fix_precession_spin.txt @@ -31,7 +31,7 @@ fix 1 all precession/spin zeeman 0.1 0.0 0.0 1.0 anisotropy 0.001 0.0 0.0 1.0 :p [Description:] -Impose a force torque to each magnetic spin in the group. +This fix applies a precession torque to each magnetic spin in the group. Style {zeeman} is used for the simulation of the interaction between the magnetic spins in the defined group and an external diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 198e234f0c..88625e0b73 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -174,6 +174,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 701f579af4..525d6716d8 100644 --- a/doc/src/min_modify.txt +++ b/doc/src/min_modify.txt @@ -21,7 +21,7 @@ keyword = {dmax} or {line} or {alpha_damp} or {discret_factor} {alpha_damp} value = damping damping = fictitious Gilbert damping for spin minimization (adim) {discret_factor} value = factor - factor = defines a dividing factor for adaptive spin timestep (adim) :pre + factor = discretization factor for adaptive spin timestep (adim) :pre :ule [Examples:] @@ -70,7 +70,14 @@ 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 {spinmin} minimization style is declared. +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 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 f8c05d5483..c46c1492b4 100644 --- a/doc/src/min_style.txt +++ b/doc/src/min_style.txt @@ -16,7 +16,7 @@ style = {cg} or {hftn} or {sd} or {quickmin} or {fire} or {spin} :ul [Examples:] min_style cg -min_style spinmin +min_style spin min_style fire :pre [Description:] @@ -62,17 +62,13 @@ 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 a variable -timestep as described in "(Tranchida)"_#Tranchida. +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. -The {spin} style is useful in the context of geodesic nudged -elastic band (GNEB) calculations via the "neb/spin"_neb_spin.html -command. - NOTE: The damped dynamic minimizers use whatever timestep you have defined via the "timestep"_timestep.html command. Often they will converge more quickly if you use a timestep about 10x larger than you 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/src/SPIN/atom_vec_spin.cpp b/src/SPIN/atom_vec_spin.cpp index 24c4480e04..a6c0430940 100644 --- a/src/SPIN/atom_vec_spin.cpp +++ b/src/SPIN/atom_vec_spin.cpp @@ -943,6 +943,10 @@ bigint AtomVecSpin::memory_usage() return bytes; } +/* ---------------------------------------------------------------------- + clear all forces (mech and mag) +------------------------------------------------------------------------- */ + void AtomVecSpin::force_clear(int /*n*/, size_t nbytes) { memset(&atom->f[0][0],0,3*nbytes); 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 index ac8f22186e..99aa4ac3b7 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -102,7 +102,7 @@ void MinSpin::reset_vectors() { // atomic dof - // not really good size => sp is 4N vector + // size sp is 4N vector nvec = 4 * atom->nlocal; if (nvec) spvec = atom->sp[0]; @@ -132,7 +132,9 @@ int MinSpin::iterate(int maxiter) 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 diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index f5d9a75020..728532a187 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -44,7 +44,6 @@ #include "timer.h" #include "memory.h" #include "error.h" -#include "force.h" #include "math_const.h" using namespace LAMMPS_NS; @@ -101,14 +100,22 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, spfinal[1] = buf_final[ii+1]; spfinal[2] = buf_final[ii+2]; - // circular initialization - // a better procedure may be developed - - initial_rotation(spinit,spfinal,fraction); - - sp[i][0] = spfinal[0]; - sp[i][1] = spfinal[1]; - sp[i][2] = spfinal[2]; + // interpolate intermediate spin states + + if (fraction == 0.0) { + sp[i][0] = spinit[0]; + sp[i][1] = spinit[1]; + sp[i][2] = spinit[2]; + } else if (fraction == 1.0) { + sp[i][0] = spfinal[0]; + sp[i][1] = spfinal[1]; + sp[i][2] = spfinal[2]; + } else { + initial_rotation(spinit,spfinal,fraction); + sp[i][0] = spfinal[0]; + sp[i][1] = spfinal[1]; + sp[i][2] = spfinal[2]; + } ii += 3; } @@ -499,7 +506,7 @@ void NEB_spin::readfile(char *file, int flag) for (j = 1; j < nwords; j++) values[j] = strtok(NULL," \t\n\r\f"); - // adjust atom coord based on replica fraction + // adjust spin coord based on replica fraction // for flag = 0, interpolate for intermediate and final replicas // for flag = 1, replace existing coord with new coord // ignore image flags of final x @@ -530,19 +537,24 @@ void NEB_spin::readfile(char *file, int flag) spfinal[0] = spx; spfinal[1] = spy; spfinal[2] = spz; - - printf("test spinit[0]:%g \n",sp[m][0]); - + // interpolate intermediate spin states - initial_rotation(spinit,spfinal,fraction); - - printf("test spfinal[0]:%g \n",spfinal[0]); - - sp[m][0] = spfinal[0]; - sp[m][1] = spfinal[1]; - sp[m][2] = spfinal[2]; sp[m][3] = musp; + if (fraction == 0.0) { + sp[m][0] = spinit[0]; + sp[m][1] = spinit[1]; + sp[m][2] = spinit[2]; + } else if (fraction == 1.0) { + sp[m][0] = spfinal[0]; + sp[m][1] = spfinal[1]; + sp[m][2] = spfinal[2]; + } else { + initial_rotation(spinit,spfinal,fraction); + sp[m][0] = spfinal[0]; + sp[m][1] = spfinal[1]; + sp[m][2] = spfinal[2]; + } } else { sp[m][3] = musp; x[m][0] = xx; @@ -560,8 +572,6 @@ void NEB_spin::readfile(char *file, int flag) nread += nchunk; } - printf("test sp[1][2]:%g \n",sp[1][2]); - // check that all atom IDs in file were found by a proc if (flag == 0) { @@ -605,6 +615,10 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) // implementing initial rotation using atan2 // this may not be a sufficient routine, need more accurate verifications + // interpolation only for intermediate replica + + if (fraction == 0.0 || fraction == 1.0) return; + // initial, final and inter ang. values double itheta,iphi,ftheta,fphi,ktheta,kphi; @@ -636,7 +650,7 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) spky = sin(ktheta)*sin(kphi); spkz = cos(kphi); - double knormsq = spkx*spkx+spky*spky+spkz*spkz; + double knormsq = spkx*spkx + spky*spky + spkz*spkz; if (knormsq != 0.0) iknorm = 1.0/sqrt(knormsq); @@ -696,9 +710,6 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) //spky *= iknorm; //spkz *= iknorm; - printf("init: %g %g %g \n",spix,spiy,spiz); - printf("fina: %g %g %g \n",spkx,spky,spkz); - sploc[0] = spkx; sploc[1] = spky; sploc[2] = spkz; diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 9b193f7e08..e54864e126 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -432,9 +432,9 @@ void PairSpinDmi::compute_dmi(int i, int j, double eij[3], double fmi[3], double dmiy = eij[2]*v_dmx[itype][jtype] - eij[0]*v_dmz[itype][jtype]; dmiz = eij[0]*v_dmy[itype][jtype] - eij[1]*v_dmx[itype][jtype]; - fmi[0] -= (spj[1]*dmiz - spj[2]*dmiy); - fmi[1] -= (spj[2]*dmix - spj[0]*dmiz); - fmi[2] -= (spj[0]*dmiy - spj[1]*dmix); + fmi[0] -= (dmiy*spj[2] - dmiz*spj[1]); + fmi[1] -= (dmiz*spj[0] - dmix*spj[2]); + fmi[2] -= (dmix*spj[1] - dmiy*spj[0]); } /* ---------------------------------------------------------------------- From 52f9e4a960ef477a54750f7b36740693c5018e75 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 22 Mar 2019 14:11:02 -0400 Subject: [PATCH 0294/1242] 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 0295/1242] 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 0296/1242] 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 0297/1242] 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 0298/1242] 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 111ff4475e86419e21698fe7f950c2e589ba3ebe Mon Sep 17 00:00:00 2001 From: mkanski Date: Mon, 25 Mar 2019 14:18:55 +0100 Subject: [PATCH 0299/1242] Pointer moved to reax lists --- src/USER-REAXC/pair_reaxc.cpp | 21 +- src/USER-REAXC/reaxc_allocate.cpp | 316 +++++++++++++++--------------- src/USER-REAXC/reaxc_allocate.h | 10 +- src/USER-REAXC/reaxc_ffield.cpp | 34 ++-- src/USER-REAXC/reaxc_init_md.cpp | 11 +- src/USER-REAXC/reaxc_list.cpp | 62 +++--- src/USER-REAXC/reaxc_list.h | 4 +- src/USER-REAXC/reaxc_lookup.cpp | 84 ++++---- src/USER-REAXC/reaxc_tool_box.cpp | 18 +- src/USER-REAXC/reaxc_tool_box.h | 6 +- src/USER-REAXC/reaxc_types.h | 4 + 11 files changed, 290 insertions(+), 280 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 24612a3a40..58142b122a 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -108,6 +108,8 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) system->bndry_cuts.ghost_cutoff = 0; system->my_atoms = NULL; system->pair_ptr = this; + system->error_ptr = this->lmp->error; + control->error_ptr = this->lmp->error; system->omp_active = 0; @@ -139,13 +141,13 @@ PairReaxC::~PairReaxC() if (control->tabulate ) Deallocate_Lookup_Tables( lmp, system); - if (control->hbond_cut > 0 ) Delete_List( lmp, lists+HBONDS, world); - Delete_List( lmp, lists+BONDS, world ); - Delete_List( lmp, lists+THREE_BODIES, world ); - Delete_List( lmp, lists+FAR_NBRS, world ); + if (control->hbond_cut > 0 ) Delete_List( lists+HBONDS, world); + Delete_List( lists+BONDS, world ); + Delete_List( lists+THREE_BODIES, world ); + Delete_List( lists+FAR_NBRS, world ); - DeAllocate_Workspace( lmp, control, workspace ); - DeAllocate_System( lmp, system ); + DeAllocate_Workspace( control, workspace ); + DeAllocate_System( system ); } memory->destroy( system ); @@ -437,13 +439,14 @@ void PairReaxC::setup( ) // initialize my data structures - PreAllocate_Space( lmp, system, control, workspace, world ); + PreAllocate_Space( system, control, workspace, world ); write_reax_atoms(); int num_nbrs = estimate_reax_lists(); - if(!Make_List(lmp, system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, + if(!Make_List(system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, lists+FAR_NBRS, world)) error->one(FLERR,"Pair reax/c problem in far neighbor list"); + (lists+FAR_NBRS)->error_ptr=lmp->error; write_reax_lists(); Initialize( lmp, system, control, data, workspace, &lists, out_control, @@ -466,7 +469,7 @@ void PairReaxC::setup( ) // check if I need to shrink/extend my data-structs - ReAllocate( lmp, system, control, data, workspace, &lists, mpi_data ); + ReAllocate( system, control, data, workspace, &lists, mpi_data ); } bigint local_ngroup = list->inum; diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 2f970399f2..8784c854b5 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -43,7 +43,7 @@ using namespace LAMMPS_NS; important: we cannot know the exact number of atoms that will fall into a process's box throughout the whole simulation. therefore we need to make upper bound estimates for various data structures */ -int PreAllocate_Space( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params * /*control*/, +int PreAllocate_Space( reax_system *system, control_params * /*control*/, storage * workspace, MPI_Comm comm ) { int mincap = system->mincap; @@ -55,7 +55,7 @@ int PreAllocate_Space( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_para system->total_cap = MAX( (int)(system->N * safezone), mincap ); system->my_atoms = (reax_atom*) - scalloc(lmp, system->total_cap, sizeof(reax_atom), "my_atoms", comm ); + scalloc(system->error_ptr, system->total_cap, sizeof(reax_atom), "my_atoms", comm ); // Nullify some arrays only used in omp styles // Should be safe to do here since called in pair->setup(); @@ -84,45 +84,45 @@ int Allocate_System( reax_system *system, int /*local_cap*/, int total_cap, } -void DeAllocate_System( LAMMPS_NS::LAMMPS *lmp, reax_system *system ) +void DeAllocate_System( reax_system *system ) { int i, j, k; int ntypes; reax_interaction *ff_params; - // dealloocate the atom list - sfree(lmp, system->my_atoms, "system->my_atoms" ); + // deallocate the atom list + sfree(system->error_ptr, system->my_atoms, "system->my_atoms" ); // deallocate the ffield parameters storage ff_params = &(system->reax_param); ntypes = ff_params->num_atom_types; - sfree(lmp, ff_params->gp.l, "ff:globals" ); + sfree(system->error_ptr, ff_params->gp.l, "ff:globals" ); for( i = 0; i < ntypes; ++i ) { for( j = 0; j < ntypes; ++j ) { for( k = 0; k < ntypes; ++k ) { - sfree(lmp, ff_params->fbp[i][j][k], "ff:fbp[i,j,k]" ); + sfree(system->error_ptr, ff_params->fbp[i][j][k], "ff:fbp[i,j,k]" ); } - sfree(lmp, ff_params->fbp[i][j], "ff:fbp[i,j]" ); - sfree(lmp, ff_params->thbp[i][j], "ff:thbp[i,j]" ); - sfree(lmp, ff_params->hbp[i][j], "ff:hbp[i,j]" ); + sfree(system->error_ptr, ff_params->fbp[i][j], "ff:fbp[i,j]" ); + sfree(system->error_ptr, ff_params->thbp[i][j], "ff:thbp[i,j]" ); + sfree(system->error_ptr, ff_params->hbp[i][j], "ff:hbp[i,j]" ); } - sfree(lmp, ff_params->fbp[i], "ff:fbp[i]" ); - sfree(lmp, ff_params->thbp[i], "ff:thbp[i]" ); - sfree(lmp, ff_params->hbp[i], "ff:hbp[i]" ); - sfree(lmp, ff_params->tbp[i], "ff:tbp[i]" ); + sfree(system->error_ptr, ff_params->fbp[i], "ff:fbp[i]" ); + sfree(system->error_ptr, ff_params->thbp[i], "ff:thbp[i]" ); + sfree(system->error_ptr, ff_params->hbp[i], "ff:hbp[i]" ); + sfree(system->error_ptr, ff_params->tbp[i], "ff:tbp[i]" ); } - sfree(lmp, ff_params->fbp, "ff:fbp" ); - sfree(lmp, ff_params->thbp, "ff:thbp" ); - sfree(lmp, ff_params->hbp, "ff:hbp" ); - sfree(lmp, ff_params->tbp, "ff:tbp" ); - sfree(lmp, ff_params->sbp, "ff:sbp" ); + sfree(system->error_ptr, ff_params->fbp, "ff:fbp" ); + sfree(system->error_ptr, ff_params->thbp, "ff:thbp" ); + sfree(system->error_ptr, ff_params->hbp, "ff:hbp" ); + sfree(system->error_ptr, ff_params->tbp, "ff:tbp" ); + sfree(system->error_ptr, ff_params->sbp, "ff:sbp" ); } /************* workspace *************/ -void DeAllocate_Workspace( LAMMPS_NS::LAMMPS* lmp, control_params * /*control*/, storage *workspace ) +void DeAllocate_Workspace( control_params * control, storage *workspace ) { int i; @@ -133,84 +133,84 @@ void DeAllocate_Workspace( LAMMPS_NS::LAMMPS* lmp, control_params * /*control*/, /* communication storage */ for( i = 0; i < MAX_NBRS; ++i ) { - sfree(lmp, workspace->tmp_dbl[i], "tmp_dbl[i]" ); - sfree(lmp, workspace->tmp_rvec[i], "tmp_rvec[i]" ); - sfree(lmp, workspace->tmp_rvec2[i], "tmp_rvec2[i]" ); + sfree(control->error_ptr, workspace->tmp_dbl[i], "tmp_dbl[i]" ); + sfree(control->error_ptr, workspace->tmp_rvec[i], "tmp_rvec[i]" ); + sfree(control->error_ptr, workspace->tmp_rvec2[i], "tmp_rvec2[i]" ); } /* bond order storage */ - sfree(lmp, workspace->within_bond_box, "skin" ); - sfree(lmp, workspace->total_bond_order, "total_bo" ); - sfree(lmp, workspace->Deltap, "Deltap" ); - sfree(lmp, workspace->Deltap_boc, "Deltap_boc" ); - sfree(lmp, workspace->dDeltap_self, "dDeltap_self" ); - sfree(lmp, workspace->Delta, "Delta" ); - sfree(lmp, workspace->Delta_lp, "Delta_lp" ); - sfree(lmp, workspace->Delta_lp_temp, "Delta_lp_temp" ); - sfree(lmp, workspace->dDelta_lp, "dDelta_lp" ); - sfree(lmp, workspace->dDelta_lp_temp, "dDelta_lp_temp" ); - sfree(lmp, workspace->Delta_e, "Delta_e" ); - sfree(lmp, workspace->Delta_boc, "Delta_boc" ); - sfree(lmp, workspace->Delta_val, "Delta_val" ); - sfree(lmp, workspace->nlp, "nlp" ); - sfree(lmp, workspace->nlp_temp, "nlp_temp" ); - sfree(lmp, workspace->Clp, "Clp" ); - sfree(lmp, workspace->vlpex, "vlpex" ); - sfree(lmp, workspace->bond_mark, "bond_mark" ); - sfree(lmp, workspace->done_after, "done_after" ); + sfree(control->error_ptr, workspace->within_bond_box, "skin" ); + sfree(control->error_ptr, workspace->total_bond_order, "total_bo" ); + sfree(control->error_ptr, workspace->Deltap, "Deltap" ); + sfree(control->error_ptr, workspace->Deltap_boc, "Deltap_boc" ); + sfree(control->error_ptr, workspace->dDeltap_self, "dDeltap_self" ); + sfree(control->error_ptr, workspace->Delta, "Delta" ); + sfree(control->error_ptr, workspace->Delta_lp, "Delta_lp" ); + sfree(control->error_ptr, workspace->Delta_lp_temp, "Delta_lp_temp" ); + sfree(control->error_ptr, workspace->dDelta_lp, "dDelta_lp" ); + sfree(control->error_ptr, workspace->dDelta_lp_temp, "dDelta_lp_temp" ); + sfree(control->error_ptr, workspace->Delta_e, "Delta_e" ); + sfree(control->error_ptr, workspace->Delta_boc, "Delta_boc" ); + sfree(control->error_ptr, workspace->Delta_val, "Delta_val" ); + sfree(control->error_ptr, workspace->nlp, "nlp" ); + sfree(control->error_ptr, workspace->nlp_temp, "nlp_temp" ); + sfree(control->error_ptr, workspace->Clp, "Clp" ); + sfree(control->error_ptr, workspace->vlpex, "vlpex" ); + sfree(control->error_ptr, workspace->bond_mark, "bond_mark" ); + sfree(control->error_ptr, workspace->done_after, "done_after" ); /* QEq storage */ - sfree(lmp, workspace->Hdia_inv, "Hdia_inv" ); - sfree(lmp, workspace->b_s, "b_s" ); - sfree(lmp, workspace->b_t, "b_t" ); - sfree(lmp, workspace->b_prc, "b_prc" ); - sfree(lmp, workspace->b_prm, "b_prm" ); - sfree(lmp, workspace->s, "s" ); - sfree(lmp, workspace->t, "t" ); - sfree(lmp, workspace->droptol, "droptol" ); - sfree(lmp, workspace->b, "b" ); - sfree(lmp, workspace->x, "x" ); + sfree(control->error_ptr, workspace->Hdia_inv, "Hdia_inv" ); + sfree(control->error_ptr, workspace->b_s, "b_s" ); + sfree(control->error_ptr, workspace->b_t, "b_t" ); + sfree(control->error_ptr, workspace->b_prc, "b_prc" ); + sfree(control->error_ptr, workspace->b_prm, "b_prm" ); + sfree(control->error_ptr, workspace->s, "s" ); + sfree(control->error_ptr, workspace->t, "t" ); + sfree(control->error_ptr, workspace->droptol, "droptol" ); + sfree(control->error_ptr, workspace->b, "b" ); + sfree(control->error_ptr, workspace->x, "x" ); /* GMRES storage */ for( i = 0; i < RESTART+1; ++i ) { - sfree(lmp, workspace->h[i], "h[i]" ); - sfree(lmp, workspace->v[i], "v[i]" ); + sfree(control->error_ptr, workspace->h[i], "h[i]" ); + sfree(control->error_ptr, workspace->v[i], "v[i]" ); } - sfree(lmp, workspace->h, "h" ); - sfree(lmp, workspace->v, "v" ); - sfree(lmp, workspace->y, "y" ); - sfree(lmp, workspace->z, "z" ); - sfree(lmp, workspace->g, "g" ); - sfree(lmp, workspace->hs, "hs" ); - sfree(lmp, workspace->hc, "hc" ); + sfree(control->error_ptr, workspace->h, "h" ); + sfree(control->error_ptr, workspace->v, "v" ); + sfree(control->error_ptr, workspace->y, "y" ); + sfree(control->error_ptr, workspace->z, "z" ); + sfree(control->error_ptr, workspace->g, "g" ); + sfree(control->error_ptr, workspace->hs, "hs" ); + sfree(control->error_ptr, workspace->hc, "hc" ); /* CG storage */ - sfree(lmp, workspace->r, "r" ); - sfree(lmp, workspace->d, "d" ); - sfree(lmp, workspace->q, "q" ); - sfree(lmp, workspace->p, "p" ); - sfree(lmp, workspace->r2, "r2" ); - sfree(lmp, workspace->d2, "d2" ); - sfree(lmp, workspace->q2, "q2" ); - sfree(lmp, workspace->p2, "p2" ); + sfree(control->error_ptr, workspace->r, "r" ); + sfree(control->error_ptr, workspace->d, "d" ); + sfree(control->error_ptr, workspace->q, "q" ); + sfree(control->error_ptr, workspace->p, "p" ); + sfree(control->error_ptr, workspace->r2, "r2" ); + sfree(control->error_ptr, workspace->d2, "d2" ); + sfree(control->error_ptr, workspace->q2, "q2" ); + sfree(control->error_ptr, workspace->p2, "p2" ); /* integrator storage */ - sfree(lmp, workspace->v_const, "v_const" ); + sfree(control->error_ptr, workspace->v_const, "v_const" ); /* force related storage */ - sfree(lmp, workspace->f, "f" ); - sfree(lmp, workspace->CdDelta, "CdDelta" ); + sfree(control->error_ptr, workspace->f, "f" ); + sfree(control->error_ptr, workspace->CdDelta, "CdDelta" ); /* reductions */ #ifdef LMP_USER_OMP - if (workspace->CdDeltaReduction) sfree(lmp, workspace->CdDeltaReduction, "cddelta_reduce" ); - if (workspace->forceReduction) sfree(lmp, workspace->forceReduction, "f_reduce" ); - if (workspace->valence_angle_atom_myoffset) sfree(lmp, workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); - if (workspace->my_ext_pressReduction) sfree(lmp, workspace->my_ext_pressReduction, "ext_press_reduce"); + if (workspace->CdDeltaReduction) sfree(control->error_ptr, workspace->CdDeltaReduction, "cddelta_reduce" ); + if (workspace->forceReduction) sfree(control->error_ptr, workspace->forceReduction, "f_reduce" ); + if (workspace->valence_angle_atom_myoffset) sfree(control->error_ptr, workspace->valence_angle_atom_myoffset, "valence_angle_atom_myoffset"); + if (workspace->my_ext_pressReduction) sfree(control->error_ptr, workspace->my_ext_pressReduction, "ext_press_reduce"); #endif } -int Allocate_Workspace( LAMMPS_NS::LAMMPS* lmp, reax_system * /*system*/, control_params * control, +int Allocate_Workspace( reax_system * /*system*/, control_params * control, storage *workspace, int local_cap, int total_cap, MPI_Comm comm, char * /*msg*/ ) { @@ -224,94 +224,94 @@ int Allocate_Workspace( LAMMPS_NS::LAMMPS* lmp, reax_system * /*system*/, contro /* communication storage */ for( i = 0; i < MAX_NBRS; ++i ) { workspace->tmp_dbl[i] = (double*) - scalloc(lmp, total_cap, sizeof(double), "tmp_dbl", comm ); + scalloc(control->error_ptr, total_cap, sizeof(double), "tmp_dbl", comm ); workspace->tmp_rvec[i] = (rvec*) - scalloc(lmp, total_cap, sizeof(rvec), "tmp_rvec", comm ); + scalloc(control->error_ptr, total_cap, sizeof(rvec), "tmp_rvec", comm ); workspace->tmp_rvec2[i] = (rvec2*) - scalloc(lmp, total_cap, sizeof(rvec2), "tmp_rvec2", comm ); + scalloc(control->error_ptr, total_cap, sizeof(rvec2), "tmp_rvec2", comm ); } /* bond order related storage */ workspace->within_bond_box = (int*) - scalloc(lmp, total_cap, sizeof(int), "skin", comm ); - workspace->total_bond_order = (double*) smalloc(lmp, total_real, "total_bo", comm ); - workspace->Deltap = (double*) smalloc(lmp, total_real, "Deltap", comm ); - workspace->Deltap_boc = (double*) smalloc(lmp, total_real, "Deltap_boc", comm ); - workspace->dDeltap_self = (rvec*) smalloc(lmp, total_rvec, "dDeltap_self", comm ); - workspace->Delta = (double*) smalloc(lmp, total_real, "Delta", comm ); - workspace->Delta_lp = (double*) smalloc(lmp, total_real, "Delta_lp", comm ); + scalloc(control->error_ptr, total_cap, sizeof(int), "skin", comm ); + workspace->total_bond_order = (double*) smalloc(control->error_ptr, total_real, "total_bo", comm ); + workspace->Deltap = (double*) smalloc(control->error_ptr, total_real, "Deltap", comm ); + workspace->Deltap_boc = (double*) smalloc(control->error_ptr, total_real, "Deltap_boc", comm ); + workspace->dDeltap_self = (rvec*) smalloc(control->error_ptr, total_rvec, "dDeltap_self", comm ); + workspace->Delta = (double*) smalloc(control->error_ptr, total_real, "Delta", comm ); + workspace->Delta_lp = (double*) smalloc(control->error_ptr, total_real, "Delta_lp", comm ); workspace->Delta_lp_temp = (double*) - smalloc(lmp, total_real, "Delta_lp_temp", comm ); - workspace->dDelta_lp = (double*) smalloc(lmp, total_real, "dDelta_lp", comm ); + smalloc(control->error_ptr, total_real, "Delta_lp_temp", comm ); + workspace->dDelta_lp = (double*) smalloc(control->error_ptr, total_real, "dDelta_lp", comm ); workspace->dDelta_lp_temp = (double*) - smalloc(lmp, total_real, "dDelta_lp_temp", comm ); - workspace->Delta_e = (double*) smalloc(lmp, total_real, "Delta_e", comm ); - workspace->Delta_boc = (double*) smalloc(lmp, total_real, "Delta_boc", comm ); - workspace->Delta_val = (double*) smalloc(lmp, total_real, "Delta_val", comm ); - workspace->nlp = (double*) smalloc(lmp, total_real, "nlp", comm ); - workspace->nlp_temp = (double*) smalloc(lmp, total_real, "nlp_temp", comm ); - workspace->Clp = (double*) smalloc(lmp, total_real, "Clp", comm ); - workspace->vlpex = (double*) smalloc(lmp, total_real, "vlpex", comm ); + smalloc(control->error_ptr, total_real, "dDelta_lp_temp", comm ); + workspace->Delta_e = (double*) smalloc(control->error_ptr, total_real, "Delta_e", comm ); + workspace->Delta_boc = (double*) smalloc(control->error_ptr, total_real, "Delta_boc", comm ); + workspace->Delta_val = (double*) smalloc(control->error_ptr, total_real, "Delta_val", comm ); + workspace->nlp = (double*) smalloc(control->error_ptr, total_real, "nlp", comm ); + workspace->nlp_temp = (double*) smalloc(control->error_ptr, total_real, "nlp_temp", comm ); + workspace->Clp = (double*) smalloc(control->error_ptr, total_real, "Clp", comm ); + workspace->vlpex = (double*) smalloc(control->error_ptr, total_real, "vlpex", comm ); workspace->bond_mark = (int*) - scalloc(lmp, total_cap, sizeof(int), "bond_mark", comm ); + scalloc(control->error_ptr, total_cap, sizeof(int), "bond_mark", comm ); workspace->done_after = (int*) - scalloc(lmp, total_cap, sizeof(int), "done_after", comm ); + scalloc(control->error_ptr, total_cap, sizeof(int), "done_after", comm ); /* QEq storage */ workspace->Hdia_inv = (double*) - scalloc(lmp, total_cap, sizeof(double), "Hdia_inv", comm ); - workspace->b_s = (double*) scalloc(lmp, total_cap, sizeof(double), "b_s", comm ); - workspace->b_t = (double*) scalloc(lmp, total_cap, sizeof(double), "b_t", comm ); - workspace->b_prc = (double*) scalloc(lmp, total_cap, sizeof(double), "b_prc", comm ); - workspace->b_prm = (double*) scalloc(lmp, total_cap, sizeof(double), "b_prm", comm ); - workspace->s = (double*) scalloc(lmp, total_cap, sizeof(double), "s", comm ); - workspace->t = (double*) scalloc(lmp, total_cap, sizeof(double), "t", comm ); + scalloc(control->error_ptr, total_cap, sizeof(double), "Hdia_inv", comm ); + workspace->b_s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_s", comm ); + workspace->b_t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_t", comm ); + workspace->b_prc = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prc", comm ); + workspace->b_prm = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prm", comm ); + workspace->s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "s", comm ); + workspace->t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "t", comm ); workspace->droptol = (double*) - scalloc(lmp, total_cap, sizeof(double), "droptol", comm ); - workspace->b = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "b", comm ); - workspace->x = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "x", comm ); + scalloc(control->error_ptr, total_cap, sizeof(double), "droptol", comm ); + workspace->b = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "b", comm ); + workspace->x = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "x", comm ); /* GMRES storage */ - workspace->y = (double*) scalloc(lmp, RESTART+1, sizeof(double), "y", comm ); - workspace->z = (double*) scalloc(lmp, RESTART+1, sizeof(double), "z", comm ); - workspace->g = (double*) scalloc(lmp, RESTART+1, sizeof(double), "g", comm ); - workspace->h = (double**) scalloc(lmp, RESTART+1, sizeof(double*), "h", comm ); - workspace->hs = (double*) scalloc(lmp, RESTART+1, sizeof(double), "hs", comm ); - workspace->hc = (double*) scalloc(lmp, RESTART+1, sizeof(double), "hc", comm ); - workspace->v = (double**) scalloc(lmp, RESTART+1, sizeof(double*), "v", comm ); + workspace->y = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "y", comm ); + workspace->z = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "z", comm ); + workspace->g = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "g", comm ); + workspace->h = (double**) scalloc(control->error_ptr, RESTART+1, sizeof(double*), "h", comm ); + workspace->hs = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "hs", comm ); + workspace->hc = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "hc", comm ); + workspace->v = (double**) scalloc(control->error_ptr, RESTART+1, sizeof(double*), "v", comm ); for( i = 0; i < RESTART+1; ++i ) { - workspace->h[i] = (double*) scalloc(lmp, RESTART+1, sizeof(double), "h[i]", comm ); - workspace->v[i] = (double*) scalloc(lmp, total_cap, sizeof(double), "v[i]", comm ); + workspace->h[i] = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "h[i]", comm ); + workspace->v[i] = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "v[i]", comm ); } /* CG storage */ - workspace->r = (double*) scalloc(lmp, total_cap, sizeof(double), "r", comm ); - workspace->d = (double*) scalloc(lmp, total_cap, sizeof(double), "d", comm ); - workspace->q = (double*) scalloc(lmp, total_cap, sizeof(double), "q", comm ); - workspace->p = (double*) scalloc(lmp, total_cap, sizeof(double), "p", comm ); - workspace->r2 = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "r2", comm ); - workspace->d2 = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "d2", comm ); - workspace->q2 = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "q2", comm ); - workspace->p2 = (rvec2*) scalloc(lmp, total_cap, sizeof(rvec2), "p2", comm ); + workspace->r = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "r", comm ); + workspace->d = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "d", comm ); + workspace->q = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "q", comm ); + workspace->p = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "p", comm ); + workspace->r2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "r2", comm ); + workspace->d2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "d2", comm ); + workspace->q2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "q2", comm ); + workspace->p2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "p2", comm ); /* integrator storage */ - workspace->v_const = (rvec*) smalloc(lmp, local_rvec, "v_const", comm ); + workspace->v_const = (rvec*) smalloc(control->error_ptr, local_rvec, "v_const", comm ); /* force related storage */ - workspace->f = (rvec*) scalloc(lmp, total_cap, sizeof(rvec), "f", comm ); + workspace->f = (rvec*) scalloc(control->error_ptr, total_cap, sizeof(rvec), "f", comm ); workspace->CdDelta = (double*) - scalloc(lmp, total_cap, sizeof(double), "CdDelta", comm ); + scalloc(control->error_ptr, total_cap, sizeof(double), "CdDelta", comm ); // storage for reductions with multiple threads #ifdef LMP_USER_OMP - workspace->CdDeltaReduction = (double *) scalloc(lmp, sizeof(double), total_cap*control->nthreads, + workspace->CdDeltaReduction = (double *) scalloc(control->error_ptr, sizeof(double), total_cap*control->nthreads, "cddelta_reduce", comm); - workspace->forceReduction = (rvec *) scalloc(lmp, sizeof(rvec), total_cap*control->nthreads, + workspace->forceReduction = (rvec *) scalloc(control->error_ptr, sizeof(rvec), total_cap*control->nthreads, "forceReduction", comm); - workspace->valence_angle_atom_myoffset = (int *) scalloc(lmp, sizeof(int), total_cap, "valence_angle_atom_myoffset", comm); + workspace->valence_angle_atom_myoffset = (int *) scalloc(control->error_ptr, sizeof(int), total_cap, "valence_angle_atom_myoffset", comm); workspace->my_ext_pressReduction = (rvec *) calloc(sizeof(rvec), control->nthreads); #else LMP_UNUSED_PARAM(control); @@ -321,17 +321,17 @@ int Allocate_Workspace( LAMMPS_NS::LAMMPS* lmp, reax_system * /*system*/, contro } -static void Reallocate_Neighbor_List( LAMMPS* lmp, reax_list *far_nbrs, int n, +static void Reallocate_Neighbor_List( reax_list *far_nbrs, int n, int num_intrs, MPI_Comm comm ) { - Delete_List( lmp, far_nbrs, comm ); - if(!Make_List( lmp, n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs, comm )){ - lmp->error->one(FLERR,"Problem in initializing far neighbors list"); + Delete_List( far_nbrs, comm ); + if(!Make_List( n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs, comm )){ + far_nbrs->error_ptr->one(FLERR,"Problem in initializing far neighbors list"); } } -static int Reallocate_HBonds_List( LAMMPS *lmp, reax_system *system, reax_list *hbonds, +static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds, MPI_Comm comm ) { int i, total_hbonds; @@ -346,16 +346,16 @@ static int Reallocate_HBonds_List( LAMMPS *lmp, reax_system *system, reax_list * } total_hbonds = (int)(MAX( total_hbonds*saferzone, mincap*MIN_HBONDS )); - Delete_List( lmp, hbonds, comm ); - if (!Make_List( lmp, system->Hcap, total_hbonds, TYP_HBOND, hbonds, comm )) { - lmp->error->one(FLERR, "Not enough space for hydrogen bonds list"); + Delete_List( hbonds, comm ); + if (!Make_List( system->Hcap, total_hbonds, TYP_HBOND, hbonds, comm )) { + hbonds->error_ptr->one(FLERR, "Not enough space for hydrogen bonds list"); } return total_hbonds; } -static int Reallocate_Bonds_List( LAMMPS *lmp, reax_system *system, reax_list *bonds, +static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, int *total_bonds, int *est_3body, MPI_Comm comm ) { @@ -375,12 +375,12 @@ static int Reallocate_Bonds_List( LAMMPS *lmp, reax_system *system, reax_list *b #ifdef LMP_USER_OMP if (system->omp_active) for (i = 0; i < bonds->num_intrs; ++i) - sfree(lmp, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); + sfree(system->error_ptr, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); #endif - Delete_List( lmp, bonds, comm ); - if(!Make_List(lmp, system->total_cap, *total_bonds, TYP_BOND, bonds, comm)) { - lmp->error->one(FLERR, "Not enough space for bonds list"); + Delete_List( bonds, comm ); + if(!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds, comm)) { + bonds->error_ptr->one(FLERR, "Not enough space for bonds list"); } #ifdef LMP_USER_OMP @@ -393,14 +393,14 @@ static int Reallocate_Bonds_List( LAMMPS *lmp, reax_system *system, reax_list *b if (system->omp_active) for (i = 0; i < bonds->num_intrs; ++i) bonds->select.bond_list[i].bo_data.CdboReduction = - (double*) smalloc(lmp, sizeof(double)*nthreads, "CdboReduction", comm); + (double*) smalloc(system->error_ptr, sizeof(double)*nthreads, "CdboReduction", comm); #endif return SUCCESS; } -void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, +void ReAllocate( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, mpi_datatypes *mpi_data ) { @@ -436,17 +436,17 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, if (ret != SUCCESS) { char errmsg[128]; snprintf(errmsg, 128, "Not enough space for atom_list: total_cap=%d", system->total_cap); - lmp->error->one(FLERR, errmsg); + system->error_ptr->one(FLERR, errmsg); } /* workspace */ - DeAllocate_Workspace( lmp, control, workspace ); - ret = Allocate_Workspace( lmp, system, control, workspace, system->local_cap, + DeAllocate_Workspace( control, workspace ); + ret = Allocate_Workspace( system, control, workspace, system->local_cap, system->total_cap, comm, msg ); if (ret != SUCCESS) { char errmsg[128]; snprintf(errmsg, 128, "Not enough space for workspace: local_cap=%d total_cap=%d", system->local_cap, system->total_cap); - lmp->error->one(FLERR, errmsg); + system->error_ptr->one(FLERR, errmsg); } } @@ -460,13 +460,13 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, if (realloc->num_far > far_nbrs->num_intrs) { char errmsg[128]; snprintf(errmsg, 128, "step%d-ran out of space on far_nbrs: top=%d, max=%d", data->step, realloc->num_far, far_nbrs->num_intrs); - lmp->error->one(FLERR, errmsg); + system->error_ptr->one(FLERR, errmsg); } newsize = static_cast (MAX( realloc->num_far*safezone, mincap*MIN_NBRS )); - Reallocate_Neighbor_List( lmp, far_nbrs, system->total_cap, newsize, comm ); + Reallocate_Neighbor_List( far_nbrs, system->total_cap, newsize, comm ); realloc->num_far = 0; } } @@ -481,7 +481,7 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, } if (Hflag || realloc->hbonds) { - ret = Reallocate_HBonds_List( lmp, system, (*lists)+HBONDS, comm ); + ret = Reallocate_HBonds_List( system, (*lists)+HBONDS, comm ); realloc->hbonds = 0; } } @@ -489,7 +489,7 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, /* bonds list */ num_bonds = est_3body = -1; if (Nflag || realloc->bonds) { - Reallocate_Bonds_List( lmp, system, (*lists)+BONDS, &num_bonds, + Reallocate_Bonds_List( system, (*lists)+BONDS, &num_bonds, &est_3body, comm ); realloc->bonds = 0; realloc->num_3body = MAX( realloc->num_3body, est_3body ) * 2; @@ -497,16 +497,16 @@ void ReAllocate( LAMMPS *lmp, reax_system *system, control_params *control, /* 3-body list */ if (realloc->num_3body > 0) { - Delete_List( lmp, (*lists)+THREE_BODIES, comm ); + Delete_List( (*lists)+THREE_BODIES, comm ); if (num_bonds == -1) num_bonds = ((*lists)+BONDS)->num_intrs; realloc->num_3body = (int)(MAX(realloc->num_3body*safezone, MIN_3BODIES)); - if( !Make_List( lmp, num_bonds, realloc->num_3body, TYP_THREE_BODY, + if( !Make_List( num_bonds, realloc->num_3body, TYP_THREE_BODY, (*lists)+THREE_BODIES, comm ) ) { - lmp->error->one(FLERR, "Problem in initializing angles list"); + system->error_ptr->one(FLERR, "Problem in initializing angles list"); } realloc->num_3body = -1; } diff --git a/src/USER-REAXC/reaxc_allocate.h b/src/USER-REAXC/reaxc_allocate.h index 9f009b0916..f813204006 100644 --- a/src/USER-REAXC/reaxc_allocate.h +++ b/src/USER-REAXC/reaxc_allocate.h @@ -33,15 +33,15 @@ #include "error.h" using namespace LAMMPS_NS; -int PreAllocate_Space( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, storage*, MPI_Comm ); +int PreAllocate_Space( reax_system*, control_params*, storage*, MPI_Comm ); int Allocate_System( reax_system*, int, int, char* ); -void DeAllocate_System( LAMMPS_NS::LAMMPS*, reax_system* ); +void DeAllocate_System( reax_system* ); -int Allocate_Workspace( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, storage*, +int Allocate_Workspace( reax_system*, control_params*, storage*, int, int, MPI_Comm, char* ); -void DeAllocate_Workspace( LAMMPS_NS::LAMMPS*, control_params*, storage* ); +void DeAllocate_Workspace( control_params*, storage* ); -void ReAllocate( LAMMPS *lmp, reax_system*, control_params*, simulation_data*, storage*, +void ReAllocate( reax_system*, control_params*, simulation_data*, storage*, reax_list**, mpi_datatypes* ); #endif diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 6096e3e614..8316c188b3 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -99,54 +99,54 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, /* Allocating structures in reax_interaction */ reax->sbp = (single_body_parameters*) - scalloc(lmp, reax->num_atom_types, sizeof(single_body_parameters), "sbp", + scalloc(lmp->error, reax->num_atom_types, sizeof(single_body_parameters), "sbp", comm ); reax->tbp = (two_body_parameters**) - scalloc(lmp, reax->num_atom_types, sizeof(two_body_parameters*), "tbp", comm ); + scalloc(lmp->error, reax->num_atom_types, sizeof(two_body_parameters*), "tbp", comm ); reax->thbp= (three_body_header***) - scalloc(lmp, reax->num_atom_types, sizeof(three_body_header**), "thbp", comm ); + scalloc(lmp->error, reax->num_atom_types, sizeof(three_body_header**), "thbp", comm ); reax->hbp = (hbond_parameters***) - scalloc(lmp, reax->num_atom_types, sizeof(hbond_parameters**), "hbp", comm ); + scalloc(lmp->error, reax->num_atom_types, sizeof(hbond_parameters**), "hbp", comm ); reax->fbp = (four_body_header****) - scalloc(lmp, reax->num_atom_types, sizeof(four_body_header***), "fbp", comm ); + scalloc(lmp->error, reax->num_atom_types, sizeof(four_body_header***), "fbp", comm ); tor_flag = (char****) - scalloc(lmp, reax->num_atom_types, sizeof(char***), "tor_flag", comm ); + scalloc(lmp->error, reax->num_atom_types, sizeof(char***), "tor_flag", comm ); for( i = 0; i < reax->num_atom_types; i++ ) { reax->tbp[i] = (two_body_parameters*) - scalloc(lmp, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]", + scalloc(lmp->error, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]", comm ); reax->thbp[i]= (three_body_header**) - scalloc(lmp, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]", + scalloc(lmp->error, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]", comm ); reax->hbp[i] = (hbond_parameters**) - scalloc(lmp, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]", + scalloc(lmp->error, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]", comm ); reax->fbp[i] = (four_body_header***) - scalloc(lmp, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]", + scalloc(lmp->error, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]", comm ); tor_flag[i] = (char***) - scalloc(lmp, reax->num_atom_types, sizeof(char**), "tor_flag[i]", comm ); + scalloc(lmp->error, reax->num_atom_types, sizeof(char**), "tor_flag[i]", comm ); for( j = 0; j < reax->num_atom_types; j++ ) { reax->thbp[i][j]= (three_body_header*) - scalloc(lmp, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]", + scalloc(lmp->error, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]", comm ); reax->hbp[i][j] = (hbond_parameters*) - scalloc(lmp, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]", + scalloc(lmp->error, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]", comm ); reax->fbp[i][j] = (four_body_header**) - scalloc(lmp, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]", + scalloc(lmp->error, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]", comm ); tor_flag[i][j] = (char**) - scalloc(lmp, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]", comm ); + scalloc(lmp->error, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]", comm ); for (k=0; k < reax->num_atom_types; k++) { reax->fbp[i][j][k] = (four_body_header*) - scalloc(lmp, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]", + scalloc(lmp->error, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]", comm ); tor_flag[i][j][k] = (char*) - scalloc(lmp, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]", + scalloc(lmp->error, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]", comm ); } } diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 6ee68d6c46..8c60db0846 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -127,7 +127,7 @@ int Init_Workspace( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params { int ret; - ret = Allocate_Workspace( lmp, system, control, workspace, + ret = Allocate_Workspace( system, control, workspace, system->local_cap, system->total_cap, comm, msg ); if (ret != SUCCESS) return ret; @@ -181,10 +181,11 @@ int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, } total_hbonds = (int)(MAX( total_hbonds*saferzone, mincap*MIN_HBONDS )); - if( !Make_List( lmp, system->Hcap, total_hbonds, TYP_HBOND, + if( !Make_List( system->Hcap, total_hbonds, TYP_HBOND, *lists+HBONDS, comm ) ) { lmp->error->one(FLERR, "Not enough space for hbonds list."); } + (*lists+HBONDS)->error_ptr = system->error_ptr; } total_bonds = 0; @@ -194,17 +195,19 @@ int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, } bond_cap = (int)(MAX( total_bonds*safezone, mincap*MIN_BONDS )); - if( !Make_List( lmp, system->total_cap, bond_cap, TYP_BOND, + if( !Make_List( system->total_cap, bond_cap, TYP_BOND, *lists+BONDS, comm ) ) { lmp->error->one(FLERR, "Not enough space for bonds list."); } + (*lists+BONDS)->error_ptr = system->error_ptr; /* 3bodies list */ cap_3body = (int)(MAX( num_3body*safezone, MIN_3BODIES )); - if( !Make_List( lmp, bond_cap, cap_3body, TYP_THREE_BODY, + if( !Make_List( bond_cap, cap_3body, TYP_THREE_BODY, *lists+THREE_BODIES, comm ) ){ lmp->error->one(FLERR,"Problem in initializing angles list."); } + (*lists+THREE_BODIES)->error_ptr = system->error_ptr; free( hb_top ); free( bond_top ); diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index 5d4ab2f3c8..f103e520e8 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -29,118 +29,118 @@ #include "reaxc_tool_box.h" /************* allocate list space ******************/ -int Make_List( LAMMPS_NS::LAMMPS *lmp, int n, int num_intrs, int type, reax_list *l, MPI_Comm comm) +int Make_List( int n, int num_intrs, int type, reax_list *l, MPI_Comm comm) { l->allocated = 1; l->n = n; l->num_intrs = num_intrs; - if (l->index) sfree(lmp, l->index, "list:index"); - if (l->end_index) sfree(lmp, l->end_index, "list:end_index"); - l->index = (int*) smalloc(lmp, n * sizeof(int), "list:index", comm ); - l->end_index = (int*) smalloc(lmp, n * sizeof(int), "list:end_index", comm ); + if (l->index) sfree(l->error_ptr, l->index, "list:index"); + if (l->end_index) sfree(l->error_ptr, l->end_index, "list:end_index"); + l->index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:index", comm ); + l->end_index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:end_index", comm ); l->type = type; switch(l->type) { case TYP_VOID: - if (l->select.v) sfree(lmp, l->select.v, "list:v"); - l->select.v = (void*) smalloc(lmp, l->num_intrs * sizeof(void*), "list:v", comm); + if (l->select.v) sfree(l->error_ptr, l->select.v, "list:v"); + l->select.v = (void*) smalloc(l->error_ptr, l->num_intrs * sizeof(void*), "list:v", comm); break; case TYP_THREE_BODY: - if (l->select.three_body_list) sfree(lmp, l->select.three_body_list,"list:three_bodies"); + if (l->select.three_body_list) sfree(l->error_ptr, l->select.three_body_list,"list:three_bodies"); l->select.three_body_list = (three_body_interaction_data*) - smalloc(lmp, l->num_intrs * sizeof(three_body_interaction_data), + smalloc(l->error_ptr, l->num_intrs * sizeof(three_body_interaction_data), "list:three_bodies", comm ); break; case TYP_BOND: - if (l->select.bond_list) sfree(lmp, l->select.bond_list,"list:bonds"); + if (l->select.bond_list) sfree(l->error_ptr, l->select.bond_list,"list:bonds"); l->select.bond_list = (bond_data*) - smalloc(lmp, l->num_intrs * sizeof(bond_data), "list:bonds", comm ); + smalloc(l->error_ptr, l->num_intrs * sizeof(bond_data), "list:bonds", comm ); break; case TYP_DBO: - if (l->select.dbo_list) sfree(lmp, l->select.dbo_list,"list:dbonds"); + if (l->select.dbo_list) sfree(l->error_ptr, l->select.dbo_list,"list:dbonds"); l->select.dbo_list = (dbond_data*) - smalloc(lmp, l->num_intrs * sizeof(dbond_data), "list:dbonds", comm ); + smalloc(l->error_ptr, l->num_intrs * sizeof(dbond_data), "list:dbonds", comm ); break; case TYP_DDELTA: - if (l->select.dDelta_list) sfree(lmp, l->select.dDelta_list,"list:dDeltas"); + if (l->select.dDelta_list) sfree(l->error_ptr, l->select.dDelta_list,"list:dDeltas"); l->select.dDelta_list = (dDelta_data*) - smalloc(lmp, l->num_intrs * sizeof(dDelta_data), "list:dDeltas", comm ); + smalloc(l->error_ptr, l->num_intrs * sizeof(dDelta_data), "list:dDeltas", comm ); break; case TYP_FAR_NEIGHBOR: - if (l->select.far_nbr_list) sfree(lmp, l->select.far_nbr_list,"list:far_nbrs"); + if (l->select.far_nbr_list) sfree(l->error_ptr, l->select.far_nbr_list,"list:far_nbrs"); l->select.far_nbr_list = (far_neighbor_data*) - smalloc(lmp, l->num_intrs * sizeof(far_neighbor_data), "list:far_nbrs", comm); + smalloc(l->error_ptr, l->num_intrs * sizeof(far_neighbor_data), "list:far_nbrs", comm); break; case TYP_HBOND: - if (l->select.hbond_list) sfree(lmp, l->select.hbond_list,"list:hbonds"); + if (l->select.hbond_list) sfree(l->error_ptr, l->select.hbond_list,"list:hbonds"); l->select.hbond_list = (hbond_data*) - smalloc(lmp, l->num_intrs * sizeof(hbond_data), "list:hbonds", comm ); + smalloc(l->error_ptr, l->num_intrs * sizeof(hbond_data), "list:hbonds", comm ); break; default: char errmsg[128]; snprintf(errmsg, 128, "No %d list type defined", l->type); - lmp->error->all(FLERR,errmsg); + l->error_ptr->all(FLERR,errmsg); } return SUCCESS; } -void Delete_List( LAMMPS_NS::LAMMPS *lmp, reax_list *l, MPI_Comm comm ) +void Delete_List( reax_list *l, MPI_Comm comm ) { if (l->allocated == 0) return; l->allocated = 0; - sfree(lmp, l->index, "list:index" ); - sfree(lmp, l->end_index, "list:end_index" ); + sfree(l->error_ptr, l->index, "list:index" ); + sfree(l->error_ptr, l->end_index, "list:end_index" ); l->index = NULL; l->end_index = NULL; switch(l->type) { case TYP_VOID: - sfree(lmp, l->select.v, "list:v" ); + sfree(l->error_ptr, l->select.v, "list:v" ); l->select.v = NULL; break; case TYP_HBOND: - sfree(lmp, l->select.hbond_list, "list:hbonds" ); + sfree(l->error_ptr, l->select.hbond_list, "list:hbonds" ); l->select.hbond_list = NULL; break; case TYP_FAR_NEIGHBOR: - sfree(lmp, l->select.far_nbr_list, "list:far_nbrs" ); + sfree(l->error_ptr, l->select.far_nbr_list, "list:far_nbrs" ); l->select.far_nbr_list = NULL; break; case TYP_BOND: - sfree(lmp, l->select.bond_list, "list:bonds" ); + sfree(l->error_ptr, l->select.bond_list, "list:bonds" ); l->select.bond_list = NULL; break; case TYP_DBO: - sfree(lmp, l->select.dbo_list, "list:dbos" ); + sfree(l->error_ptr, l->select.dbo_list, "list:dbos" ); l->select.dbo_list = NULL; break; case TYP_DDELTA: - sfree(lmp, l->select.dDelta_list, "list:dDeltas" ); + sfree(l->error_ptr, l->select.dDelta_list, "list:dDeltas" ); l->select.dDelta_list = NULL; break; case TYP_THREE_BODY: - sfree(lmp, l->select.three_body_list, "list:three_bodies" ); + sfree(l->error_ptr, l->select.three_body_list, "list:three_bodies" ); l->select.three_body_list = NULL; break; default: char errmsg[128]; snprintf(errmsg, 128, "No %d list type defined", l->type); - lmp->error->all(FLERR,errmsg); + l->error_ptr->all(FLERR,errmsg); } } diff --git a/src/USER-REAXC/reaxc_list.h b/src/USER-REAXC/reaxc_list.h index 1df2338b0f..ab7fbce19c 100644 --- a/src/USER-REAXC/reaxc_list.h +++ b/src/USER-REAXC/reaxc_list.h @@ -29,8 +29,8 @@ #include "reaxc_types.h" -int Make_List( LAMMPS_NS::LAMMPS*, int, int, int, reax_list*, MPI_Comm ); -void Delete_List( LAMMPS_NS::LAMMPS*, reax_list*, MPI_Comm ); +int Make_List( int, int, int, reax_list*, MPI_Comm ); +void Delete_List( reax_list*, MPI_Comm ); inline int Num_Entries(int,reax_list*); inline int Start_Index( int, reax_list* ); diff --git a/src/USER-REAXC/reaxc_lookup.cpp b/src/USER-REAXC/reaxc_lookup.cpp index 41ad5e99d4..c16ca9af52 100644 --- a/src/USER-REAXC/reaxc_lookup.cpp +++ b/src/USER-REAXC/reaxc_lookup.cpp @@ -58,11 +58,11 @@ void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const double double *a, *b, *c, *d, *v; /* allocate space for the linear system */ - a = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); - b = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); - c = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); - d = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); - v = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + a = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + b = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + c = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + d = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + v = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); /* build the linear system */ a[0] = a[1] = a[n-1] = 0; @@ -92,11 +92,11 @@ void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const double coef[i-1].a = f[i]; } - sfree(lmp, a, "cubic_spline:a" ); - sfree(lmp, b, "cubic_spline:b" ); - sfree(lmp, c, "cubic_spline:c" ); - sfree(lmp, d, "cubic_spline:d" ); - sfree(lmp, v, "cubic_spline:v" ); + sfree(lmp->error, a, "cubic_spline:a" ); + sfree(lmp->error, b, "cubic_spline:b" ); + sfree(lmp->error, c, "cubic_spline:c" ); + sfree(lmp->error, d, "cubic_spline:d" ); + sfree(lmp->error, v, "cubic_spline:v" ); } @@ -109,11 +109,11 @@ void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const doubl double *a, *b, *c, *d, *v; /* allocate space for the linear system */ - a = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); - b = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); - c = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); - d = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); - v = (double*) smalloc(lmp, n * sizeof(double), "cubic_spline:a", comm ); + a = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + b = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + c = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + d = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + v = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); /* build the linear system */ a[0] = 0; @@ -142,11 +142,11 @@ void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const doubl coef[i-1].a = f[i]; } - sfree(lmp, a, "cubic_spline:a" ); - sfree(lmp, b, "cubic_spline:b" ); - sfree(lmp, c, "cubic_spline:c" ); - sfree(lmp, d, "cubic_spline:d" ); - sfree(lmp, v, "cubic_spline:v" ); + sfree(lmp->error, a, "cubic_spline:a" ); + sfree(lmp->error, b, "cubic_spline:b" ); + sfree(lmp->error, c, "cubic_spline:c" ); + sfree(lmp->error, d, "cubic_spline:d" ); + sfree(lmp->error, v, "cubic_spline:v" ); } @@ -171,23 +171,23 @@ int Init_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_par num_atom_types = system->reax_param.num_atom_types; dr = control->nonb_cut / control->tabulate; h = (double*) - smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:h", comm ); + smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:h", comm ); fh = (double*) - smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fh", comm ); + smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fh", comm ); fvdw = (double*) - smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fvdw", comm ); + smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fvdw", comm ); fCEvd = (double*) - smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fCEvd", comm ); + smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fCEvd", comm ); fele = (double*) - smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fele", comm ); + smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fele", comm ); fCEclmb = (double*) - smalloc(lmp, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb", comm ); + smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb", comm ); LR = (LR_lookup_table**) - scalloc(lmp, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR", comm ); + scalloc(lmp->error, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR", comm ); for( i = 0; i < num_atom_types; ++i ) LR[i] = (LR_lookup_table*) - scalloc(lmp, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]", comm ); + scalloc(lmp->error, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]", comm ); for( i = 0; i < MAX_ATOM_TYPES; ++i ) existing_types[i] = 0; @@ -207,21 +207,21 @@ int Init_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_par LR[i][j].dx = dr; LR[i][j].inv_dx = control->tabulate / control->nonb_cut; LR[i][j].y = (LR_data*) - smalloc(lmp, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y", comm ); + smalloc(lmp->error, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y", comm ); LR[i][j].H = (cubic_spline_coef*) - smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H" , + smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H" , comm ); LR[i][j].vdW = (cubic_spline_coef*) - smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW", + smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW", comm); LR[i][j].CEvd = (cubic_spline_coef*) - smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd", + smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd", comm); LR[i][j].ele = (cubic_spline_coef*) - smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele", + smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele", comm ); LR[i][j].CEclmb = (cubic_spline_coef*) - smalloc(lmp, LR[i][j].n*sizeof(cubic_spline_coef), + smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef), "lookup:LR[i,j].CEclmb", comm ); for( r = 1; r <= control->tabulate; ++r ) { @@ -291,14 +291,14 @@ void Deallocate_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system ) for( i = 0; i < ntypes; ++i ) { for( j = i; j < ntypes; ++j ) if (LR[i][j].n) { - sfree(lmp, LR[i][j].y, "LR[i,j].y" ); - sfree(lmp, LR[i][j].H, "LR[i,j].H" ); - sfree(lmp, LR[i][j].vdW, "LR[i,j].vdW" ); - sfree(lmp, LR[i][j].CEvd, "LR[i,j].CEvd" ); - sfree(lmp, LR[i][j].ele, "LR[i,j].ele" ); - sfree(lmp, LR[i][j].CEclmb, "LR[i,j].CEclmb" ); + sfree(lmp->error, LR[i][j].y, "LR[i,j].y" ); + sfree(lmp->error, LR[i][j].H, "LR[i,j].H" ); + sfree(lmp->error, LR[i][j].vdW, "LR[i,j].vdW" ); + sfree(lmp->error, LR[i][j].CEvd, "LR[i,j].CEvd" ); + sfree(lmp->error, LR[i][j].ele, "LR[i,j].ele" ); + sfree(lmp->error, LR[i][j].CEclmb, "LR[i,j].CEclmb" ); } - sfree(lmp, LR[i], "LR[i]" ); + sfree(lmp->error, LR[i], "LR[i]" ); } - sfree(lmp, LR, "LR" ); + sfree(lmp->error, LR, "LR" ); } diff --git a/src/USER-REAXC/reaxc_tool_box.cpp b/src/USER-REAXC/reaxc_tool_box.cpp index eaa6765f36..cd339af556 100644 --- a/src/USER-REAXC/reaxc_tool_box.cpp +++ b/src/USER-REAXC/reaxc_tool_box.cpp @@ -56,7 +56,7 @@ int Tokenize( char* s, char*** tok ) /* safe malloc */ -void *smalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, const char *name, MPI_Comm comm ) +void *smalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name, MPI_Comm comm ) { void *ptr; char errmsg[256]; @@ -64,14 +64,14 @@ void *smalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, const char *name, MPI_Comm c if (n <= 0) { snprintf(errmsg, 256, "Trying to allocate %ld bytes for array %s. " "returning NULL.", n, name); - lmp->error->warning(FLERR,errmsg); + error_ptr->warning(FLERR,errmsg); return NULL; } ptr = malloc( n ); if (ptr == NULL) { snprintf(errmsg, 256, "Failed to allocate %ld bytes for array %s", n, name); - lmp->error->one(FLERR,errmsg); + error_ptr->one(FLERR,errmsg); } return ptr; @@ -79,7 +79,7 @@ void *smalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, const char *name, MPI_Comm c /* safe calloc */ -void *scalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, rc_bigint size, const char *name, MPI_Comm comm ) +void *scalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const char *name, MPI_Comm comm ) { void *ptr; char errmsg[256]; @@ -87,14 +87,14 @@ void *scalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, rc_bigint size, const char * if (n <= 0) { snprintf(errmsg, 256, "Trying to allocate %ld elements for array %s. " "returning NULL.\n", n, name ); - lmp->error->warning(FLERR,errmsg); + error_ptr->warning(FLERR,errmsg); return NULL; } if (size <= 0) { snprintf(errmsg, 256, "Elements size for array %s is %ld. " "returning NULL", name, size ); - lmp->error->warning(FLERR,errmsg); + error_ptr->warning(FLERR,errmsg); return NULL; } @@ -102,7 +102,7 @@ void *scalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, rc_bigint size, const char * if (ptr == NULL) { char errmsg[256]; snprintf(errmsg, 256, "Failed to allocate %ld bytes for array %s", n*size, name); - lmp->error->one(FLERR,errmsg); + error_ptr->one(FLERR,errmsg); } return ptr; @@ -110,12 +110,12 @@ void *scalloc( LAMMPS_NS::LAMMPS *lmp, rc_bigint n, rc_bigint size, const char * /* safe free */ -void sfree( LAMMPS_NS::LAMMPS* lmp, void *ptr, const char *name ) +void sfree( LAMMPS_NS::Error* error_ptr, void *ptr, const char *name ) { if (ptr == NULL) { char errmsg[256]; snprintf(errmsg, 256, "Trying to free the already NULL pointer %s", name ); - lmp->error->one(FLERR,errmsg); + error_ptr->one(FLERR,errmsg); return; } diff --git a/src/USER-REAXC/reaxc_tool_box.h b/src/USER-REAXC/reaxc_tool_box.h index 7c5ab12587..257ff1813f 100644 --- a/src/USER-REAXC/reaxc_tool_box.h +++ b/src/USER-REAXC/reaxc_tool_box.h @@ -37,7 +37,7 @@ double Get_Time( ); int Tokenize( char*, char*** ); /* from lammps */ -void *smalloc( LAMMPS_NS::LAMMPS*, rc_bigint, const char*, MPI_Comm ); -void *scalloc( LAMMPS_NS::LAMMPS*, rc_bigint, rc_bigint, const char*, MPI_Comm ); -void sfree( LAMMPS_NS::LAMMPS*, void*, const char* ); +void *smalloc( LAMMPS_NS::Error*, rc_bigint, const char*, MPI_Comm ); +void *scalloc( LAMMPS_NS::Error*, rc_bigint, rc_bigint, const char*, MPI_Comm ); +void sfree( LAMMPS_NS::Error*, void*, const char* ); #endif diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index cf6d5dcddc..b7845a0510 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -41,6 +41,7 @@ #include "lammps.h" #include "error.h" +using LAMMPS_NS::Error; #if defined LMP_USER_OMP #define OMP_TIMING 0 @@ -414,6 +415,7 @@ struct _reax_system boundary_cutoff bndry_cuts; reax_atom *my_atoms; + class Error *error_ptr; class Pair *pair_ptr; int my_bonds; int mincap; @@ -491,6 +493,7 @@ typedef struct int lgflag; int enobondsflag; + class Error *error_ptr; } control_params; @@ -777,6 +780,7 @@ struct _reax_list int type; list_type select; + class Error *error_ptr; }; typedef _reax_list reax_list; From 99acb4ac541847c4620208831e2e2d9cfa03297e Mon Sep 17 00:00:00 2001 From: mkanski Date: Mon, 25 Mar 2019 15:00:52 +0100 Subject: [PATCH 0300/1242] Cleaning changes 1 --- src/USER-REAXC/pair_reaxc.cpp | 10 +-- src/USER-REAXC/reaxc_control.cpp | 7 +- src/USER-REAXC/reaxc_control.h | 2 +- src/USER-REAXC/reaxc_ffield.cpp | 60 +++++++++--------- src/USER-REAXC/reaxc_ffield.h | 2 +- src/USER-REAXC/reaxc_init_md.cpp | 45 +++++++------ src/USER-REAXC/reaxc_init_md.h | 2 +- src/USER-REAXC/reaxc_io_tools.cpp | 8 +-- src/USER-REAXC/reaxc_io_tools.h | 4 +- src/USER-REAXC/reaxc_lookup.cpp | 102 +++++++++++++++--------------- src/USER-REAXC/reaxc_lookup.h | 4 +- src/USER-REAXC/reaxc_traj.cpp | 48 +++++++------- src/USER-REAXC/reaxc_traj.h | 4 +- 13 files changed, 148 insertions(+), 150 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 58142b122a..b1f7799cb2 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -139,7 +139,7 @@ PairReaxC::~PairReaxC() // deallocate reax data-structures - if (control->tabulate ) Deallocate_Lookup_Tables( lmp, system); + if (control->tabulate ) Deallocate_Lookup_Tables( system); if (control->hbond_cut > 0 ) Delete_List( lists+HBONDS, world); Delete_List( lists+BONDS, world ); @@ -225,7 +225,7 @@ void PairReaxC::settings(int narg, char **arg) out_control->atom_info = 0; out_control->bond_info = 0; out_control->angle_info = 0; - } else Read_Control_File(lmp, arg[0], control, out_control); + } else Read_Control_File(arg[0], control, out_control); // default values @@ -300,7 +300,7 @@ void PairReaxC::coeff( int nargs, char **args ) FILE *fp; fp = force->open_potential(file); if (fp != NULL) - Read_Force_Field(lmp, fp, &(system->reax_param), control); + Read_Force_Field(fp, &(system->reax_param), control); else { char str[128]; snprintf(str,128,"Cannot open ReaxFF potential file %s",file); @@ -449,7 +449,7 @@ void PairReaxC::setup( ) (lists+FAR_NBRS)->error_ptr=lmp->error; write_reax_lists(); - Initialize( lmp, system, control, data, workspace, &lists, out_control, + Initialize( system, control, data, workspace, &lists, out_control, mpi_data, world ); for( int k = 0; k < system->N; ++k ) { num_bonds[k] = system->my_atoms[k].num_bonds; @@ -585,7 +585,7 @@ void PairReaxC::compute(int eflag, int vflag) data->step = update->ntimestep; - Output_Results( lmp, system, control, data, &lists, out_control, mpi_data ); + Output_Results( system, control, data, &lists, out_control, mpi_data ); // populate tmpid and tmpbo arrays for fix reax/c/species int i, j; diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index bf221a6266..14b28615fb 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -28,9 +28,8 @@ #include "reaxc_control.h" #include "reaxc_tool_box.h" -using namespace LAMMPS_NS; -char Read_Control_File( LAMMPS *lmp, char *control_file, control_params* control, +char Read_Control_File( char *control_file, control_params* control, output_controls *out_control ) { FILE *fp; @@ -40,7 +39,7 @@ char Read_Control_File( LAMMPS *lmp, char *control_file, control_params* control /* open control file */ if ( (fp = fopen( control_file, "r" ) ) == NULL ) { - lmp->error->all(FLERR, "The control file cannot be opened"); + control->error_ptr->all(FLERR, "The control file cannot be opened"); } /* assign default values */ @@ -367,7 +366,7 @@ char Read_Control_File( LAMMPS *lmp, char *control_file, control_params* control else { char errmsg[128]; snprintf(errmsg,128,"Unknown parameter %s in the control file", tmp[0]); - lmp->error->all(FLERR, errmsg); + control->error_ptr->all(FLERR, errmsg); } } diff --git a/src/USER-REAXC/reaxc_control.h b/src/USER-REAXC/reaxc_control.h index 4546a894f6..47627aed61 100644 --- a/src/USER-REAXC/reaxc_control.h +++ b/src/USER-REAXC/reaxc_control.h @@ -32,6 +32,6 @@ #include "lammps.h" #include "error.h" -char Read_Control_File( LAMMPS_NS::LAMMPS *lmp, char*, control_params*, output_controls* ); +char Read_Control_File( char*, control_params*, output_controls* ); #endif diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 8316c188b3..987a11d252 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -32,7 +32,7 @@ #include "lammps.h" #include "error.h" -char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, +char Read_Force_Field( FILE *fp, reax_interaction *reax, control_params *control ) { char *s; @@ -64,7 +64,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, n = atoi(tmp[0]); if (n < 1) { if (me == 0) - lmp->error->warning( FLERR, "Number of globals in ffield file is 0" ); + control->error_ptr->warning( FLERR, "Number of globals in ffield file is 0" ); fclose(fp); free(s); free(tmp); @@ -99,54 +99,54 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, /* Allocating structures in reax_interaction */ reax->sbp = (single_body_parameters*) - scalloc(lmp->error, reax->num_atom_types, sizeof(single_body_parameters), "sbp", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(single_body_parameters), "sbp", comm ); reax->tbp = (two_body_parameters**) - scalloc(lmp->error, reax->num_atom_types, sizeof(two_body_parameters*), "tbp", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters*), "tbp", comm ); reax->thbp= (three_body_header***) - scalloc(lmp->error, reax->num_atom_types, sizeof(three_body_header**), "thbp", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header**), "thbp", comm ); reax->hbp = (hbond_parameters***) - scalloc(lmp->error, reax->num_atom_types, sizeof(hbond_parameters**), "hbp", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters**), "hbp", comm ); reax->fbp = (four_body_header****) - scalloc(lmp->error, reax->num_atom_types, sizeof(four_body_header***), "fbp", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header***), "fbp", comm ); tor_flag = (char****) - scalloc(lmp->error, reax->num_atom_types, sizeof(char***), "tor_flag", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char***), "tor_flag", comm ); for( i = 0; i < reax->num_atom_types; i++ ) { reax->tbp[i] = (two_body_parameters*) - scalloc(lmp->error, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]", comm ); reax->thbp[i]= (three_body_header**) - scalloc(lmp->error, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]", comm ); reax->hbp[i] = (hbond_parameters**) - scalloc(lmp->error, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]", comm ); reax->fbp[i] = (four_body_header***) - scalloc(lmp->error, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]", comm ); tor_flag[i] = (char***) - scalloc(lmp->error, reax->num_atom_types, sizeof(char**), "tor_flag[i]", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char**), "tor_flag[i]", comm ); for( j = 0; j < reax->num_atom_types; j++ ) { reax->thbp[i][j]= (three_body_header*) - scalloc(lmp->error, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]", comm ); reax->hbp[i][j] = (hbond_parameters*) - scalloc(lmp->error, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]", comm ); reax->fbp[i][j] = (four_body_header**) - scalloc(lmp->error, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]", comm ); tor_flag[i][j] = (char**) - scalloc(lmp->error, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]", comm ); for (k=0; k < reax->num_atom_types; k++) { reax->fbp[i][j][k] = (four_body_header*) - scalloc(lmp->error, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]", comm ); tor_flag[i][j][k] = (char*) - scalloc(lmp->error, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]", + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]", comm ); } } @@ -163,7 +163,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, /* Sanity checks */ if (c < 9) { - lmp->error->one(FLERR,"Inconsistent ffield file"); + control->error_ptr->one(FLERR,"Inconsistent ffield file"); } for( j = 0; j < (int)(strlen(tmp[0])); ++j ) @@ -185,7 +185,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - lmp->error->one(FLERR,"Inconsistent ffield file"); + control->error_ptr->one(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].alpha = val; @@ -203,7 +203,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - lmp->error->one(FLERR,"Inconsistent ffield file"); + control->error_ptr->one(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].r_pi_pi = val; @@ -221,7 +221,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - lmp->error->one(FLERR,"Inconsistent ffield file"); + control->error_ptr->one(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].p_ovun2 = val; @@ -240,7 +240,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, /* Sanity check */ if (c > 2) { - lmp->error->one(FLERR,"Force field file incompatible with 'lgvdw yes'"); + control->error_ptr->one(FLERR,"Force field file incompatible with 'lgvdw yes'"); } val = atof(tmp[0]); reax->sbp[i].lgcij = val; @@ -258,7 +258,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, "This may cause division-by-zero errors. " "Keeping vdWaals-setting for earlier atoms.", reax->sbp[i].name); - lmp->error->warning(FLERR,errmsg); + control->error_ptr->warning(FLERR,errmsg); } errorflag = 0; } else { @@ -274,7 +274,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, "This may cause division-by-zero errors. " "Keeping vdWaals-setting for earlier atoms.", reax->sbp[i].name); - lmp->error->warning(FLERR,errmsg); + control->error_ptr->warning(FLERR,errmsg); } } else { reax->gp.vdw_type = 2; @@ -291,7 +291,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, "This may cause division-by-zero errors. " "Keeping vdWaals-setting for earlier atoms.", reax->sbp[i].name); - lmp->error->warning(FLERR,errmsg); + control->error_ptr->warning(FLERR,errmsg); } } else { reax->gp.vdw_type = 1; @@ -301,7 +301,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, snprintf(errmsg, 256, "Inconsistent vdWaals-parameters " "No shielding or inner-wall set for element %s", reax->sbp[i].name); - lmp->error->all(FLERR, errmsg); + control->error_ptr->all(FLERR, errmsg); } } } @@ -314,7 +314,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, char errmsg[256]; snprintf(errmsg, 256, "Changed valency_val to valency_boc for %s", reax->sbp[i].name); - lmp->error->warning(FLERR,errmsg); + control->error_ptr->warning(FLERR,errmsg); } reax->sbp[i].valency_val = reax->sbp[i].valency_boc; } @@ -324,7 +324,7 @@ char Read_Force_Field( LAMMPS_NS::LAMMPS* lmp, FILE *fp, reax_interaction *reax, c=Tokenize(s,&tmp); if (c == 2 && !lgflag) { - lmp->error->all(FLERR, "Force field file requires using 'lgvdw yes'"); + control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); } l = atoi(tmp[0]); diff --git a/src/USER-REAXC/reaxc_ffield.h b/src/USER-REAXC/reaxc_ffield.h index 225f207de9..7cef730f91 100644 --- a/src/USER-REAXC/reaxc_ffield.h +++ b/src/USER-REAXC/reaxc_ffield.h @@ -29,6 +29,6 @@ #include "reaxc_types.h" -char Read_Force_Field( LAMMPS_NS::LAMMPS*, FILE*, reax_interaction*, control_params* ); +char Read_Force_Field( FILE*, reax_interaction*, control_params* ); #endif diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 8c60db0846..27e60c580c 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -36,7 +36,6 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" -using namespace LAMMPS_NS; int Init_System( reax_system *system, control_params *control, char * /*msg*/ ) { @@ -82,7 +81,7 @@ int Init_Simulation_Data( reax_system *system, control_params *control, return SUCCESS; } -void Init_Taper( LAMMPS_NS::LAMMPS* lmp, control_params *control, storage *workspace, MPI_Comm comm ) +void Init_Taper( control_params *control, storage *workspace, MPI_Comm comm ) { double d1, d7; double swa, swa2, swa3; @@ -92,15 +91,15 @@ void Init_Taper( LAMMPS_NS::LAMMPS* lmp, control_params *control, storage *work swb = control->nonb_cut; if (fabs( swa ) > 0.01) - lmp->error->warning( FLERR, "Non-zero lower Taper-radius cutoff" ); + control->error_ptr->warning( FLERR, "Non-zero lower Taper-radius cutoff" ); if (swb < 0) { - lmp->error->all(FLERR,"Negative upper Taper-radius cutoff"); + control->error_ptr->all(FLERR,"Negative upper Taper-radius cutoff"); } else if( swb < 5 ) { char errmsg[256]; snprintf(errmsg, 256, "Very low Taper-radius cutoff: %f", swb ); - lmp->error->warning( FLERR, errmsg ); + control->error_ptr->warning( FLERR, errmsg ); } d1 = swb - swa; @@ -122,7 +121,7 @@ void Init_Taper( LAMMPS_NS::LAMMPS* lmp, control_params *control, storage *work } -int Init_Workspace( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, +int Init_Workspace( reax_system *system, control_params *control, storage *workspace, MPI_Comm comm, char *msg ) { int ret; @@ -136,7 +135,7 @@ int Init_Workspace( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params Reset_Workspace( system, workspace ); /* Initialize the Taper function */ - Init_Taper( lmp, control, workspace, comm ); + Init_Taper( control, workspace, comm ); return SUCCESS; } @@ -154,7 +153,7 @@ int Init_MPI_Datatypes( reax_system *system, storage * /*workspace*/, return SUCCESS; } -int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, +int Init_Lists( reax_system *system, control_params *control, simulation_data * /*data*/, storage * /*workspace*/, reax_list **lists, mpi_datatypes *mpi_data, char * /*msg*/ ) { @@ -183,7 +182,7 @@ int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, if( !Make_List( system->Hcap, total_hbonds, TYP_HBOND, *lists+HBONDS, comm ) ) { - lmp->error->one(FLERR, "Not enough space for hbonds list."); + control->error_ptr->one(FLERR, "Not enough space for hbonds list."); } (*lists+HBONDS)->error_ptr = system->error_ptr; } @@ -197,7 +196,7 @@ int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, if( !Make_List( system->total_cap, bond_cap, TYP_BOND, *lists+BONDS, comm ) ) { - lmp->error->one(FLERR, "Not enough space for bonds list."); + control->error_ptr->one(FLERR, "Not enough space for bonds list."); } (*lists+BONDS)->error_ptr = system->error_ptr; @@ -205,7 +204,7 @@ int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, cap_3body = (int)(MAX( num_3body*safezone, MIN_3BODIES )); if( !Make_List( bond_cap, cap_3body, TYP_THREE_BODY, *lists+THREE_BODIES, comm ) ){ - lmp->error->one(FLERR,"Problem in initializing angles list."); + control->error_ptr->one(FLERR,"Problem in initializing angles list."); } (*lists+THREE_BODIES)->error_ptr = system->error_ptr; @@ -215,7 +214,7 @@ int Init_Lists( LAMMPS *lmp, reax_system *system, control_params *control, return SUCCESS; } -void Initialize( LAMMPS *lmp, reax_system *system, control_params *control, +void Initialize( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data, MPI_Comm comm ) @@ -228,46 +227,46 @@ void Initialize( LAMMPS *lmp, reax_system *system, control_params *control, snprintf(errmsg, 128, "Could not create datatypes on thread %d", system->my_rank); - lmp->error->one(FLERR,errmsg); + control->error_ptr->one(FLERR,errmsg); } if (Init_System(system, control, msg) == FAILURE) { snprintf(errmsg, 128, "System could not be initialized on thread %d", system->my_rank); - lmp->error->one(FLERR,errmsg); + control->error_ptr->one(FLERR,errmsg); } if (Init_Simulation_Data( system, control, data, msg ) == FAILURE) { snprintf(errmsg, 128, "Sim_data could not be initialized on thread %d", system->my_rank); - lmp->error->one(FLERR,errmsg); + control->error_ptr->one(FLERR,errmsg); } - if (Init_Workspace( lmp, system, control, workspace, mpi_data->world, msg ) == + if (Init_Workspace( system, control, workspace, mpi_data->world, msg ) == FAILURE) { snprintf(errmsg, 128, "Workspace could not be initialized on thread %d", system->my_rank); - lmp->error->one(FLERR,errmsg); + control->error_ptr->one(FLERR,errmsg); } - if (Init_Lists( lmp, system, control, data, workspace, lists, mpi_data, msg ) == + if (Init_Lists( system, control, data, workspace, lists, mpi_data, msg ) == FAILURE) { snprintf(errmsg, 128, "System could not be initialized on thread %d", system->my_rank); - lmp->error->one(FLERR,errmsg); + control->error_ptr->one(FLERR,errmsg); } - if (Init_Output_Files(lmp, system,control,out_control,mpi_data,msg)== FAILURE) { + if (Init_Output_Files(system,control,out_control,mpi_data,msg)== FAILURE) { snprintf(errmsg, 128, "Could not open output files on thread %d", system->my_rank); - lmp->error->one(FLERR,errmsg); + control->error_ptr->one(FLERR,errmsg); } if (control->tabulate) { - if (Init_Lookup_Tables( lmp, system, control, workspace, mpi_data, msg ) == FAILURE) { + if (Init_Lookup_Tables( system, control, workspace, mpi_data, msg ) == FAILURE) { snprintf(errmsg, 128, "Lookup table could not be created on thread %d", system->my_rank); - lmp->error->one(FLERR,errmsg); + control->error_ptr->one(FLERR,errmsg); } } diff --git a/src/USER-REAXC/reaxc_init_md.h b/src/USER-REAXC/reaxc_init_md.h index 2baa70245b..546a9e33c9 100644 --- a/src/USER-REAXC/reaxc_init_md.h +++ b/src/USER-REAXC/reaxc_init_md.h @@ -32,6 +32,6 @@ #include "lammps.h" #include "error.h" -void Initialize( LAMMPS_NS::LAMMPS *lmp, reax_system*, control_params*, simulation_data*, storage*, +void Initialize( reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*, mpi_datatypes*, MPI_Comm ); #endif diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index aa7e7fcea7..f71fcbec8e 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -34,7 +34,7 @@ #include "reaxc_traj.h" #include "reaxc_vector.h" -int Init_Output_Files( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, +int Init_Output_Files( reax_system *system, control_params *control, output_controls *out_control, mpi_datatypes *mpi_data, char *msg ) { @@ -42,7 +42,7 @@ int Init_Output_Files( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_para int ret; if (out_control->write_steps > 0) { - ret = Init_Traj( lmp, system, control, out_control, mpi_data, msg ); + ret = Init_Traj( system, control, out_control, mpi_data, msg ); if (ret == FAILURE) return ret; } @@ -107,7 +107,7 @@ int Close_Output_Files( reax_system *system, control_params *control, } -void Output_Results( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, +void Output_Results( reax_system *system, control_params *control, simulation_data *data, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data ) { @@ -146,7 +146,7 @@ void Output_Results( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params /* write current frame */ if( out_control->write_steps > 0 && (data->step-data->prev_steps) % out_control->write_steps == 0 ) { - Append_Frame( lmp, system, control, data, lists, out_control, mpi_data ); + Append_Frame( system, control, data, lists, out_control, mpi_data ); } } diff --git a/src/USER-REAXC/reaxc_io_tools.h b/src/USER-REAXC/reaxc_io_tools.h index 80202d5c83..a3f22fccc2 100644 --- a/src/USER-REAXC/reaxc_io_tools.h +++ b/src/USER-REAXC/reaxc_io_tools.h @@ -29,10 +29,10 @@ #include "reaxc_types.h" -int Init_Output_Files( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, +int Init_Output_Files( reax_system*, control_params*, output_controls*, mpi_datatypes*, char* ); int Close_Output_Files( reax_system*, control_params*, output_controls*, mpi_datatypes* ); -void Output_Results( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, simulation_data*, +void Output_Results( reax_system*, control_params*, simulation_data*, reax_list**, output_controls*, mpi_datatypes* ); #endif diff --git a/src/USER-REAXC/reaxc_lookup.cpp b/src/USER-REAXC/reaxc_lookup.cpp index c16ca9af52..b140b0cadf 100644 --- a/src/USER-REAXC/reaxc_lookup.cpp +++ b/src/USER-REAXC/reaxc_lookup.cpp @@ -50,7 +50,7 @@ void Tridiagonal_Solve( const double *a, const double *b, } -void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const double *f, +void Natural_Cubic_Spline( LAMMPS_NS::Error* error_ptr, const double *h, const double *f, cubic_spline_coef *coef, unsigned int n, MPI_Comm comm ) { @@ -58,11 +58,11 @@ void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const double double *a, *b, *c, *d, *v; /* allocate space for the linear system */ - a = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); - b = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); - c = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); - d = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); - v = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); /* build the linear system */ a[0] = a[1] = a[n-1] = 0; @@ -92,16 +92,16 @@ void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const double coef[i-1].a = f[i]; } - sfree(lmp->error, a, "cubic_spline:a" ); - sfree(lmp->error, b, "cubic_spline:b" ); - sfree(lmp->error, c, "cubic_spline:c" ); - sfree(lmp->error, d, "cubic_spline:d" ); - sfree(lmp->error, v, "cubic_spline:v" ); + sfree(error_ptr, a, "cubic_spline:a" ); + sfree(error_ptr, b, "cubic_spline:b" ); + sfree(error_ptr, c, "cubic_spline:c" ); + sfree(error_ptr, d, "cubic_spline:d" ); + sfree(error_ptr, v, "cubic_spline:v" ); } -void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const double *f, double v0, double vlast, +void Complete_Cubic_Spline( LAMMPS_NS::Error* error_ptr, const double *h, const double *f, double v0, double vlast, cubic_spline_coef *coef, unsigned int n, MPI_Comm comm ) { @@ -109,11 +109,11 @@ void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const doubl double *a, *b, *c, *d, *v; /* allocate space for the linear system */ - a = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); - b = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); - c = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); - d = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); - v = (double*) smalloc(lmp->error, n * sizeof(double), "cubic_spline:a", comm ); + a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); /* build the linear system */ a[0] = 0; @@ -142,15 +142,15 @@ void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS* lmp, const double *h, const doubl coef[i-1].a = f[i]; } - sfree(lmp->error, a, "cubic_spline:a" ); - sfree(lmp->error, b, "cubic_spline:b" ); - sfree(lmp->error, c, "cubic_spline:c" ); - sfree(lmp->error, d, "cubic_spline:d" ); - sfree(lmp->error, v, "cubic_spline:v" ); + sfree(error_ptr, a, "cubic_spline:a" ); + sfree(error_ptr, b, "cubic_spline:b" ); + sfree(error_ptr, c, "cubic_spline:c" ); + sfree(error_ptr, d, "cubic_spline:d" ); + sfree(error_ptr, v, "cubic_spline:v" ); } -int Init_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, +int Init_Lookup_Tables( reax_system *system, control_params *control, storage *workspace, mpi_datatypes *mpi_data, char * /*msg*/ ) { int i, j, r; @@ -171,23 +171,23 @@ int Init_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_par num_atom_types = system->reax_param.num_atom_types; dr = control->nonb_cut / control->tabulate; h = (double*) - smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:h", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:h", comm ); fh = (double*) - smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fh", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fh", comm ); fvdw = (double*) - smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fvdw", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fvdw", comm ); fCEvd = (double*) - smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fCEvd", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEvd", comm ); fele = (double*) - smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fele", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fele", comm ); fCEclmb = (double*) - smalloc(lmp->error, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb", comm ); LR = (LR_lookup_table**) - scalloc(lmp->error, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR", comm ); + scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR", comm ); for( i = 0; i < num_atom_types; ++i ) LR[i] = (LR_lookup_table*) - scalloc(lmp->error, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]", comm ); + scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]", comm ); for( i = 0; i < MAX_ATOM_TYPES; ++i ) existing_types[i] = 0; @@ -207,21 +207,21 @@ int Init_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_par LR[i][j].dx = dr; LR[i][j].inv_dx = control->tabulate / control->nonb_cut; LR[i][j].y = (LR_data*) - smalloc(lmp->error, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y", comm ); + smalloc(system->error_ptr, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y", comm ); LR[i][j].H = (cubic_spline_coef*) - smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H" , + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H" , comm ); LR[i][j].vdW = (cubic_spline_coef*) - smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW", + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW", comm); LR[i][j].CEvd = (cubic_spline_coef*) - smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd", + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd", comm); LR[i][j].ele = (cubic_spline_coef*) - smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele", + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele", comm ); LR[i][j].CEclmb = (cubic_spline_coef*) - smalloc(lmp->error, LR[i][j].n*sizeof(cubic_spline_coef), + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef), "lookup:LR[i,j].CEclmb", comm ); for( r = 1; r <= control->tabulate; ++r ) { @@ -246,22 +246,22 @@ int Init_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_par vlast_vdw = fCEvd[r-1]; vlast_ele = fele[r-1]; - Natural_Cubic_Spline( lmp, &h[1], &fh[1], + Natural_Cubic_Spline( control->error_ptr, &h[1], &fh[1], &(LR[i][j].H[1]), control->tabulate+1, comm ); - Complete_Cubic_Spline( lmp, &h[1], &fvdw[1], v0_vdw, vlast_vdw, + Complete_Cubic_Spline( control->error_ptr, &h[1], &fvdw[1], v0_vdw, vlast_vdw, &(LR[i][j].vdW[1]), control->tabulate+1, comm ); - Natural_Cubic_Spline( lmp, &h[1], &fCEvd[1], + Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEvd[1], &(LR[i][j].CEvd[1]), control->tabulate+1, comm ); - Complete_Cubic_Spline( lmp, &h[1], &fele[1], v0_ele, vlast_ele, + Complete_Cubic_Spline( control->error_ptr, &h[1], &fele[1], v0_ele, vlast_ele, &(LR[i][j].ele[1]), control->tabulate+1, comm ); - Natural_Cubic_Spline( lmp, &h[1], &fCEclmb[1], + Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEclmb[1], &(LR[i][j].CEclmb[1]), control->tabulate+1, comm ); } else { @@ -281,7 +281,7 @@ int Init_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_par } -void Deallocate_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system ) +void Deallocate_Lookup_Tables( reax_system *system ) { int i, j; int ntypes; @@ -291,14 +291,14 @@ void Deallocate_Lookup_Tables( LAMMPS_NS::LAMMPS* lmp, reax_system *system ) for( i = 0; i < ntypes; ++i ) { for( j = i; j < ntypes; ++j ) if (LR[i][j].n) { - sfree(lmp->error, LR[i][j].y, "LR[i,j].y" ); - sfree(lmp->error, LR[i][j].H, "LR[i,j].H" ); - sfree(lmp->error, LR[i][j].vdW, "LR[i,j].vdW" ); - sfree(lmp->error, LR[i][j].CEvd, "LR[i,j].CEvd" ); - sfree(lmp->error, LR[i][j].ele, "LR[i,j].ele" ); - sfree(lmp->error, LR[i][j].CEclmb, "LR[i,j].CEclmb" ); + sfree(system->error_ptr, LR[i][j].y, "LR[i,j].y" ); + sfree(system->error_ptr, LR[i][j].H, "LR[i,j].H" ); + sfree(system->error_ptr, LR[i][j].vdW, "LR[i,j].vdW" ); + sfree(system->error_ptr, LR[i][j].CEvd, "LR[i,j].CEvd" ); + sfree(system->error_ptr, LR[i][j].ele, "LR[i,j].ele" ); + sfree(system->error_ptr, LR[i][j].CEclmb, "LR[i,j].CEclmb" ); } - sfree(lmp->error, LR[i], "LR[i]" ); + sfree(system->error_ptr, LR[i], "LR[i]" ); } - sfree(lmp->error, LR, "LR" ); + sfree(system->error_ptr, LR, "LR" ); } diff --git a/src/USER-REAXC/reaxc_lookup.h b/src/USER-REAXC/reaxc_lookup.h index 2d33ad82de..9b1b14a34d 100644 --- a/src/USER-REAXC/reaxc_lookup.h +++ b/src/USER-REAXC/reaxc_lookup.h @@ -40,9 +40,9 @@ void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS*, const double *h, const double *f cubic_spline_coef *coef, unsigned int n, MPI_Comm comm ); -int Init_Lookup_Tables( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, storage*, +int Init_Lookup_Tables( reax_system*, control_params*, storage*, mpi_datatypes*, char* ); -void Deallocate_Lookup_Tables( LAMMPS_NS::LAMMPS*, reax_system* ); +void Deallocate_Lookup_Tables( reax_system* ); #endif diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index ee2939d662..d3b9e799d2 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -29,7 +29,7 @@ #include "reaxc_list.h" #include "reaxc_tool_box.h" -int Reallocate_Output_Buffer( LAMMPS_NS::LAMMPS *lmp, output_controls *out_control, int req_space, +int Reallocate_Output_Buffer( LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space, MPI_Comm comm ) { if (out_control->buffer_len > 0) @@ -40,7 +40,7 @@ int Reallocate_Output_Buffer( LAMMPS_NS::LAMMPS *lmp, output_controls *out_contr if (out_control->buffer == NULL) { char errmsg[256]; snprintf(errmsg, 256, "Insufficient memory for required buffer size %d", (int) (req_space*SAFE_ZONE)); - lmp->error->one(FLERR,errmsg); + error_ptr->one(FLERR,errmsg); } return SUCCESS; @@ -56,7 +56,7 @@ void Write_Skip_Line( output_controls *out_control, mpi_datatypes * /*mpi_data*/ } -int Write_Header( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, +int Write_Header( reax_system *system, control_params *control, output_controls *out_control, mpi_datatypes *mpi_data ) { int num_hdr_lines, my_hdr_lines, buffer_req; @@ -82,7 +82,7 @@ int Write_Header( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *c my_hdr_lines = num_hdr_lines * ( system->my_rank == MASTER_NODE ); buffer_req = my_hdr_lines * HEADER_LINE_LEN; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( control->error_ptr, out_control, buffer_req, mpi_data->world ); /* only the master node writes into trajectory header */ if (system->my_rank == MASTER_NODE) { @@ -258,7 +258,7 @@ int Write_Header( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *c } -int Write_Init_Desc( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params * /*control*/, +int Write_Init_Desc( reax_system *system, control_params * /*control*/, output_controls *out_control, mpi_datatypes *mpi_data ) { int i, me, np, cnt, buffer_len, buffer_req; @@ -277,7 +277,7 @@ int Write_Init_Desc( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params else buffer_req = system->n * INIT_DESC_LEN + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req, mpi_data->world ); out_control->line[0] = 0; out_control->buffer[0] = 0; @@ -310,7 +310,7 @@ int Write_Init_Desc( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params } -int Init_Traj( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, +int Init_Traj( reax_system *system, control_params *control, output_controls *out_control, mpi_datatypes *mpi_data, char *msg ) { @@ -347,14 +347,14 @@ int Init_Traj( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *cont strcpy( msg, "init_traj: unknown trajectory option" ); return FAILURE; } - Write_Header( lmp, system, control, out_control, mpi_data ); - Write_Init_Desc( lmp, system, control, out_control, mpi_data ); + Write_Header( system, control, out_control, mpi_data ); + Write_Init_Desc( system, control, out_control, mpi_data ); return SUCCESS; } -int Write_Frame_Header( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params *control, +int Write_Frame_Header( reax_system *system, control_params *control, simulation_data *data, output_controls *out_control, mpi_datatypes *mpi_data ) { @@ -366,7 +366,7 @@ int Write_Frame_Header( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_par my_frm_hdr_lines = num_frm_hdr_lines * ( me == MASTER_NODE ); buffer_req = my_frm_hdr_lines * HEADER_LINE_LEN; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( control->error_ptr, out_control, buffer_req, mpi_data->world ); /* only the master node writes into trajectory header */ if (me == MASTER_NODE) { @@ -480,7 +480,7 @@ int Write_Frame_Header( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_par -int Write_Atoms( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params * /*control*/, +int Write_Atoms( reax_system *system, control_params * /*control*/, output_controls *out_control, mpi_datatypes *mpi_data ) { int i, me, np, line_len, buffer_len, buffer_req, cnt; @@ -499,7 +499,7 @@ int Write_Atoms( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params * / else buffer_req = system->n * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req, mpi_data->world ); /* fill in buffer */ out_control->line[0] = 0; @@ -530,7 +530,7 @@ int Write_Atoms( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params * / p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q ); break; default: - lmp->error->all(FLERR,"Write_traj_atoms: unknown atom trajectory format"); + system->error_ptr->all(FLERR,"Write_traj_atoms: unknown atom trajectory format"); } strncpy( out_control->buffer + i*line_len, out_control->line, line_len+1 ); @@ -556,7 +556,7 @@ int Write_Atoms( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params * / } -int Write_Bonds( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, reax_list *bonds, +int Write_Bonds( reax_system *system, control_params *control, reax_list *bonds, output_controls *out_control, mpi_datatypes *mpi_data) { int i, j, pj, me, np; @@ -589,7 +589,7 @@ int Write_Bonds( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *co else buffer_req = my_bonds * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req, mpi_data->world ); /* fill in the buffer */ out_control->line[0] = 0; @@ -616,7 +616,7 @@ int Write_Bonds( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *co bo_ij->bo_data.BO_pi, bo_ij->bo_data.BO_pi2 ); break; default: - lmp->error->all(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); + system->error_ptr->all(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); } strncpy( out_control->buffer + my_bonds*line_len, out_control->line, line_len+1 ); @@ -645,7 +645,7 @@ int Write_Bonds( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *co } -int Write_Angles( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, +int Write_Angles( reax_system *system, control_params *control, reax_list *bonds, reax_list *thb_intrs, output_controls *out_control, mpi_datatypes *mpi_data ) { @@ -689,7 +689,7 @@ int Write_Angles( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *c else buffer_req = my_angles * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( lmp, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req, mpi_data->world ); /* fill in the buffer */ my_angles = 0; @@ -740,20 +740,20 @@ int Write_Angles( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *c } -int Append_Frame( LAMMPS_NS::LAMMPS* lmp, reax_system *system, control_params *control, +int Append_Frame( reax_system *system, control_params *control, simulation_data *data, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data ) { - Write_Frame_Header( lmp, system, control, data, out_control, mpi_data ); + Write_Frame_Header( system, control, data, out_control, mpi_data ); if (out_control->write_atoms) - Write_Atoms( lmp, system, control, out_control, mpi_data ); + Write_Atoms( system, control, out_control, mpi_data ); if (out_control->write_bonds) - Write_Bonds( lmp, system, control, (*lists + BONDS), out_control, mpi_data ); + Write_Bonds( system, control, (*lists + BONDS), out_control, mpi_data ); if (out_control->write_angles) - Write_Angles( lmp, system, control, (*lists + BONDS), (*lists + THREE_BODIES), + Write_Angles( system, control, (*lists + BONDS), (*lists + THREE_BODIES), out_control, mpi_data ); return SUCCESS; diff --git a/src/USER-REAXC/reaxc_traj.h b/src/USER-REAXC/reaxc_traj.h index 5508d27cdb..72c56637eb 100644 --- a/src/USER-REAXC/reaxc_traj.h +++ b/src/USER-REAXC/reaxc_traj.h @@ -73,11 +73,11 @@ enum BOND_LINE_OPTS { OPT_NOBOND, OPT_BOND_BASIC, OPT_BOND_FULL, NR_OPT_BOND }; enum ANGLE_LINE_OPTS { OPT_NOANGLE, OPT_ANGLE_BASIC, NR_OPT_ANGLE }; -int Init_Traj( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, output_controls*, +int Init_Traj( reax_system*, control_params*, output_controls*, mpi_datatypes*, char* ); int End_Traj( int, output_controls* ); -int Append_Frame( LAMMPS_NS::LAMMPS*, reax_system*, control_params*, simulation_data*, +int Append_Frame( reax_system*, control_params*, simulation_data*, reax_list**, output_controls*, mpi_datatypes* ); #endif From 83e458af0bb552c94b0aa1e48132cdcbca23aa8b Mon Sep 17 00:00:00 2001 From: mkanski Date: Mon, 25 Mar 2019 15:22:20 +0100 Subject: [PATCH 0301/1242] Cleaning changes 2 --- src/USER-REAXC/pair_reaxc.cpp | 4 ++-- src/USER-REAXC/reaxc_bond_orders.cpp | 3 +-- src/USER-REAXC/reaxc_bond_orders.h | 2 +- src/USER-REAXC/reaxc_bonds.cpp | 2 +- src/USER-REAXC/reaxc_bonds.h | 2 +- src/USER-REAXC/reaxc_forces.cpp | 18 +++++++++--------- src/USER-REAXC/reaxc_forces.h | 2 +- src/USER-REAXC/reaxc_hydrogen_bonds.cpp | 2 +- src/USER-REAXC/reaxc_hydrogen_bonds.h | 2 +- src/USER-REAXC/reaxc_multi_body.cpp | 2 +- src/USER-REAXC/reaxc_multi_body.h | 2 +- src/USER-REAXC/reaxc_reset_tools.cpp | 11 +++++------ src/USER-REAXC/reaxc_reset_tools.h | 8 ++------ src/USER-REAXC/reaxc_torsion_angles.cpp | 3 +-- src/USER-REAXC/reaxc_torsion_angles.h | 3 +-- src/USER-REAXC/reaxc_traj.cpp | 2 +- src/USER-REAXC/reaxc_types.h | 4 ++-- src/USER-REAXC/reaxc_valence_angles.cpp | 4 ++-- src/USER-REAXC/reaxc_valence_angles.h | 2 +- 19 files changed, 35 insertions(+), 43 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index b1f7799cb2..a9501dac9d 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -521,7 +521,7 @@ void PairReaxC::compute(int eflag, int vflag) setup(); - Reset( lmp, system, control, data, workspace, &lists, world ); + Reset( system, control, data, workspace, &lists, world ); workspace->realloc.num_far = write_reax_lists(); // timing for filling in the reax lists if (comm->me == 0) { @@ -531,7 +531,7 @@ void PairReaxC::compute(int eflag, int vflag) // forces - Compute_Forces(lmp, system,control,data,workspace,&lists,out_control,mpi_data); + Compute_Forces(system,control,data,workspace,&lists,out_control,mpi_data); read_reax_forces(vflag); for(int k = 0; k < system->N; ++k) { diff --git a/src/USER-REAXC/reaxc_bond_orders.cpp b/src/USER-REAXC/reaxc_bond_orders.cpp index 924be8809d..1ed58a0bfd 100644 --- a/src/USER-REAXC/reaxc_bond_orders.cpp +++ b/src/USER-REAXC/reaxc_bond_orders.cpp @@ -360,8 +360,7 @@ int BOp( storage *workspace, reax_list *bonds, double bo_cut, void BO( reax_system *system, control_params * /*control*/, simulation_data * /*data*/, - storage *workspace, reax_list **lists, output_controls * /*out_control*/, - LAMMPS_NS::LAMMPS* lmp ) + storage *workspace, reax_list **lists, output_controls * /*out_control*/ ) { int i, j, pj, type_i, type_j; int start_i, end_i, sym_index; diff --git a/src/USER-REAXC/reaxc_bond_orders.h b/src/USER-REAXC/reaxc_bond_orders.h index 8de60ba2f2..3631d90c89 100644 --- a/src/USER-REAXC/reaxc_bond_orders.h +++ b/src/USER-REAXC/reaxc_bond_orders.h @@ -42,5 +42,5 @@ void Add_dBond_to_Forces_NPT( int, int, simulation_data*, int BOp(storage*, reax_list*, double, int, int, far_neighbor_data*, single_body_parameters*, single_body_parameters*, two_body_parameters*); void BO( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL ); + storage*, reax_list**, output_controls* ); #endif diff --git a/src/USER-REAXC/reaxc_bonds.cpp b/src/USER-REAXC/reaxc_bonds.cpp index d5ac4f1ed4..48fb872324 100644 --- a/src/USER-REAXC/reaxc_bonds.cpp +++ b/src/USER-REAXC/reaxc_bonds.cpp @@ -33,7 +33,7 @@ void Bonds( reax_system *system, control_params * /*control*/, simulation_data *data, storage *workspace, reax_list **lists, - output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* lmp ) + output_controls * /*out_control*/ ) { int i, j, pj, natoms; int start_i, end_i; diff --git a/src/USER-REAXC/reaxc_bonds.h b/src/USER-REAXC/reaxc_bonds.h index b425598b42..a4a1fb0b44 100644 --- a/src/USER-REAXC/reaxc_bonds.h +++ b/src/USER-REAXC/reaxc_bonds.h @@ -30,5 +30,5 @@ #include "reaxc_types.h" void Bonds( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL ); + storage*, reax_list**, output_controls* ); #endif diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index 4adec04f0c..ff1dd839fb 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -44,7 +44,7 @@ interaction_function Interaction_Functions[NUM_INTRS]; void Dummy_Interaction( reax_system * /*system*/, control_params * /*control*/, simulation_data * /*data*/, storage * /*workspace*/, - reax_list ** /*lists*/, output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* = NULL ) + reax_list ** /*lists*/, output_controls * /*out_control*/ ) { } @@ -76,7 +76,7 @@ void Compute_Bonded_Forces( reax_system *system, control_params *control, /* Implement all force calls as function pointers */ for( i = 0; i < NUM_INTRS; i++ ) { (Interaction_Functions[i])( system, control, data, workspace, - lists, out_control, NULL ); + lists, out_control ); } } @@ -115,7 +115,7 @@ void Compute_Total_Force( reax_system *system, control_params *control, } -void Validate_Lists( LAMMPS_NS::LAMMPS *lmp, reax_system *system, storage * /*workspace*/, reax_list **lists, +void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **lists, int step, int /*n*/, int N, int numH, MPI_Comm comm ) { int i, comp, Hindex; @@ -138,7 +138,7 @@ void Validate_Lists( LAMMPS_NS::LAMMPS *lmp, reax_system *system, storage * /*wo char errmsg[256]; snprintf(errmsg, 256, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", step, i, End_Index(i,bonds), comp ); - lmp->error->all(FLERR,errmsg); + system->error_ptr->all(FLERR,errmsg); } } } @@ -166,7 +166,7 @@ void Validate_Lists( LAMMPS_NS::LAMMPS *lmp, reax_system *system, storage * /*wo char errmsg[256]; snprintf(errmsg, 256, "step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", step, Hindex, End_Index(Hindex,hbonds), comp ); - lmp->error->all(FLERR, errmsg); + system->error_ptr->all(FLERR, errmsg); } } } @@ -174,7 +174,7 @@ void Validate_Lists( LAMMPS_NS::LAMMPS *lmp, reax_system *system, storage * /*wo } -void Init_Forces_noQEq( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params *control, +void Init_Forces_noQEq( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls * /*out_control*/, MPI_Comm comm ) { @@ -310,7 +310,7 @@ void Init_Forces_noQEq( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_par workspace->realloc.num_bonds = num_bonds; workspace->realloc.num_hbonds = num_hbonds; - Validate_Lists( lmp, system, workspace, lists, data->step, + Validate_Lists( system, workspace, lists, data->step, system->n, system->N, system->numH, comm ); } @@ -434,14 +434,14 @@ void Estimate_Storages( reax_system *system, control_params *control, } -void Compute_Forces( LAMMPS_NS::LAMMPS *lmp, reax_system *system, control_params *control, +void Compute_Forces( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data ) { MPI_Comm comm = mpi_data->world; - Init_Forces_noQEq( lmp, system, control, data, workspace, + Init_Forces_noQEq( system, control, data, workspace, lists, out_control, comm ); /********* bonded interactions ************/ diff --git a/src/USER-REAXC/reaxc_forces.h b/src/USER-REAXC/reaxc_forces.h index 31cfc03a6b..6c839a7023 100644 --- a/src/USER-REAXC/reaxc_forces.h +++ b/src/USER-REAXC/reaxc_forces.h @@ -33,7 +33,7 @@ extern interaction_function Interaction_Functions[NUM_INTRS]; void Init_Force_Functions( control_params* ); -void Compute_Forces( LAMMPS_NS::LAMMPS *lmp, reax_system*, control_params*, simulation_data*, +void Compute_Forces( reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*, mpi_datatypes* ); void Estimate_Storages( reax_system*, control_params*, reax_list**, int*, int*, int*, int*, MPI_Comm ); diff --git a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp index 489a43cfc1..be34df7571 100644 --- a/src/USER-REAXC/reaxc_hydrogen_bonds.cpp +++ b/src/USER-REAXC/reaxc_hydrogen_bonds.cpp @@ -33,7 +33,7 @@ void Hydrogen_Bonds( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* lmp ) + reax_list **lists, output_controls * /*out_control*/ ) { int i, j, k, pi, pk; int type_i, type_j, type_k; diff --git a/src/USER-REAXC/reaxc_hydrogen_bonds.h b/src/USER-REAXC/reaxc_hydrogen_bonds.h index 2a448439ea..04d3d26d5c 100644 --- a/src/USER-REAXC/reaxc_hydrogen_bonds.h +++ b/src/USER-REAXC/reaxc_hydrogen_bonds.h @@ -30,6 +30,6 @@ #include "reaxc_types.h" void Hydrogen_Bonds( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL ); + storage*, reax_list**, output_controls* ); #endif diff --git a/src/USER-REAXC/reaxc_multi_body.cpp b/src/USER-REAXC/reaxc_multi_body.cpp index a16c4eb42b..f7d72a2678 100644 --- a/src/USER-REAXC/reaxc_multi_body.cpp +++ b/src/USER-REAXC/reaxc_multi_body.cpp @@ -32,7 +32,7 @@ void Atom_Energy( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, - output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* lmp ) + output_controls * /*out_control*/ ) { int i, j, pj, type_i, type_j; double Delta_lpcorr, dfvl; diff --git a/src/USER-REAXC/reaxc_multi_body.h b/src/USER-REAXC/reaxc_multi_body.h index dc2c1040eb..a17c9f484e 100644 --- a/src/USER-REAXC/reaxc_multi_body.h +++ b/src/USER-REAXC/reaxc_multi_body.h @@ -30,6 +30,6 @@ #include "reaxc_types.h" void Atom_Energy( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL ); + storage*, reax_list**, output_controls* ); #endif diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index 49a9f096dd..d273a417f8 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -30,7 +30,6 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" -using namespace LAMMPS_NS; void Reset_Atoms( reax_system* system, control_params *control ) { @@ -121,7 +120,7 @@ void Reset_Workspace( reax_system *system, storage *workspace ) } -void Reset_Neighbor_Lists( LAMMPS *lmp, reax_system *system, control_params *control, +void Reset_Neighbor_Lists( reax_system *system, control_params *control, storage *workspace, reax_list **lists, MPI_Comm comm ) { @@ -147,7 +146,7 @@ void Reset_Neighbor_Lists( LAMMPS *lmp, reax_system *system, control_params *con char errmsg[256]; snprintf(errmsg, 256, "p%d: not enough space for bonds! total=%d allocated=%d\n", system->my_rank, total_bonds, bonds->num_intrs); - lmp->error->one(FLERR, errmsg); + control->error_ptr->one(FLERR, errmsg); } } } @@ -173,14 +172,14 @@ void Reset_Neighbor_Lists( LAMMPS *lmp, reax_system *system, control_params *con char errmsg[256]; snprintf(errmsg, 256, "p%d: not enough space for hbonds! total=%d allocated=%d\n", system->my_rank, total_hbonds, hbonds->num_intrs); - lmp->error->one(FLERR, errmsg); + control->error_ptr->one(FLERR, errmsg); } } } } -void Reset( LAMMPS *lmp, reax_system *system, control_params *control, simulation_data *data, +void Reset( reax_system *system, control_params *control, simulation_data *data, storage *workspace, reax_list **lists, MPI_Comm comm ) { Reset_Atoms( system, control ); @@ -189,6 +188,6 @@ void Reset( LAMMPS *lmp, reax_system *system, control_params *control, simulatio Reset_Workspace( system, workspace ); - Reset_Neighbor_Lists( lmp, system, control, workspace, lists, comm ); + Reset_Neighbor_Lists( system, control, workspace, lists, comm ); } diff --git a/src/USER-REAXC/reaxc_reset_tools.h b/src/USER-REAXC/reaxc_reset_tools.h index 9e2b9de980..c2a90072d5 100644 --- a/src/USER-REAXC/reaxc_reset_tools.h +++ b/src/USER-REAXC/reaxc_reset_tools.h @@ -29,16 +29,12 @@ #include "reaxc_types.h" -#include "lammps.h" -#include "error.h" -using namespace LAMMPS_NS; - void Reset_Pressures( simulation_data* ); void Reset_Simulation_Data( simulation_data*, int ); void Reset_Timing( reax_timing* ); void Reset_Workspace( reax_system*, storage* ); -void Reset_Neighbor_Lists( LAMMPS *lmp, reax_system*, control_params*, storage*, +void Reset_Neighbor_Lists( reax_system*, control_params*, storage*, reax_list**, MPI_Comm ); -void Reset( LAMMPS *lmp, reax_system*, control_params*, simulation_data*, storage*, +void Reset( reax_system*, control_params*, simulation_data*, storage*, reax_list**, MPI_Comm ); #endif diff --git a/src/USER-REAXC/reaxc_torsion_angles.cpp b/src/USER-REAXC/reaxc_torsion_angles.cpp index 50c3412928..ed76368d68 100644 --- a/src/USER-REAXC/reaxc_torsion_angles.cpp +++ b/src/USER-REAXC/reaxc_torsion_angles.cpp @@ -120,8 +120,7 @@ double Calculate_Omega( rvec dvec_ij, double r_ij, void Torsion_Angles( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls *out_control, - LAMMPS_NS::LAMMPS* lmp ) + reax_list **lists, output_controls *out_control ) { int i, j, k, l, pi, pj, pk, pl, pij, plk, natoms; int type_i, type_j, type_k, type_l; diff --git a/src/USER-REAXC/reaxc_torsion_angles.h b/src/USER-REAXC/reaxc_torsion_angles.h index 38236cb7dc..755e8c6532 100644 --- a/src/USER-REAXC/reaxc_torsion_angles.h +++ b/src/USER-REAXC/reaxc_torsion_angles.h @@ -30,7 +30,6 @@ #include "reaxc_types.h" void Torsion_Angles( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*, - LAMMPS_NS::LAMMPS* = NULL ); + storage*, reax_list**, output_controls* ); #endif diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index d3b9e799d2..90f3d1e668 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -556,7 +556,7 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, } -int Write_Bonds( reax_system *system, control_params *control, reax_list *bonds, +int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, output_controls *out_control, mpi_datatypes *mpi_data) { int i, j, pj, me, np; diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index b7845a0510..310ef42bdf 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -906,9 +906,9 @@ typedef void (*evolve_function)(reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*, mpi_datatypes* ); -typedef void (*interaction_function) ( reax_system*, control_params*, +typedef void (*interaction_function) (reax_system*, control_params*, simulation_data*, storage*, - reax_list**, output_controls*, LAMMPS_NS::LAMMPS*); + reax_list**, output_controls*); typedef void (*print_interaction)(reax_system*, control_params*, simulation_data*, storage*, diff --git a/src/USER-REAXC/reaxc_valence_angles.cpp b/src/USER-REAXC/reaxc_valence_angles.cpp index d762dc1611..e0e94d18f8 100644 --- a/src/USER-REAXC/reaxc_valence_angles.cpp +++ b/src/USER-REAXC/reaxc_valence_angles.cpp @@ -76,7 +76,7 @@ void Calculate_dCos_Theta( rvec dvec_ji, double d_ji, rvec dvec_jk, double d_jk, void Valence_Angles( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/, LAMMPS_NS::LAMMPS* lmp) + reax_list **lists, output_controls * /*out_control*/ ) { int i, j, pi, k, pk, t; int type_i, type_j, type_k; @@ -408,7 +408,7 @@ void Valence_Angles( reax_system *system, control_params *control, char errmsg[128]; snprintf(errmsg, 128, "step%d-ran out of space on angle_list: top=%d, max=%d", data->step, num_thb_intrs, thb_intrs->num_intrs); - lmp->error->one(FLERR, errmsg); + control->error_ptr->one(FLERR, errmsg); } } diff --git a/src/USER-REAXC/reaxc_valence_angles.h b/src/USER-REAXC/reaxc_valence_angles.h index 27bda3ba09..51eac5a95e 100644 --- a/src/USER-REAXC/reaxc_valence_angles.h +++ b/src/USER-REAXC/reaxc_valence_angles.h @@ -30,7 +30,7 @@ #include "reaxc_types.h" void Valence_Angles( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*, LAMMPS_NS::LAMMPS* = NULL); + storage*, reax_list**, output_controls*); void Calculate_Theta( rvec, double, rvec, double, double*, double* ); From b2a7205abe96f328b7e08e756bac3df6b48176c0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 11:31:23 -0400 Subject: [PATCH 0302/1242] 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 a89a2de9d4a9912aaa5f50feed6e2e020c5cfee4 Mon Sep 17 00:00:00 2001 From: mkanski Date: Mon, 25 Mar 2019 16:45:59 +0100 Subject: [PATCH 0303/1242] Removed unnecessary MPI_comm --- src/USER-REAXC/pair_reaxc.cpp | 16 +-- src/USER-REAXC/reaxc_allocate.cpp | 159 +++++++++++++------------- src/USER-REAXC/reaxc_allocate.h | 11 +- src/USER-REAXC/reaxc_control.cpp | 1 - src/USER-REAXC/reaxc_control.h | 3 - src/USER-REAXC/reaxc_ffield.cpp | 57 ++++----- src/USER-REAXC/reaxc_forces.cpp | 12 +- src/USER-REAXC/reaxc_forces.h | 2 +- src/USER-REAXC/reaxc_init_md.cpp | 20 ++-- src/USER-REAXC/reaxc_init_md.h | 2 - src/USER-REAXC/reaxc_list.cpp | 22 ++-- src/USER-REAXC/reaxc_list.h | 4 +- src/USER-REAXC/reaxc_lookup.cpp | 74 +++++------- src/USER-REAXC/reaxc_lookup.h | 6 +- src/USER-REAXC/reaxc_reset_tools.cpp | 15 ++- src/USER-REAXC/reaxc_reset_tools.h | 4 +- src/USER-REAXC/reaxc_tool_box.cpp | 4 +- src/USER-REAXC/reaxc_tool_box.h | 4 +- src/USER-REAXC/reaxc_traj.cpp | 15 ++- src/USER-REAXC/reaxc_valence_angles.h | 2 +- 20 files changed, 192 insertions(+), 241 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index a9501dac9d..8b36019881 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -141,10 +141,10 @@ PairReaxC::~PairReaxC() if (control->tabulate ) Deallocate_Lookup_Tables( system); - if (control->hbond_cut > 0 ) Delete_List( lists+HBONDS, world); - Delete_List( lists+BONDS, world ); - Delete_List( lists+THREE_BODIES, world ); - Delete_List( lists+FAR_NBRS, world ); + if (control->hbond_cut > 0 ) Delete_List( lists+HBONDS ); + Delete_List( lists+BONDS ); + Delete_List( lists+THREE_BODIES ); + Delete_List( lists+FAR_NBRS ); DeAllocate_Workspace( control, workspace ); DeAllocate_System( system ); @@ -439,12 +439,12 @@ void PairReaxC::setup( ) // initialize my data structures - PreAllocate_Space( system, control, workspace, world ); + PreAllocate_Space( system, control, workspace ); write_reax_atoms(); int num_nbrs = estimate_reax_lists(); if(!Make_List(system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, - lists+FAR_NBRS, world)) + lists+FAR_NBRS)) error->one(FLERR,"Pair reax/c problem in far neighbor list"); (lists+FAR_NBRS)->error_ptr=lmp->error; @@ -469,7 +469,7 @@ void PairReaxC::setup( ) // check if I need to shrink/extend my data-structs - ReAllocate( system, control, data, workspace, &lists, mpi_data ); + ReAllocate( system, control, data, workspace, &lists ); } bigint local_ngroup = list->inum; @@ -521,7 +521,7 @@ void PairReaxC::compute(int eflag, int vflag) setup(); - Reset( system, control, data, workspace, &lists, world ); + Reset( system, control, data, workspace, &lists ); workspace->realloc.num_far = write_reax_lists(); // timing for filling in the reax lists if (comm->me == 0) { diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 8784c854b5..7649c110ef 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -44,7 +44,7 @@ using namespace LAMMPS_NS; process's box throughout the whole simulation. therefore we need to make upper bound estimates for various data structures */ int PreAllocate_Space( reax_system *system, control_params * /*control*/, - storage * workspace, MPI_Comm comm ) + storage * workspace ) { int mincap = system->mincap; double safezone = system->safezone; @@ -55,7 +55,7 @@ int PreAllocate_Space( reax_system *system, control_params * /*control*/, system->total_cap = MAX( (int)(system->N * safezone), mincap ); system->my_atoms = (reax_atom*) - scalloc(system->error_ptr, system->total_cap, sizeof(reax_atom), "my_atoms", comm ); + scalloc(system->error_ptr, system->total_cap, sizeof(reax_atom), "my_atoms"); // Nullify some arrays only used in omp styles // Should be safe to do here since called in pair->setup(); @@ -212,7 +212,7 @@ void DeAllocate_Workspace( control_params * control, storage *workspace ) int Allocate_Workspace( reax_system * /*system*/, control_params * control, storage *workspace, int local_cap, int total_cap, - MPI_Comm comm, char * /*msg*/ ) + char * /*msg*/ ) { int i, total_real, total_rvec, local_rvec; @@ -224,84 +224,84 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, /* communication storage */ for( i = 0; i < MAX_NBRS; ++i ) { workspace->tmp_dbl[i] = (double*) - scalloc(control->error_ptr, total_cap, sizeof(double), "tmp_dbl", comm ); + scalloc(control->error_ptr, total_cap, sizeof(double), "tmp_dbl"); workspace->tmp_rvec[i] = (rvec*) - scalloc(control->error_ptr, total_cap, sizeof(rvec), "tmp_rvec", comm ); + scalloc(control->error_ptr, total_cap, sizeof(rvec), "tmp_rvec"); workspace->tmp_rvec2[i] = (rvec2*) - scalloc(control->error_ptr, total_cap, sizeof(rvec2), "tmp_rvec2", comm ); + scalloc(control->error_ptr, total_cap, sizeof(rvec2), "tmp_rvec2"); } /* bond order related storage */ workspace->within_bond_box = (int*) - scalloc(control->error_ptr, total_cap, sizeof(int), "skin", comm ); - workspace->total_bond_order = (double*) smalloc(control->error_ptr, total_real, "total_bo", comm ); - workspace->Deltap = (double*) smalloc(control->error_ptr, total_real, "Deltap", comm ); - workspace->Deltap_boc = (double*) smalloc(control->error_ptr, total_real, "Deltap_boc", comm ); - workspace->dDeltap_self = (rvec*) smalloc(control->error_ptr, total_rvec, "dDeltap_self", comm ); - workspace->Delta = (double*) smalloc(control->error_ptr, total_real, "Delta", comm ); - workspace->Delta_lp = (double*) smalloc(control->error_ptr, total_real, "Delta_lp", comm ); + scalloc(control->error_ptr, total_cap, sizeof(int), "skin"); + workspace->total_bond_order = (double*) smalloc(control->error_ptr, total_real, "total_bo"); + workspace->Deltap = (double*) smalloc(control->error_ptr, total_real, "Deltap"); + workspace->Deltap_boc = (double*) smalloc(control->error_ptr, total_real, "Deltap_boc"); + workspace->dDeltap_self = (rvec*) smalloc(control->error_ptr, total_rvec, "dDeltap_self"); + workspace->Delta = (double*) smalloc(control->error_ptr, total_real, "Delta"); + workspace->Delta_lp = (double*) smalloc(control->error_ptr, total_real, "Delta_lp"); workspace->Delta_lp_temp = (double*) - smalloc(control->error_ptr, total_real, "Delta_lp_temp", comm ); - workspace->dDelta_lp = (double*) smalloc(control->error_ptr, total_real, "dDelta_lp", comm ); + smalloc(control->error_ptr, total_real, "Delta_lp_temp"); + workspace->dDelta_lp = (double*) smalloc(control->error_ptr, total_real, "dDelta_lp"); workspace->dDelta_lp_temp = (double*) - smalloc(control->error_ptr, total_real, "dDelta_lp_temp", comm ); - workspace->Delta_e = (double*) smalloc(control->error_ptr, total_real, "Delta_e", comm ); - workspace->Delta_boc = (double*) smalloc(control->error_ptr, total_real, "Delta_boc", comm ); - workspace->Delta_val = (double*) smalloc(control->error_ptr, total_real, "Delta_val", comm ); - workspace->nlp = (double*) smalloc(control->error_ptr, total_real, "nlp", comm ); - workspace->nlp_temp = (double*) smalloc(control->error_ptr, total_real, "nlp_temp", comm ); - workspace->Clp = (double*) smalloc(control->error_ptr, total_real, "Clp", comm ); - workspace->vlpex = (double*) smalloc(control->error_ptr, total_real, "vlpex", comm ); + smalloc(control->error_ptr, total_real, "dDelta_lp_temp"); + workspace->Delta_e = (double*) smalloc(control->error_ptr, total_real, "Delta_e"); + workspace->Delta_boc = (double*) smalloc(control->error_ptr, total_real, "Delta_boc"); + workspace->Delta_val = (double*) smalloc(control->error_ptr, total_real, "Delta_val"); + workspace->nlp = (double*) smalloc(control->error_ptr, total_real, "nlp"); + workspace->nlp_temp = (double*) smalloc(control->error_ptr, total_real, "nlp_temp"); + workspace->Clp = (double*) smalloc(control->error_ptr, total_real, "Clp"); + workspace->vlpex = (double*) smalloc(control->error_ptr, total_real, "vlpex"); workspace->bond_mark = (int*) - scalloc(control->error_ptr, total_cap, sizeof(int), "bond_mark", comm ); + scalloc(control->error_ptr, total_cap, sizeof(int), "bond_mark"); workspace->done_after = (int*) - scalloc(control->error_ptr, total_cap, sizeof(int), "done_after", comm ); + scalloc(control->error_ptr, total_cap, sizeof(int), "done_after"); /* QEq storage */ workspace->Hdia_inv = (double*) - scalloc(control->error_ptr, total_cap, sizeof(double), "Hdia_inv", comm ); - workspace->b_s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_s", comm ); - workspace->b_t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_t", comm ); - workspace->b_prc = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prc", comm ); - workspace->b_prm = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prm", comm ); - workspace->s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "s", comm ); - workspace->t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "t", comm ); + scalloc(control->error_ptr, total_cap, sizeof(double), "Hdia_inv"); + workspace->b_s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_s"); + workspace->b_t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_t"); + workspace->b_prc = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prc"); + workspace->b_prm = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "b_prm"); + workspace->s = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "s"); + workspace->t = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "t"); workspace->droptol = (double*) - scalloc(control->error_ptr, total_cap, sizeof(double), "droptol", comm ); - workspace->b = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "b", comm ); - workspace->x = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "x", comm ); + scalloc(control->error_ptr, total_cap, sizeof(double), "droptol"); + workspace->b = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "b"); + workspace->x = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "x"); /* GMRES storage */ - workspace->y = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "y", comm ); - workspace->z = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "z", comm ); - workspace->g = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "g", comm ); - workspace->h = (double**) scalloc(control->error_ptr, RESTART+1, sizeof(double*), "h", comm ); - workspace->hs = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "hs", comm ); - workspace->hc = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "hc", comm ); - workspace->v = (double**) scalloc(control->error_ptr, RESTART+1, sizeof(double*), "v", comm ); + workspace->y = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "y"); + workspace->z = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "z"); + workspace->g = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "g"); + workspace->h = (double**) scalloc(control->error_ptr, RESTART+1, sizeof(double*), "h"); + workspace->hs = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "hs"); + workspace->hc = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "hc"); + workspace->v = (double**) scalloc(control->error_ptr, RESTART+1, sizeof(double*), "v"); for( i = 0; i < RESTART+1; ++i ) { - workspace->h[i] = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "h[i]", comm ); - workspace->v[i] = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "v[i]", comm ); + workspace->h[i] = (double*) scalloc(control->error_ptr, RESTART+1, sizeof(double), "h[i]"); + workspace->v[i] = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "v[i]"); } /* CG storage */ - workspace->r = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "r", comm ); - workspace->d = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "d", comm ); - workspace->q = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "q", comm ); - workspace->p = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "p", comm ); - workspace->r2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "r2", comm ); - workspace->d2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "d2", comm ); - workspace->q2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "q2", comm ); - workspace->p2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "p2", comm ); + workspace->r = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "r"); + workspace->d = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "d"); + workspace->q = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "q"); + workspace->p = (double*) scalloc(control->error_ptr, total_cap, sizeof(double), "p"); + workspace->r2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "r2"); + workspace->d2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "d2"); + workspace->q2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "q2"); + workspace->p2 = (rvec2*) scalloc(control->error_ptr, total_cap, sizeof(rvec2), "p2"); /* integrator storage */ - workspace->v_const = (rvec*) smalloc(control->error_ptr, local_rvec, "v_const", comm ); + workspace->v_const = (rvec*) smalloc(control->error_ptr, local_rvec, "v_const"); /* force related storage */ - workspace->f = (rvec*) scalloc(control->error_ptr, total_cap, sizeof(rvec), "f", comm ); + workspace->f = (rvec*) scalloc(control->error_ptr, total_cap, sizeof(rvec), "f"); workspace->CdDelta = (double*) - scalloc(control->error_ptr, total_cap, sizeof(double), "CdDelta", comm ); + scalloc(control->error_ptr, total_cap, sizeof(double), "CdDelta"); // storage for reductions with multiple threads #ifdef LMP_USER_OMP @@ -322,17 +322,16 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, static void Reallocate_Neighbor_List( reax_list *far_nbrs, int n, - int num_intrs, MPI_Comm comm ) + int num_intrs ) { - Delete_List( far_nbrs, comm ); - if(!Make_List( n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs, comm )){ + Delete_List( far_nbrs); + if(!Make_List( n, num_intrs, TYP_FAR_NEIGHBOR, far_nbrs )){ far_nbrs->error_ptr->one(FLERR,"Problem in initializing far neighbors list"); } } -static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds, - MPI_Comm comm ) +static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds ) { int i, total_hbonds; @@ -346,8 +345,8 @@ static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds, } total_hbonds = (int)(MAX( total_hbonds*saferzone, mincap*MIN_HBONDS )); - Delete_List( hbonds, comm ); - if (!Make_List( system->Hcap, total_hbonds, TYP_HBOND, hbonds, comm )) { + Delete_List( hbonds); + if (!Make_List( system->Hcap, total_hbonds, TYP_HBOND, hbonds )) { hbonds->error_ptr->one(FLERR, "Not enough space for hydrogen bonds list"); } @@ -356,8 +355,7 @@ static int Reallocate_HBonds_List( reax_system *system, reax_list *hbonds, static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, - int *total_bonds, int *est_3body, - MPI_Comm comm ) + int *total_bonds, int *est_3body ) { int i; @@ -378,8 +376,8 @@ static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, sfree(system->error_ptr, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); #endif - Delete_List( bonds, comm ); - if(!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds, comm)) { + Delete_List( bonds); + if(!Make_List(system->total_cap, *total_bonds, TYP_BOND, bonds)) { bonds->error_ptr->one(FLERR, "Not enough space for bonds list"); } @@ -401,14 +399,12 @@ static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, void ReAllocate( reax_system *system, control_params *control, - simulation_data *data, storage *workspace, reax_list **lists, - mpi_datatypes *mpi_data ) + simulation_data *data, storage *workspace, reax_list **lists ) { int num_bonds, est_3body, Hflag, ret; int renbr, newsize; reallocate_data *realloc; reax_list *far_nbrs; - MPI_Comm comm; char msg[200]; int mincap = system->mincap; @@ -416,7 +412,6 @@ void ReAllocate( reax_system *system, control_params *control, double saferzone = system->saferzone; realloc = &(workspace->realloc); - comm = mpi_data->world; if( system->n >= DANGER_ZONE * system->local_cap || (0 && system->n <= LOOSE_ZONE * system->local_cap) ) { @@ -434,18 +429,18 @@ void ReAllocate( reax_system *system, control_params *control, /* system */ ret = Allocate_System( system, system->local_cap, system->total_cap, msg ); if (ret != SUCCESS) { - char errmsg[128]; - snprintf(errmsg, 128, "Not enough space for atom_list: total_cap=%d", system->total_cap); + char errmsg[256]; + snprintf(errmsg, 256, "Not enough space for atom_list: total_cap=%d", system->total_cap); system->error_ptr->one(FLERR, errmsg); } /* workspace */ DeAllocate_Workspace( control, workspace ); ret = Allocate_Workspace( system, control, workspace, system->local_cap, - system->total_cap, comm, msg ); + system->total_cap, msg ); if (ret != SUCCESS) { - char errmsg[128]; - snprintf(errmsg, 128, "Not enough space for workspace: local_cap=%d total_cap=%d", system->local_cap, system->total_cap); + char errmsg[256]; + snprintf(errmsg, 256, "Not enough space for workspace: local_cap=%d total_cap=%d", system->local_cap, system->total_cap); system->error_ptr->one(FLERR, errmsg); } } @@ -458,15 +453,15 @@ void ReAllocate( reax_system *system, control_params *control, if (Nflag || realloc->num_far >= far_nbrs->num_intrs * DANGER_ZONE) { if (realloc->num_far > far_nbrs->num_intrs) { - char errmsg[128]; - snprintf(errmsg, 128, "step%d-ran out of space on far_nbrs: top=%d, max=%d", data->step, realloc->num_far, far_nbrs->num_intrs); + char errmsg[256]; + snprintf(errmsg, 256, "step%d-ran out of space on far_nbrs: top=%d, max=%d", data->step, realloc->num_far, far_nbrs->num_intrs); system->error_ptr->one(FLERR, errmsg); } newsize = static_cast (MAX( realloc->num_far*safezone, mincap*MIN_NBRS )); - Reallocate_Neighbor_List( far_nbrs, system->total_cap, newsize, comm ); + Reallocate_Neighbor_List( far_nbrs, system->total_cap, newsize); realloc->num_far = 0; } } @@ -481,7 +476,7 @@ void ReAllocate( reax_system *system, control_params *control, } if (Hflag || realloc->hbonds) { - ret = Reallocate_HBonds_List( system, (*lists)+HBONDS, comm ); + ret = Reallocate_HBonds_List( system, (*lists)+HBONDS); realloc->hbonds = 0; } } @@ -490,14 +485,14 @@ void ReAllocate( reax_system *system, control_params *control, num_bonds = est_3body = -1; if (Nflag || realloc->bonds) { Reallocate_Bonds_List( system, (*lists)+BONDS, &num_bonds, - &est_3body, comm ); + &est_3body); realloc->bonds = 0; realloc->num_3body = MAX( realloc->num_3body, est_3body ) * 2; } /* 3-body list */ if (realloc->num_3body > 0) { - Delete_List( (*lists)+THREE_BODIES, comm ); + Delete_List( (*lists)+THREE_BODIES); if (num_bonds == -1) num_bonds = ((*lists)+BONDS)->num_intrs; @@ -505,7 +500,7 @@ void ReAllocate( reax_system *system, control_params *control, realloc->num_3body = (int)(MAX(realloc->num_3body*safezone, MIN_3BODIES)); if( !Make_List( num_bonds, realloc->num_3body, TYP_THREE_BODY, - (*lists)+THREE_BODIES, comm ) ) { + (*lists)+THREE_BODIES ) ) { system->error_ptr->one(FLERR, "Problem in initializing angles list"); } realloc->num_3body = -1; diff --git a/src/USER-REAXC/reaxc_allocate.h b/src/USER-REAXC/reaxc_allocate.h index f813204006..be203340f6 100644 --- a/src/USER-REAXC/reaxc_allocate.h +++ b/src/USER-REAXC/reaxc_allocate.h @@ -28,20 +28,15 @@ #define __ALLOCATE_H_ #include "reaxc_types.h" - -#include "lammps.h" -#include "error.h" -using namespace LAMMPS_NS; - -int PreAllocate_Space( reax_system*, control_params*, storage*, MPI_Comm ); +int PreAllocate_Space( reax_system*, control_params*, storage* ); int Allocate_System( reax_system*, int, int, char* ); void DeAllocate_System( reax_system* ); int Allocate_Workspace( reax_system*, control_params*, storage*, - int, int, MPI_Comm, char* ); + int, int, char* ); void DeAllocate_Workspace( control_params*, storage* ); void ReAllocate( reax_system*, control_params*, simulation_data*, storage*, - reax_list**, mpi_datatypes* ); + reax_list** ); #endif diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index 14b28615fb..0caae40156 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -28,7 +28,6 @@ #include "reaxc_control.h" #include "reaxc_tool_box.h" - char Read_Control_File( char *control_file, control_params* control, output_controls *out_control ) { diff --git a/src/USER-REAXC/reaxc_control.h b/src/USER-REAXC/reaxc_control.h index 47627aed61..b2b455d6b8 100644 --- a/src/USER-REAXC/reaxc_control.h +++ b/src/USER-REAXC/reaxc_control.h @@ -29,9 +29,6 @@ #include "reaxc_types.h" -#include "lammps.h" -#include "error.h" - char Read_Control_File( char*, control_params*, output_controls* ); #endif diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 987a11d252..28bc0429cc 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -44,7 +44,6 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, double val; MPI_Comm comm; int me; - comm = MPI_COMM_WORLD; MPI_Comm_rank(comm, &me); @@ -99,55 +98,45 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Allocating structures in reax_interaction */ reax->sbp = (single_body_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(single_body_parameters), "sbp", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(single_body_parameters), "sbp"); reax->tbp = (two_body_parameters**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters*), "tbp", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters*), "tbp"); reax->thbp= (three_body_header***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header**), "thbp", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header**), "thbp"); reax->hbp = (hbond_parameters***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters**), "hbp", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters**), "hbp"); reax->fbp = (four_body_header****) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header***), "fbp", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header***), "fbp"); tor_flag = (char****) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char***), "tor_flag", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char***), "tor_flag"); for( i = 0; i < reax->num_atom_types; i++ ) { reax->tbp[i] = (two_body_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(two_body_parameters), "tbp[i]"); reax->thbp[i]= (three_body_header**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header*), "thbp[i]"); reax->hbp[i] = (hbond_parameters**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters*), "hbp[i]"); reax->fbp[i] = (four_body_header***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header**), "fbp[i]"); tor_flag[i] = (char***) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char**), "tor_flag[i]", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char**), "tor_flag[i]"); for( j = 0; j < reax->num_atom_types; j++ ) { reax->thbp[i][j]= (three_body_header*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(three_body_header), "thbp[i,j]"); reax->hbp[i][j] = (hbond_parameters*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(hbond_parameters), "hbp[i,j]"); reax->fbp[i][j] = (four_body_header**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header*), "fbp[i,j]"); tor_flag[i][j] = (char**) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]", comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char*), "tor_flag[i,j]"); for (k=0; k < reax->num_atom_types; k++) { reax->fbp[i][j][k] = (four_body_header*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(four_body_header), "fbp[i,j,k]"); tor_flag[i][j][k] = (char*) - scalloc(control->error_ptr, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]", - comm ); + scalloc(control->error_ptr, reax->num_atom_types, sizeof(char), "tor_flag[i,j,k]"); } } } @@ -163,7 +152,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity checks */ if (c < 9) { - control->error_ptr->one(FLERR,"Inconsistent ffield file"); + control->error_ptr->all(FLERR,"Inconsistent ffield file"); } for( j = 0; j < (int)(strlen(tmp[0])); ++j ) @@ -185,7 +174,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - control->error_ptr->one(FLERR,"Inconsistent ffield file"); + control->error_ptr->all(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].alpha = val; @@ -203,7 +192,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - control->error_ptr->one(FLERR,"Inconsistent ffield file"); + control->error_ptr->all(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].r_pi_pi = val; @@ -221,7 +210,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - control->error_ptr->one(FLERR,"Inconsistent ffield file"); + control->error_ptr->all(FLERR,"Inconsistent ffield file"); } val = atof(tmp[0]); reax->sbp[i].p_ovun2 = val; @@ -240,7 +229,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c > 2) { - control->error_ptr->one(FLERR,"Force field file incompatible with 'lgvdw yes'"); + control->error_ptr->all(FLERR,"Force field file incompatible with 'lgvdw yes'"); } val = atof(tmp[0]); reax->sbp[i].lgcij = val; @@ -337,8 +326,6 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, fgets(s,MAX_LINE,fp); c=Tokenize(s,&tmp); - - j = atoi(tmp[0]) - 1; k = atoi(tmp[1]) - 1; diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index ff1dd839fb..afe9a059ed 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -116,7 +116,7 @@ void Compute_Total_Force( reax_system *system, control_params *control, } void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **lists, - int step, int /*n*/, int N, int numH, MPI_Comm comm ) + int step, int /*n*/, int N, int numH ) { int i, comp, Hindex; reax_list *bonds, *hbonds; @@ -176,8 +176,7 @@ void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **l void Init_Forces_noQEq( reax_system *system, control_params *control, simulation_data *data, storage *workspace, - reax_list **lists, output_controls * /*out_control*/, - MPI_Comm comm ) { + reax_list **lists, output_controls * /*out_control*/ ) { int i, j, pj; int start_i, end_i; int type_i, type_j; @@ -311,13 +310,13 @@ void Init_Forces_noQEq( reax_system *system, control_params *control, workspace->realloc.num_hbonds = num_hbonds; Validate_Lists( system, workspace, lists, data->step, - system->n, system->N, system->numH, comm ); + system->n, system->N, system->numH); } void Estimate_Storages( reax_system *system, control_params *control, reax_list **lists, int *Htop, int *hb_top, - int *bond_top, int *num_3body, MPI_Comm /*comm*/ ) + int *bond_top, int *num_3body ) { int i, j, pj; int start_i, end_i; @@ -439,10 +438,9 @@ void Compute_Forces( reax_system *system, control_params *control, reax_list **lists, output_controls *out_control, mpi_datatypes *mpi_data ) { - MPI_Comm comm = mpi_data->world; Init_Forces_noQEq( system, control, data, workspace, - lists, out_control, comm ); + lists, out_control); /********* bonded interactions ************/ Compute_Bonded_Forces( system, control, data, workspace, diff --git a/src/USER-REAXC/reaxc_forces.h b/src/USER-REAXC/reaxc_forces.h index 6c839a7023..bfad2e9b71 100644 --- a/src/USER-REAXC/reaxc_forces.h +++ b/src/USER-REAXC/reaxc_forces.h @@ -36,5 +36,5 @@ void Init_Force_Functions( control_params* ); void Compute_Forces( reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*, mpi_datatypes* ); void Estimate_Storages( reax_system*, control_params*, reax_list**, - int*, int*, int*, int*, MPI_Comm ); + int*, int*, int*, int* ); #endif diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 27e60c580c..913bc241de 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -81,7 +81,7 @@ int Init_Simulation_Data( reax_system *system, control_params *control, return SUCCESS; } -void Init_Taper( control_params *control, storage *workspace, MPI_Comm comm ) +void Init_Taper( control_params *control, storage *workspace ) { double d1, d7; double swa, swa2, swa3; @@ -122,12 +122,12 @@ void Init_Taper( control_params *control, storage *workspace, MPI_Comm comm ) int Init_Workspace( reax_system *system, control_params *control, - storage *workspace, MPI_Comm comm, char *msg ) + storage *workspace, char *msg ) { int ret; ret = Allocate_Workspace( system, control, workspace, - system->local_cap, system->total_cap, comm, msg ); + system->local_cap, system->total_cap, msg ); if (ret != SUCCESS) return ret; @@ -135,7 +135,7 @@ int Init_Workspace( reax_system *system, control_params *control, Reset_Workspace( system, workspace ); /* Initialize the Taper function */ - Init_Taper( control, workspace, comm ); + Init_Taper( control, workspace); return SUCCESS; } @@ -159,17 +159,15 @@ int Init_Lists( reax_system *system, control_params *control, { int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; int *hb_top, *bond_top; - MPI_Comm comm; int mincap = system->mincap; double safezone = system->safezone; double saferzone = system->saferzone; - comm = mpi_data->world; bond_top = (int*) calloc( system->total_cap, sizeof(int) ); hb_top = (int*) calloc( system->local_cap, sizeof(int) ); Estimate_Storages( system, control, lists, - &Htop, hb_top, bond_top, &num_3body, comm ); + &Htop, hb_top, bond_top, &num_3body); if (control->hbond_cut > 0) { /* init H indexes */ @@ -181,7 +179,7 @@ int Init_Lists( reax_system *system, control_params *control, total_hbonds = (int)(MAX( total_hbonds*saferzone, mincap*MIN_HBONDS )); if( !Make_List( system->Hcap, total_hbonds, TYP_HBOND, - *lists+HBONDS, comm ) ) { + *lists+HBONDS ) ) { control->error_ptr->one(FLERR, "Not enough space for hbonds list."); } (*lists+HBONDS)->error_ptr = system->error_ptr; @@ -195,7 +193,7 @@ int Init_Lists( reax_system *system, control_params *control, bond_cap = (int)(MAX( total_bonds*safezone, mincap*MIN_BONDS )); if( !Make_List( system->total_cap, bond_cap, TYP_BOND, - *lists+BONDS, comm ) ) { + *lists+BONDS ) ) { control->error_ptr->one(FLERR, "Not enough space for bonds list."); } (*lists+BONDS)->error_ptr = system->error_ptr; @@ -203,7 +201,7 @@ int Init_Lists( reax_system *system, control_params *control, /* 3bodies list */ cap_3body = (int)(MAX( num_3body*safezone, MIN_3BODIES )); if( !Make_List( bond_cap, cap_3body, TYP_THREE_BODY, - *lists+THREE_BODIES, comm ) ){ + *lists+THREE_BODIES ) ){ control->error_ptr->one(FLERR,"Problem in initializing angles list."); } (*lists+THREE_BODIES)->error_ptr = system->error_ptr; @@ -242,7 +240,7 @@ void Initialize( reax_system *system, control_params *control, control->error_ptr->one(FLERR,errmsg); } - if (Init_Workspace( system, control, workspace, mpi_data->world, msg ) == + if (Init_Workspace( system, control, workspace, msg ) == FAILURE) { snprintf(errmsg, 128, "Workspace could not be initialized on thread %d", system->my_rank); diff --git a/src/USER-REAXC/reaxc_init_md.h b/src/USER-REAXC/reaxc_init_md.h index 546a9e33c9..ab519a4c72 100644 --- a/src/USER-REAXC/reaxc_init_md.h +++ b/src/USER-REAXC/reaxc_init_md.h @@ -29,8 +29,6 @@ #include "reaxc_types.h" -#include "lammps.h" -#include "error.h" void Initialize( reax_system*, control_params*, simulation_data*, storage*, reax_list**, output_controls*, mpi_datatypes*, MPI_Comm ); diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index f103e520e8..d0143ec9ae 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -29,7 +29,7 @@ #include "reaxc_tool_box.h" /************* allocate list space ******************/ -int Make_List( int n, int num_intrs, int type, reax_list *l, MPI_Comm comm) +int Make_List(int n, int num_intrs, int type, reax_list *l ) { l->allocated = 1; @@ -38,52 +38,52 @@ int Make_List( int n, int num_intrs, int type, reax_list *l, MPI_Comm comm) if (l->index) sfree(l->error_ptr, l->index, "list:index"); if (l->end_index) sfree(l->error_ptr, l->end_index, "list:end_index"); - l->index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:index", comm ); - l->end_index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:end_index", comm ); + l->index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:index"); + l->end_index = (int*) smalloc(l->error_ptr, n * sizeof(int), "list:end_index"); l->type = type; switch(l->type) { case TYP_VOID: if (l->select.v) sfree(l->error_ptr, l->select.v, "list:v"); - l->select.v = (void*) smalloc(l->error_ptr, l->num_intrs * sizeof(void*), "list:v", comm); + l->select.v = (void*) smalloc(l->error_ptr, l->num_intrs * sizeof(void*), "list:v"); break; case TYP_THREE_BODY: if (l->select.three_body_list) sfree(l->error_ptr, l->select.three_body_list,"list:three_bodies"); l->select.three_body_list = (three_body_interaction_data*) smalloc(l->error_ptr, l->num_intrs * sizeof(three_body_interaction_data), - "list:three_bodies", comm ); + "list:three_bodies"); break; case TYP_BOND: if (l->select.bond_list) sfree(l->error_ptr, l->select.bond_list,"list:bonds"); l->select.bond_list = (bond_data*) - smalloc(l->error_ptr, l->num_intrs * sizeof(bond_data), "list:bonds", comm ); + smalloc(l->error_ptr, l->num_intrs * sizeof(bond_data), "list:bonds"); break; case TYP_DBO: if (l->select.dbo_list) sfree(l->error_ptr, l->select.dbo_list,"list:dbonds"); l->select.dbo_list = (dbond_data*) - smalloc(l->error_ptr, l->num_intrs * sizeof(dbond_data), "list:dbonds", comm ); + smalloc(l->error_ptr, l->num_intrs * sizeof(dbond_data), "list:dbonds"); break; case TYP_DDELTA: if (l->select.dDelta_list) sfree(l->error_ptr, l->select.dDelta_list,"list:dDeltas"); l->select.dDelta_list = (dDelta_data*) - smalloc(l->error_ptr, l->num_intrs * sizeof(dDelta_data), "list:dDeltas", comm ); + smalloc(l->error_ptr, l->num_intrs * sizeof(dDelta_data), "list:dDeltas"); break; case TYP_FAR_NEIGHBOR: if (l->select.far_nbr_list) sfree(l->error_ptr, l->select.far_nbr_list,"list:far_nbrs"); l->select.far_nbr_list = (far_neighbor_data*) - smalloc(l->error_ptr, l->num_intrs * sizeof(far_neighbor_data), "list:far_nbrs", comm); + smalloc(l->error_ptr, l->num_intrs * sizeof(far_neighbor_data), "list:far_nbrs"); break; case TYP_HBOND: if (l->select.hbond_list) sfree(l->error_ptr, l->select.hbond_list,"list:hbonds"); l->select.hbond_list = (hbond_data*) - smalloc(l->error_ptr, l->num_intrs * sizeof(hbond_data), "list:hbonds", comm ); + smalloc(l->error_ptr, l->num_intrs * sizeof(hbond_data), "list:hbonds"); break; default: @@ -96,7 +96,7 @@ int Make_List( int n, int num_intrs, int type, reax_list *l, MPI_Comm comm) } -void Delete_List( reax_list *l, MPI_Comm comm ) +void Delete_List( reax_list *l ) { if (l->allocated == 0) return; diff --git a/src/USER-REAXC/reaxc_list.h b/src/USER-REAXC/reaxc_list.h index ab7fbce19c..28567252da 100644 --- a/src/USER-REAXC/reaxc_list.h +++ b/src/USER-REAXC/reaxc_list.h @@ -29,8 +29,8 @@ #include "reaxc_types.h" -int Make_List( int, int, int, reax_list*, MPI_Comm ); -void Delete_List( reax_list*, MPI_Comm ); +int Make_List( int, int, int, reax_list* ); +void Delete_List( reax_list* ); inline int Num_Entries(int,reax_list*); inline int Start_Index( int, reax_list* ); diff --git a/src/USER-REAXC/reaxc_lookup.cpp b/src/USER-REAXC/reaxc_lookup.cpp index b140b0cadf..74d8176522 100644 --- a/src/USER-REAXC/reaxc_lookup.cpp +++ b/src/USER-REAXC/reaxc_lookup.cpp @@ -51,18 +51,17 @@ void Tridiagonal_Solve( const double *a, const double *b, void Natural_Cubic_Spline( LAMMPS_NS::Error* error_ptr, const double *h, const double *f, - cubic_spline_coef *coef, unsigned int n, - MPI_Comm comm ) + cubic_spline_coef *coef, unsigned int n ) { int i; double *a, *b, *c, *d, *v; /* allocate space for the linear system */ - a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); - b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); - c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); - d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); - v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); /* build the linear system */ a[0] = a[1] = a[n-1] = 0; @@ -102,18 +101,17 @@ void Natural_Cubic_Spline( LAMMPS_NS::Error* error_ptr, const double *h, const d void Complete_Cubic_Spline( LAMMPS_NS::Error* error_ptr, const double *h, const double *f, double v0, double vlast, - cubic_spline_coef *coef, unsigned int n, - MPI_Comm comm ) + cubic_spline_coef *coef, unsigned int n ) { int i; double *a, *b, *c, *d, *v; /* allocate space for the linear system */ - a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); - b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); - c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); - d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); - v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a", comm ); + a = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + b = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + c = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + d = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); + v = (double*) smalloc(error_ptr, n * sizeof(double), "cubic_spline:a"); /* build the linear system */ a[0] = 0; @@ -159,35 +157,33 @@ int Init_Lookup_Tables( reax_system *system, control_params *control, double dr; double *h, *fh, *fvdw, *fele, *fCEvd, *fCEclmb; double v0_vdw, v0_ele, vlast_vdw, vlast_ele; - MPI_Comm comm; /* initializations */ v0_vdw = 0; v0_ele = 0; vlast_vdw = 0; vlast_ele = 0; - comm = mpi_data->world; num_atom_types = system->reax_param.num_atom_types; dr = control->nonb_cut / control->tabulate; h = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:h", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:h"); fh = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fh", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fh"); fvdw = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fvdw", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fvdw"); fCEvd = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEvd", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEvd"); fele = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fele", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fele"); fCEclmb = (double*) - smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb", comm ); + smalloc(system->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb"); LR = (LR_lookup_table**) - scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR", comm ); + scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table*), "lookup:LR"); for( i = 0; i < num_atom_types; ++i ) LR[i] = (LR_lookup_table*) - scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]", comm ); + scalloc(system->error_ptr, num_atom_types, sizeof(LR_lookup_table), "lookup:LR[i]"); for( i = 0; i < MAX_ATOM_TYPES; ++i ) existing_types[i] = 0; @@ -207,22 +203,18 @@ int Init_Lookup_Tables( reax_system *system, control_params *control, LR[i][j].dx = dr; LR[i][j].inv_dx = control->tabulate / control->nonb_cut; LR[i][j].y = (LR_data*) - smalloc(system->error_ptr, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y", comm ); + smalloc(system->error_ptr, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y"); LR[i][j].H = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H" , - comm ); + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H"); LR[i][j].vdW = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW", - comm); + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW"); LR[i][j].CEvd = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd", - comm); + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd"); LR[i][j].ele = (cubic_spline_coef*) - smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele", - comm ); + smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele"); LR[i][j].CEclmb = (cubic_spline_coef*) smalloc(system->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef), - "lookup:LR[i,j].CEclmb", comm ); + "lookup:LR[i,j].CEclmb"); for( r = 1; r <= control->tabulate; ++r ) { LR_vdW_Coulomb( system, workspace, control, i, j, r * dr, &(LR[i][j].y[r]) ); @@ -247,23 +239,19 @@ int Init_Lookup_Tables( reax_system *system, control_params *control, vlast_ele = fele[r-1]; Natural_Cubic_Spline( control->error_ptr, &h[1], &fh[1], - &(LR[i][j].H[1]), control->tabulate+1, comm ); + &(LR[i][j].H[1]), control->tabulate+1); Complete_Cubic_Spline( control->error_ptr, &h[1], &fvdw[1], v0_vdw, vlast_vdw, - &(LR[i][j].vdW[1]), control->tabulate+1, - comm ); + &(LR[i][j].vdW[1]), control->tabulate+1); Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEvd[1], - &(LR[i][j].CEvd[1]), control->tabulate+1, - comm ); + &(LR[i][j].CEvd[1]), control->tabulate+1); Complete_Cubic_Spline( control->error_ptr, &h[1], &fele[1], v0_ele, vlast_ele, - &(LR[i][j].ele[1]), control->tabulate+1, - comm ); + &(LR[i][j].ele[1]), control->tabulate+1); Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEclmb[1], - &(LR[i][j].CEclmb[1]), control->tabulate+1, - comm ); + &(LR[i][j].CEclmb[1]), control->tabulate+1); } else { LR[i][j].n = 0; } diff --git a/src/USER-REAXC/reaxc_lookup.h b/src/USER-REAXC/reaxc_lookup.h index 9b1b14a34d..6d6aae2f8e 100644 --- a/src/USER-REAXC/reaxc_lookup.h +++ b/src/USER-REAXC/reaxc_lookup.h @@ -33,12 +33,10 @@ void Tridiagonal_Solve( const double *a, const double *b, double *c, double *d, double *x, unsigned int n); void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS*, const double *h, const double *f, - cubic_spline_coef *coef, unsigned int n, - MPI_Comm comm ); + cubic_spline_coef *coef, unsigned int n ); void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS*, const double *h, const double *f, double v0, double vlast, - cubic_spline_coef *coef, unsigned int n, - MPI_Comm comm ); + cubic_spline_coef *coef, unsigned int n ); int Init_Lookup_Tables( reax_system*, control_params*, storage*, mpi_datatypes*, char* ); diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index d273a417f8..8954e344df 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -121,8 +121,7 @@ void Reset_Workspace( reax_system *system, storage *workspace ) void Reset_Neighbor_Lists( reax_system *system, control_params *control, - storage *workspace, reax_list **lists, - MPI_Comm comm ) + storage *workspace, reax_list **lists ) { int i, total_bonds, Hindex, total_hbonds; reax_list *bonds, *hbonds; @@ -144,8 +143,8 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, workspace->realloc.bonds = 1; if (total_bonds >= bonds->num_intrs) { char errmsg[256]; - snprintf(errmsg, 256, "p%d: not enough space for bonds! total=%d allocated=%d\n", - system->my_rank, total_bonds, bonds->num_intrs); + snprintf(errmsg, 256, "Not enough space for bonds! total=%d allocated=%d\n", + total_bonds, bonds->num_intrs); control->error_ptr->one(FLERR, errmsg); } } @@ -170,8 +169,8 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, workspace->realloc.hbonds = 1; if (total_hbonds >= hbonds->num_intrs) { char errmsg[256]; - snprintf(errmsg, 256, "p%d: not enough space for hbonds! total=%d allocated=%d\n", - system->my_rank, total_hbonds, hbonds->num_intrs); + snprintf(errmsg, 256, "Not enough space for hbonds! total=%d allocated=%d\n", + total_hbonds, hbonds->num_intrs); control->error_ptr->one(FLERR, errmsg); } } @@ -180,7 +179,7 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, void Reset( reax_system *system, control_params *control, simulation_data *data, - storage *workspace, reax_list **lists, MPI_Comm comm ) + storage *workspace, reax_list **lists ) { Reset_Atoms( system, control ); @@ -188,6 +187,6 @@ void Reset( reax_system *system, control_params *control, simulation_data *data, Reset_Workspace( system, workspace ); - Reset_Neighbor_Lists( system, control, workspace, lists, comm ); + Reset_Neighbor_Lists( system, control, workspace, lists ); } diff --git a/src/USER-REAXC/reaxc_reset_tools.h b/src/USER-REAXC/reaxc_reset_tools.h index c2a90072d5..20d1ab6964 100644 --- a/src/USER-REAXC/reaxc_reset_tools.h +++ b/src/USER-REAXC/reaxc_reset_tools.h @@ -34,7 +34,7 @@ void Reset_Simulation_Data( simulation_data*, int ); void Reset_Timing( reax_timing* ); void Reset_Workspace( reax_system*, storage* ); void Reset_Neighbor_Lists( reax_system*, control_params*, storage*, - reax_list**, MPI_Comm ); + reax_list** ); void Reset( reax_system*, control_params*, simulation_data*, storage*, - reax_list**, MPI_Comm ); + reax_list** ); #endif diff --git a/src/USER-REAXC/reaxc_tool_box.cpp b/src/USER-REAXC/reaxc_tool_box.cpp index cd339af556..05ebc34c1b 100644 --- a/src/USER-REAXC/reaxc_tool_box.cpp +++ b/src/USER-REAXC/reaxc_tool_box.cpp @@ -56,7 +56,7 @@ int Tokenize( char* s, char*** tok ) /* safe malloc */ -void *smalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name, MPI_Comm comm ) +void *smalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name ) { void *ptr; char errmsg[256]; @@ -79,7 +79,7 @@ void *smalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name, MPI_C /* safe calloc */ -void *scalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const char *name, MPI_Comm comm ) +void *scalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const char *name ) { void *ptr; char errmsg[256]; diff --git a/src/USER-REAXC/reaxc_tool_box.h b/src/USER-REAXC/reaxc_tool_box.h index 257ff1813f..0465376dba 100644 --- a/src/USER-REAXC/reaxc_tool_box.h +++ b/src/USER-REAXC/reaxc_tool_box.h @@ -37,7 +37,7 @@ double Get_Time( ); int Tokenize( char*, char*** ); /* from lammps */ -void *smalloc( LAMMPS_NS::Error*, rc_bigint, const char*, MPI_Comm ); -void *scalloc( LAMMPS_NS::Error*, rc_bigint, rc_bigint, const char*, MPI_Comm ); +void *smalloc( LAMMPS_NS::Error*, rc_bigint, const char* ); +void *scalloc( LAMMPS_NS::Error*, rc_bigint, rc_bigint, const char* ); void sfree( LAMMPS_NS::Error*, void*, const char* ); #endif diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 90f3d1e668..27bebb6327 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -29,8 +29,7 @@ #include "reaxc_list.h" #include "reaxc_tool_box.h" -int Reallocate_Output_Buffer( LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space, - MPI_Comm comm ) +int Reallocate_Output_Buffer( LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space ) { if (out_control->buffer_len > 0) free( out_control->buffer ); @@ -82,7 +81,7 @@ int Write_Header( reax_system *system, control_params *control, my_hdr_lines = num_hdr_lines * ( system->my_rank == MASTER_NODE ); buffer_req = my_hdr_lines * HEADER_LINE_LEN; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( control->error_ptr, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( control->error_ptr, out_control, buffer_req ); /* only the master node writes into trajectory header */ if (system->my_rank == MASTER_NODE) { @@ -277,7 +276,7 @@ int Write_Init_Desc( reax_system *system, control_params * /*control*/, else buffer_req = system->n * INIT_DESC_LEN + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req ); out_control->line[0] = 0; out_control->buffer[0] = 0; @@ -366,7 +365,7 @@ int Write_Frame_Header( reax_system *system, control_params *control, my_frm_hdr_lines = num_frm_hdr_lines * ( me == MASTER_NODE ); buffer_req = my_frm_hdr_lines * HEADER_LINE_LEN; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( control->error_ptr, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( control->error_ptr, out_control, buffer_req ); /* only the master node writes into trajectory header */ if (me == MASTER_NODE) { @@ -499,7 +498,7 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, else buffer_req = system->n * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req ); /* fill in buffer */ out_control->line[0] = 0; @@ -589,7 +588,7 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, else buffer_req = my_bonds * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req ); /* fill in the buffer */ out_control->line[0] = 0; @@ -689,7 +688,7 @@ int Write_Angles( reax_system *system, control_params *control, else buffer_req = my_angles * line_len + 1; if (buffer_req > out_control->buffer_len * DANGER_ZONE) - Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req, mpi_data->world ); + Reallocate_Output_Buffer( system->error_ptr, out_control, buffer_req ); /* fill in the buffer */ my_angles = 0; diff --git a/src/USER-REAXC/reaxc_valence_angles.h b/src/USER-REAXC/reaxc_valence_angles.h index 51eac5a95e..31936ba190 100644 --- a/src/USER-REAXC/reaxc_valence_angles.h +++ b/src/USER-REAXC/reaxc_valence_angles.h @@ -30,7 +30,7 @@ #include "reaxc_types.h" void Valence_Angles( reax_system*, control_params*, simulation_data*, - storage*, reax_list**, output_controls*); + storage*, reax_list**, output_controls* ); void Calculate_Theta( rvec, double, rvec, 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 0304/1242] 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 z$8pn>9F(spYtZSyT$U*DZDJ)uUo(KRZ+-1+0Ep06wkqlnYaJH*0l5fzme?4~YDG(@ zx*0p5dz?53G(3~k9kLt{v$8~K-ENqckRszt>d|dkjxK`gB_qh71o@-IU ziq)e$cXN%e^t5EWkNNn$DPHX7U14s*vnN)13#xYH|JJ9=b;k*MecB2#^We0CV?$VG zjAlSRiP{|>2Xdv)I;zBm{d+TcIO{)$C>w_;_C82=l%g;$+vF8~5dKx0uU**xM|P}^ z)Xu?XGmkA3PIMwIH$4YjKeg1#V^L%0owQlCGpfS7WOlH zc}R`Tc>ejdny`<>o&cuEuT}qBN;I+|866e{TDcZf9j@%ZzXEW5JbAE|qYWR%I-k!sRIzEJyl}&wOO^`X zVQ-uJzHAQ}Mnni_mx(Mnfo-aV&a_UUx#nFi*z-$#zmS=Ps8{XS|inDHhX*w3pd!k1q& z@k*bx6`UlbP0OJa##6_XQKQU|t@QKs`qO5M6^l=3jnzE8*9|qzrcWM%{Tl9&Q7Ebe z=0AB2Zl{|;l3;X^zK~xqs=7zL0%{^on!$`p)FPV{Tfnzy0wN7)zeJQREoj}N@`lp4 zl7(cZD6-?)1Ic3pZ`t$DfGlWwN(;PaGRE&sD%IAuA7LU zzf~$?#}11v>C?5Xscne!4^|DpRE8wTkv3|>W}xC;G!=`TI(LV{rW!6gX_YtXw2jV4 zF0=85yQ627z=zw4JBHsXw-NBl7lds47feSx{0&ROEU6C|;k)^CH-DndkPsfh$qh(O zP`Tu*UXd3MscXqUmjN!0j*T>~jmi4P!D+GkTyi|j!jkST|#A@9dhrY+I^&eEjTfWE;13Nk;we3T#WU1FmiUe}=+?z>wieP_qyJq}iQWSD}hb;p@|LNU-=*<7|86R*j@%@>! zHhVP5QXtiLedEu%-aT{a?#bZkopqX^82F$`?pP0e zHI-<4A2k)~yiA_*B+}md*^g_sE$riI*wB0eE!HU=8lC=WP2|B>E%(n=aCuXL8(jK- zWQH}7Z%YlmUDAM}xp$#K2py0pB);fV0x}}JCK*%C5tLt=(lyOqq}baGHXFz`+camc+*CvHtPv9s($mh3CU-0I{J?^C&Zpx)?DsiFG9Ll*Q=_?jR!^DDg zltd~8{1Fpv`=Jhc*%%hI;;I@QW>&VcPN1`wc6=7cEv9BX-u}o6E^mNo{uv+>^!H`M zaq(`=r?Yp!F!pvLzFhAayM-a@ zqlP;_=&h#0j&k5Q*d(DiYp{n9mJW2{LKtcH&G>q?7$x^8uv}d!=C5G1EV^??y1Llqqvhj1 zgJ;`1%Sm_OjmG$p>++lb)&DJ)c&OPg^zq*LukDk{0(y541X4Ud3+dEgcqylO!Dj0> z>i9-{>fhu3Q)aQHIHRNsEH-Q^LEwWdd<3Pr zi1ZJ&w-5_S51Q9&bcgofT_QnN)jE}yTiFqbA0Axkcl)#65p+HNJot_AFNmkh`*@h= zCf*@Vc9hX}emmt(bL`U%wirGSlYw3(bB`|vAf10DupeOa8LG`^c-^j~R8JulLOOTL zKhg6qB>mMka@&?9JycuDj#C#gF%*=@^mz^;PeLk9c~U5x7Uv|1PUNha;wZ6mkb+skdfT~1NL!$wC{eJVUb(7WD)~Qdb-mq{%s4uM2eVp~4X3 z@TfuY$&dQCtiA;vQYJDAX{z3Y z6jypb8+kfk?w+0ngj9R|^MzX`g2l)ku+gu2+1Bswef!wW(z)!!qkUFNbm_j9n()=j zQBmzPN*Q_Aso5A)Y!aT7!#w56!F2Eat>zpGls- zyGFzr-I)_4eGix)3&l5CHnci!2ywgFgfS5_UlP19sMz(xVqmRTRHW>(bq6BUecp0V zQ|V$fA%))N6;JIR%iJs*jx{nckOteVLqeU+^ORnfYv>y2SEp=j=tF#)1E38Fq&*MP z^YPF};7V#$!HM^u*wuUwy*Td}{3iSGG4SZdS>+hqu-9CTRzm7vc6mZT{H?LKw2sil zqyzmS$i)YIYi>uU+40U3L7zr0M_EH7LS~#KNz9|v(B((l7rm=e`c{q4PrGh}6HPIp z5*k)vHVas>ohe79WAAj-*xbnFi*%3gOQYqyUr2no5J;C&2C`VC4m@qbR{biac3`7Mz-#f#w~ueG{UXIRT1^IHj^v<%~Yrjfqc5 z?W}tvg1aWi<}D-Hf##>fTwq@AQ;oab7EdeIU(1m#Xg$**7mEL?G@as+)giEny4Dg< z(3E*=UtBWPd*CJ_a8{48S+s)w`8=UV0JX~k=D2Fp9Sd5=xByYA^IP$_j|L&-AoUd~ zt^$VA1f*q1?6nRvs98uyM`)2PY0@0pUS7U?E%^D$P)D#O7M3rKX586P=UM*hHN%d` z3$q|N+4DD`TXlFyx;NMH^GOCx8)cSORz9H)czx?gfsry$9_L>5!D7qdU;)%_pj`m2 z*B#0_3$3)3pGziZR#6H~8>N@(=H#W_j`^|Os9$RTV#8`db7dJeNBhE$i_prxpIwGq zbm^I^TGbEIokFbn_CtoO9`*NKy)i$itbha8%r6do)Y^T?JjjO{n}Bb~!3r{5qd{7> zDeh3R1xozunM;6W{seR_KC;6u5E7-HKlXenL>t7u;=qQ53!a;P1X;gML;t798BJag zDklF6%Ry+UtJ;ynvc7D|pQBSUJq9(rJ@y3F1#D}d4n*z5da=S2AR3j}xuw3M$nM%` z%TC(;BA=u*M)=w}&-Wj2UJC+G&MIe~miFfrNqchguN}HY^ah&#j_X{j^*Wu#Y2%GU z_{ol`2utI_=N@?~92+hAAtlhmko4?^hE_3~Ev#5O!3+^M7kx_ZNv4^`VtjXVou4OU z*JRc3%PFwrUAhYcpV5@d=&C>dspdxH0jCEvVYooY&O9<0x4j6LrW!6u1M( z5j-k@MFuwf+_7?YDGv3Pt6YY<8u9V@*RBW4;o&7?L6p%E4*ywJW(b@aP;+bF)DFz=K<_9zNG1f+(# z8$xfOrX@F>C)WGF{Gg;O?==jbQlsDDk?^40p0*(TZpdgDU~bV4xLZNSlhb#BdgLTUM^o~Oe4+|hJ7FQ1s`i8+6 zm#w^&B`WyFRR>36a}k?l{X9E5W@6-ML5+e;e$cZDk(-D^=;3ENLd9oLaoaMDc4znk zS)Ai}V7`IEvYFbw9eeSpu9<0I-c;br1iQ0xWanS1zyBkvyEH*FuNty}Er30iL}Upl zg{C%6o5NUr)OnzfJ2W5VeO`=XLhnN`FS4^u%R5n4dPs@M3rF`$yY0{+_i*tOhx?zeslig|+5|(yC{{;o5# z07h#qt48f3Z32E|!b)k<@T}GfF$Q?Dldl6QH$z#86g}+{O_RlA{A$kiw+8#-uhljS ztDvH4oV(e!HM4&WeVpCq1+ttt`Of(ixqRY7VI|99%<#U>CFpp)+BYNyNj~p$qU-2eH(gWUylA8)|GCQPRM;XF(%;waofABt&Uo`8cK@J z2sF+9{Oj>X2@bgte`5@_cv^gFW(er&vp5^JK9va2JPLq3p1DcLTC;jD6V7E z89w%4^$)VvKR~#geK?=WRu#u1V^1nMMK+ro@&_;H#B$`ZgX0>HB2DTOrRk9C<0usG zEqI*<-Yk8clt6>%%>43ZUvX{OWioq&AaEWdIQ}7Y0wQWN_bl0__qUGaAF^*QDrDT- zmzzl-y{auGSj1xcx9Pq32Dd*7jJL@eMpS{YT;Hql^9s!|-I*hjVa2~*#tPWFqzkvl z==;2r$jr7qRG3%_5z?uuI7y=MM}kfM4wu@zdf4PppY9ucB$qtG6sbb1MBZz$;{O?K zv}#CiKfhhui=-APNw)d1mYf>z>wsL*S?(t}0qSjuy@y#c8@U6jv=)AUq`mq+gfi28 z^Z+^2MOVx0-^8x!HAiv|DE2?N^hs0^PMcawN6bJClu+R1$74OKJG!FEiVhh{;Ncm& zOZSus-|#Ng2RVHWEs~j@_D2D)tb`5jlvlN|D(|#h55sDh^jpsJ{ZK)9bz(o&uU)QyS5=}m`VyK0)|5n4E!FuxD z{)esMyQXgeQ{E=tl;>drVqPm#v{t4p^44cG5KZhjA7vV4fM1!kkNFN=UR2PX%qZDe1)liQ+pGxg*=a%b-@Bg4w-jvwQ zMy_NMG%)dw&2=?RtoX`w-#5YN&t+dj?(rrl%gT$`Kw;LT_Wa34lmuiP@05DxyiWO{zEjq`rA1yaQcZe>FNh8Xh(gdGwoGl* zgeBqIn;*!^2We#lG4u_`s0_^uQt*n8Z!H6Y|4f`peDO;OKbb1GiI z?+Um>^X2;YBX6cT8W+WxlO&MOy;6!I3+?k%-Q6vmE-sqK%`@_(+74TE`*(tU@MX4t z(0paPa}D3v?0eZ6Y#E!`*Bmb=dG6t5uTl8b<8F_Njx&hP?>o1@-g&OEh?tPTIS6BRx?LWz%rt5seh;#gUNTQDSDxmsE3G)Ix-6)&|LtiymT&L>KX?3j8W@62sa%^YnkL|u@`$N(XlB{Em z5=?Y-q?qIXRC;%xM_VAo(=X|nty6sb5)roSz)Y;P&9>3BEUS$l668%^UUMnc4B5eS z?IzuyRj;xKpNV5!F!`M<1P7BO7LCTWB*FA@RH`;Y-z z|GA>&4`1Oy&w!3iOo=U_v}846rm(rf7wQ}paN>p&(}@l)6uyn)XC#e%bE*5x?0VYm?)I=Cd3>ds zKxM-}y>=#m*Wt7ZVt^h!OHI)Qn~%A&JXBm zz2b9ok0-_v8f7A;iT_Tf|HIA-eGJuSUbyM z*?C<%6ZehxT=+ZQAuUtD`7gL%Mo5me$w>0nxDQx|Ws7@}f$|H(>j>iuYV z{5yBBRkKb{LkeWE7RW4H*|hbe!OI@3TjnhC@|l+*JrR5NRH~8?Y!#q(&= zxH2W zV#Q=vRfG_+83l!U`2I7iGNMS?Sp5Bxp&-2m*kI`%w)4^rhg_&N+)Dcam6G$oJVcYz|m4a=AxxF^YX)@zbBgFQ+`GQeBvv#Il~2y!qMi z`}3N^kE!p?FXiXwqr!d#7R37kxwaj1bNW}=(8&#}x^q1!dEgFsxaCwS29sMbCxl$%!c6#VA#*B-}81&v_P%(`83RT^^Ep+@f&ekrCJ zlw2&*$atP5O2v>)@ly!@<8+jgSliX(xt)oGo}D(Cb$dU3`-!JBgKCs< zJ5;5n>9dGtsep6b&<9)HBZ@I-_STAW7~<^UyhA2Fz@fp2zl4J8Au3# zoTu-2=V_Iv^k1%uj=|@Q+-hr?36F^(SlA1_)u>32(YNTL8A;xK9!t+EpI%jzo(WI} zRA1g#GisVx%hYO#R%z=TX}6+iV2j)ipWvD@Gtsd zb_4ZGeq|3kEv##cHB){KO5~cV>@@&n8^KjRjg)DHnt2!XjlJ1p$BN4H!`9e5sxZ3X zd&u2TP`IxA*&kbBN4^6Elf6Ff)@zCNwxJO+gpaej|z7kP5Vti{w=@{$08-RUkXB zuc-29AJWE%u{jlmD|hBUo~*YsKi9|~*spTpg}!(yrqvW&9M2UV*|8kl-h8vK3rRu5 z*b{CqkB=TgR|U1AH^rvfp2X9QloO?F2;2!7H7r>ku(hS=>#>MA#Lsp`6;G@7f&^DM zrvsrhUA0IsqIBnJN};>z07H7Rjaq;SKP?@{*H;(a+!xh=-a>#v{yN?(sCM< z=c7NlkK}(-B_&ZD^XZ&gTBL=xY*hpuGGJF)8M&)^QFW3e3c-?;u7!Mzt9K^j=So5l0Un&Qt+G5X~?9N#hacwSW?LP5Hk;?PfAEtoZKZkJ3=j|=&(FiNdsnv^Ruc7pS1Bk^@K%diE0izq zXff#9zjo7`f?RR}4vOyS2zI@6os!TQKTQ8QCYDEV25kn|A(YyY@7`t4+cartJX7<| zI4kA~(K#<8ruNMM4egKhi_$bAjC0d!DW>r>*B6J@ORPY79v-)n6osNv78YNQd)-p^ zH=L}t>%)8!MmDJ;SYvFH=;gAqN|7S}a%dAX0_b4rBg(oH_BKF7YG zPik9R;?~+Gz@_O+&LO1gr@!)*Gj)g_<#1Q)e`Wg?P(>eh3A(|eH!4w_HGSf4WnH5& znLM=UNhj1x^JWK$A>^}P*IMBh7FxiVHzQnnekFb`X#2+{I;qK)=UbpTT_=XsHJ@kt zGzMlTIb+<2Zg?CmNe>E+q)7*HeZEns3h;QYIUSz6sgHH_ri&>z7NN?%`xEn%G!PAA zzS6!PJXmnPv>~Hq^)}+~przz;QL`%cl()MenzdbFD*t-Fdt&HQbl)-=bNNc1PZvG> zXzu7xzwvrF^7$^5%iuZjxL!jxYUznQ68wn>Ez;T4xFWxS{wWt=~dG{za7>+7WzV{F0 z(S7D$IlgWdmG^&UeRe1dKmwzY9N%!2 z6>32>xxPk=nmSUj_d7lu*xcxQWo!-*r>h&c?6ib+)0HHoga#)~?Ni6jTJDN*eDF!8y%vlY~cEorH)*fbL`hVkHP3cVLB@F=mzr&c+x8?tfyCPBq4pe`3EZ zE-C&>U~Mu6veMjn6P$zj2rS`c@SS6mnW~JVo+>9`#-uOX%CA8s@^By+7vJtXji{`&+DZ+fwjdN4;ufXse|t!@7ctM3v(xsk5E3tXAjGcTaV)V@ zBJ}c)M%I@v(r*JN>bWgC8}ijqEd>VQSJL!7+E%@i7Lx}3;5JXlEdwsVq z$!q26jrOYBHYsj?m)httIe(tU>^7cjyHDUpl(Y@WhXmSuU&vf->@LLJ z&BtWFm`keQGZttfxCkCuC~ehyXxUL(4ms)(T4xFp0iWVeJ-n`zNj!|`*lsqKvncck-(KNeww_2|| zlpHi2*yu-UJuty9^~jC4^De-h-+a;XoX?uoTvg{oPBIY9!#b1LZMOiK^8rweoy^P* zvPLV2-*|6s(f8_O)s6k8%k0c&GbBYI+S;PeYcY1RyQuEroISpw&0PFhkSgs~{82|z z=-m@CL%c_?5?usJ|M|wTUPH@MO=DRYoBiV_CkXEEOA=QOHGLGuwc(XR?=PDDe86II zht8ont|&XoP)v8!3qjfMh%hn3pI-G7!p~E^uT@&6Mmg-@GVmTrUpv9^34`Mf1}(;T zVZ}c3ZIjzk zd{5>Xt2Y7Z6W;3sniCGbyD#Np8dN?yO-J>NvcMfJ8&LXm`mqCiANeA#`4UkEB50=2 z``c8iIqug2abbDh{Ur?n@s4C?o#~{I9SbS(5-DO>8;5~e2tvtMybAd~^(?6Lklo5o ze#zVf&zc0I;rnHcjM|5y=R=P;H2I9ZR^rzG8}%+=cmWq6D(evjqubi?B>Rz-&B zXB~=%=Anx4tFCL&l*M|eq}bi>Uo_30aVD+2sw0ei#@yWtR&6n>_b1ThuNzpk(t0ZU zU59`rUGx`WK-rz=)+*W{C?>mSB0ePB7F{tYx^E|%7+Nv^-okBr#^8*rd zX+DoW52Rk2tAz)9_!I_fq6l~LXOmf+pHL@@wn*I6TYavZ(Tr*3Zv30B4*Eb zTgz4#yT39l%X(*VG&chuE`y(;9A7~A6DyH_g&RC2jZrB-M=?xK) z#s#mNoTVhK&Q2<^Dumk!GqD-KG<@AhQ6O0Q?0;mQE49o&wFU!uv~B?`{Y8_Gg8494 zd}$oGbave^m0I^3ZiYPnlzu(l1dP4%KbG&&MOjZhWbe_+w34kdsatFD3%u}M0RH+I zlG&;@^zhWirSrjEoA^)LR_*-6${%jm9Cd#V*1FA;KXExhMep|GwyiPrp~5eKMcDRb z;M{y?!`JAUq1X4yw(_ONEtXG_QK>rdOIk9uI==Tepd;PX|LzulPqQs8SVgXZm8wg0 zeSaRs0%Lx)udS<{A#M{>lIso;Sf%zqXzps)jA=3HC0mv(61tYV;z|DEQ{rSO1+m0y zg>?%0U3*+_Qgmg~1$;S;2?zPCEXx1lh)k7BztuQHlkC~GVOa7m_{lU{o+9SdpTLt2 zE#Gcrq2cI|aU0t7FyVZY*cGJ03Sy9L@Q``B5{x?Rdc zlap7HSY$EXPFd zRp&pO?qw)v<+um*zxGRdBl15o=3t8zD73J3?1Ym>71wWBn!%QCZ%d~7zSmHF=8t)9 zzBv9fNfI@-@7v@!`Fj0;!dOK$ZAW%+(gPXVZbNm?zs=M;R z8MDXAM$t0i8$4Eu!Ig!z(O4#Iw$ZqkL%aR#bW_2hMT3QhO$ zeIMU<_icCZ8+wse^;!F~tM)Z#eN!ZlTP`p$gR0t*L4*aG1MSGaop?+VKYk|ZzEyLh zA&AjP!2VtZFFgq?6n#1~`Q1ZsRp&*~OWpKfLL=9vLa*41u9nfLHDE9#plViNI+4c^ zWs{tqO!;`Ot7$|*2443XUmPl}x5%nnUt4qENrTDln@|~f3B&sT4_p_mLs*wsRwS>@ z=OI4K1y_vB*{v~SiMwk+$iV%V)mN42n%;Pv))_c=pacV$Y}Vfc9ci3dB}e164i z%tG(W4)uKdcqpDHeU$WglEltZgbeGn`rc7tvuJa7#Y*AtU$18Eb;~=;pYQI0d&g7L zssZ%Q2aT6oD>&U0V{i9ejnVJH1Lby*Ql#^dFgR2)WoVTK+51eX1DFMJfmXkQ&r4;q~WKmv!e5D~DE3PM+=%iYj zi%rnHJl|c@WRVzQtXOTnUz?B}?jJndh#b6113e*V&KnZ_eO6GY2FIuC>!R{EmEYI2 zv%z;w@iTE!Fz$z-E|r>C4TghW!&|vty@w-6lI%2^)n!HH-BPzI*91!9Irwf}Q`0Bz zWrL<$@k#&HkN`t$SsYs6J2>z+YoJE`gsq4r?Vno?&qPaxC=LKde&({XhFQ0|5*m%b z4$kDq$X8XR*j&2CtI-8(<#b_Hl=f;gCB1d4DtirUs(7P$o_NsjGP((xMOq2aavLln z^6&DM$(F6?JG|g!*q4OG346$VwsT(&eF5y*{Wr-mx2B_FU}_XXiG0AbCC5fWW`wgp z@^QH9e&5ALTELrB@KR7{D~H+H-`I3Mj$|WZz&@fH!3+*QGe58))(~!PcJF%l$mL38 zuuZXk2-3X$9s)e94pAPIR$KCn$Yi(hp;wM%@!`bq>`CIl>L~4QN|9@euleif&jGGV zxu$bvi6_bh5tnjNw0YG289#-yH;L;Xs8fO_i>nsWPmgCj9_<*ol_>cZe@pXt|NTN$ zB2?lZ=K=zc?8XXBpxF`IEp~AO&H;)ktNOWgX|$LKXE<-~xjhXbExWuiek4{~vYCwM z=|#bGJ(_`_gww?57p@H1IC=R3$y`Aj9*k}gzOlPSG7qP(dEWj1@pRtNY`=fl*Q(mH zrM9-H+NHLjD2k%?9xZC5u}2WJ)Tq6+X4QxlsS#>#YVR2Auvb5xF{ew$8>6y z==un8^e}~;=b@2Lu4VU?f8vwY+u?@D{^2Ez2D6&usLGn(dYz&;uHrQT!X$L16KCQf zxAr>xi^0vlny}Is+`dY9@;tp*ax}dP<~RgYA2|W;O?j>MtbX$&d>cYP6DC)d21phLx!LBYs7i3#Bh#9PlZL9j|hbPC~Jf)hPKfvfZw!?!e%Z3hJUzx8{Te z#+`iUmCY~H^*TTcFuaQnFC428^)}k|ea)N#c28FqP@{EtalG}5NF9#cKEa~^( zRyUvvV)qE8@G_dJ)jLLFZtDQ-8+;Y{jwjtSWzLPZ%kjn199b=uhb89==NbeO;*2Cb zI)n8P?>QP<+UpH~kocMtzqqnvoxnA2P|I7*7PU`;COf@YCBGidYp9UzC0bMzEaNP= zzOnjbTBzkTJ#KuqJr%tH9?bj6KfrvC%FBo<;a7VM2=XvbK)=w8*{3hfDr{e;BUrW`BD?$p1}O}fUjGNlqg2*w~mUVs0Y2KYx;hz>R%&vT+&YPEM>fAm4G zPPk6(y%5oI9Xq~pR6NiG9ux9x-nETns!rw;sNh<_epu~JK00WcP+pZxBw5-cNLIXt zUojBXI_!Acr&=}bbF#H#)N|cMBP5OwwI4hO?%E0bJCb>3<;iVFoHSj(a4^~8LmilB5f*3HOE z40cOFng%PXf65bV&F`18SV`ZeY!2%AqsJ$UiqzmpR7H|zHDd*PERGNr@fybUNjlsW zoU)^Vc7}EB^t)MniKv;Mlb|PGcvc>pg*{FovphSAY|yV)QHqxs3kJMZ;!oX!&6okb;1lM zNoJ6qAg`CmXLW!l1UclS(BPaD6EKe#y;8pFb&f>ucXaTDYa~`2;639ogpHHy6a=lhAf7S0p#KNBW#qGCm`xfzy5A@izmdzf?g+ zeG_rkxz`~jGr3wb=+5bw$k?pGW20%td>!8jVe&R1@P;u~qI$)({^R55hbRxJnD%mr z&Xjuy`#dg$lFfOT_?e@AXzWHjZSNDZ|sDCpA z(YUty04J}9a}OxdDOR~kgMHublcH6&n)}kCjJnn_HLIUH738qjZLM>j5qTs`)lv#3 z!1EE=+g2|+Iv>su#L$^29LuypVbr^b9Kw3;HPp9tx+()^y|7o!S-U|jop5kABK0(- zGcc1PnPzZ-o4A_gUf{=EEO#$q+{&HWlX+z&bszfv1^LRzCn zMp)CK&rgaDX0j56VT_>xt4-RVp%8go0SJz>)t%g^Ylr|nB`c96YMA|9iFYrT?v4gX z%e*uv825O~%%YBFkV1{b`8kaPe8=`biL9{oaFmYrn@Q@n@RCI|r3(Z4rJ6e{%g!QT zfM)!@wgYzGnkx>ky4Ki2Te7gnL`i+B{~uA2mY#@re5wm? zh=yRBi;Xn|Uh(fm9c?VNBj(nf@^$^KcAM3j+t_RYP6w;yPQ3r(Zf8YYFAe>mEA_JzDhD zvuy0$uImG)4c&x~E_SaeD*x>D|FIoJDDvULyBltKGW92Xf^@|BOBkAz>2&&Kg*;>x zboF2cn_B#8m!fm_*->In2NSLN-g z?nnk~KjHdrWLH1&`DNT%;7sgl%%m0g{%Tk6lQ*D&KBDEUaqL)+@Ba06n1xJk?ZeLJTYf9B7PY}3&+DLRf!hywq~2@;fyEo!>8D6B^L|=lGvBaLHpczP zg!VJu@Rv*0Q7uh%@d7%_@i1Inxaz$*-CGU{MKVAf*VOoXf_1&QLbQ4410TzH_jBbk zS?!PMB`YnfjHgpUpkFV1Xdf+^LzJfwNIK3V@*nH(#5D!Fzu;z}aV`F3W9#3~Zq%g` zeAC{TN3pWXdo9bTOaoD}N9OiciX@Bo5i$`f(fWc%y)e?-x?3~-2x_=vA)?&Cz~ z#g`q7&6PMp4Yv*FTZHqoWXQMzHFZ@!eVjw|a!RrQ`?Al5d8Q5~Ma`!jIjqc3R2&+2 z@ho>^^%2hCx{DPQnOdR-1kfF3DbK2+U7Z9=ezhz3{gWzC>(kFQ7c82ri7~nrl=oJ^ z!y7d^xELf_xjM2UV|=d7KQ`@)y))N?aKRiP0IXkQF)r0GwR=5)-7|@bd7r(`nOS+DlH^Li z1PJKxH6=++7`|iWKPqV1r}%h6QjaBew=OnVadLZqEbIAuvdW&V?`vLqaEtGY^oing z4QO}c>7JSLG9xWEZ;9*~=wKF5d->Fo5=*>pQ@oxn&+q=kU4Sgz{yhtYk_~SAA?d@FLsV~#tlpAe0 zz#n1Y%WXhgO<#iL8t%O<9O#h$&Pj#lK8=ExYlJiSv)T=m`!&(>$qUYs+Wo^)`tp}qyXvf9IUcmChYRKo0MwsC#TR!r9<^`;-AE^Lpf@5Hd7o+03) z24(wX^S|PegkNa^t-E`x#wD!-`CVf_Z$-?&;&UjCNLUNECm_pvKaa^>O- zXD-ECmq1=*c3OaXBhvDbKsw8B_m0Y6?fokw#`bxBnK$BMY@q@0VnVwY#ewIG@I}e% z3b-6&SAW~$45W5ofO$aiMo`_B7-!Rs3NC@&R5r-PwTF<(3WyQzq-PbQ>mg>E1kSE5 zVc`$V%0<@L#Ol;*8=kt|EoOf$pi(KDj{0~sCoNQ&RXY_Rb&!fcPEf9;;X*-}*|Vxb zZu8^|wT1|m{j8lfmc0&7xh@}4)3^2pk`@apsD^k{=e<5dY=O6=YMvAfVBTyz|ahkoDWeA>3*YRCM4nfeJ>NlR%H(h zF|leGiIpd9?(|v{mTD~jh-Bq|dxixZ>k~rD!uipst*!xQGYxXiOYbvYQ9AK}h)GGI z3Z0d33Y>bk6}E2i0XXxTzPKUza69Ft5QryKOhrcaIoG}4#O_|Nh;7OgzaJRzThSi?qY5Tk)r}m9^#YOK~TviEum;!?^ zUxD=s11t1c`XQmB>EhKGxO`kNiFeHId|R!CivAluaOWZ?Wq$iNUbPU+5PHwKDKgu$ z!U9O`{OgujjycOJ=kFux2HCZ{M9i1UBTDN|pX+RCU7t(9nMNuWH5ndiL<{!eSg6)e zk=_#;`g^J4u6bmbwjY=&-D&%ol%rdto}>oekdi1~O-a&y_wgs{W_wc^PqVdV6JLTF z;Qfw4ZZik<|6bdYA41657-pW$F1M{byh#%w)ZT-E#GO){RMWTI!tF7?a_hn$)PCpr zw_p}LX-4NcZReCCF7r3^3xJf6&gshPD@eb#;&tCml0cR=p`7D-XH7^Sb6At2j zb4}pcctz2kB2oCd5xLM?31>nOGy+Ks71FaeZhN7PDy$s2`NDum`6DKj6Gm!}7N|-^ z#Vgt1GNHS~`cfX&Z?M^)apYg^|7>#Ujd5wYe`}$1Dgux1J>q;KeV*?^#%oOZFG zc7r|6e{azqs9v;n8xm{i+Jeos65&i)T$CsTDQq|TX6nL&<&Pn6CPJ8df0>P;kS=N` zDvHx@j~;=EJboT>eTMNLL5M+^`q4SPdSpf1k9P_z==}w1T8_(xbh%8s z2Wz3n%hE$w!PU(4f5@g95c+I7rE9foZk3@9C+W-gCcxTBpx5l#?5;8)crCKDo=8aF zkWWDzx;66t?P~=k{mm4Qn*YJ)+`+=p_9;(R!P~w&pXLyu$DxeE5ejV*mr=eOcNpl% zZ#g~4_Q$r26rbZP#=4t^GXw)qc*IEpo`8BY0qJ8br)6<<@8WXn8(|j0qb1J}&rgbn zf32!dHc!r()Wgnd#?iN;Kt<}7Iz(c(pUN@=QO#ZN#_EAeO`p}f(%m{VHxj3@Ju0%? zO%&$#0z4k^wK6;5`rIhFt^_@ z*E(&nX4*p)(X~95Z4Mjw)1u7+0%9-l^sv4pZBOrkK^nT(tLW10vg&5%Segx~PB?F; zyc0rgTnl(1ClmL>hNNniOAjC=>Z>j75f7G1@x_$M7AvpRrv!UnNJ@y~<1hc<#4H1& z-o_BhHF+flu&v>=ZJ(27MxVMqNb+~)*zPM87QfH5hB?>vx%m;CWSA;wDH>jZK6K}3 z;Tt@mfpp2T`;>=l!bgsk_O0I%9inUG>e1C8(A0+K%&~>9Fd3;b2+YmovI_S-%{t;7@2gq$WEAM76)qdPE9T0l z7q)Gx>J>-ys(d6hDOe0Q!}SQK`yY`G)^HbIW$7wLo*@JMrga&P`*tt46+5K=sK{vq zXc>GeUAEa*;jRkovth+hu`+!tcQ#y!jfE)^k}w%-f0MO3 z#5w^fFB__87Ea=UEUyBX_7916gR8UV;flu)>E&!)-9^l1l(2Q ze=M)OOU7=@2ES+CK)|Q=WaP=1TkLsU1udlV2(=5|y^cKo&KaY`SyvpG>E+iDw70iy zOv=tz8_xXYJ(O_Th-FjV*j~S@=ZMd`d4c4B4sm9ZC0gs2ow(~6>zPd9)4kyQv+eiH{dY8t z-?hM9WDvu7gwo|Kf}qzsHpuu0RZ_KRq(rS3*b~05CA5Fp1q7^x zlDgy(2FH``Z_f?1zCgvrWX2lH^X?J8=FCLYqzFKHOTg_!gp4en;H@9S3pDh!a?Yt? zi7k}NesD*6lz3=UH*Q`WW~ECt8p}e?mP4(ZIVireRhT}|^mbjc6*K_}t{`E?@a4t6 z{9gDyuwZwjOp8+B#m_FvHlik-@zxY!7-CFbe1zf;g3-hs+N$(i{SI)V867bTE^yzp}E*NFNHMVhfS9Z~h! z(E3BFIWK;u9fJ0c6G+>Yp~yPd#x&)^rPmWj zJz~~qF^hi1SBvn+R{5hfijTpTCWPv3^v6ke$ym$z4@pnQ$YkAK@wu$|9|h8Om7VDH z5xVKChkP=NVVci#%Ch zW0^0Z0+e)tXJdw06R|d!w@Q@4r$fOC>Xp!)e1+{;fd#v&@b_wOiOtgY!pQA=sbg(W9Q!ff6t`Y9xO3^BEVtW@V9$Rg`11W~4im z!20|h!U?{w#0u^@c@t{^ydSnur7S|^YZ$p1z61|B^FL2PoYv>MqpQ42g?Jws_j)&4 z=tw@|5Op5PMAWw)1CxnO)^!x+S0!YO38otVdnWC@{}B-*!3LL=nfi}(KZ~WX1YSIT zkQ3~p4k;I4@SCz#08KYeq?ONB*rZvVxkzOJmz&!~_FO6~o4E^c-+*iKwiGVayEG1e zUeMM>_DS3S=Ew^JG4KlHs7p?uHa1V)jowM|=QQ{~oS8 z3(gsG!MB+kVijg9i@hGvp!254cOJSLO2*8iWa|jwkVnPP?&knaUqb8qCEb$~kM0C8 z^M=InL0Y3t>!DQL*0y-tuA+M zN=)_(ml{v~Bh7p~S)<5-^Y651=%I{NdhiD066?YfGyeB4r1$aj%QtIBvR4!pD8e*? z^*B=UP*r^n2HT$G(UY3o{msCW?^AK7e>p_aK6&&GBVX5Q)Wxk37LY+|6hoSzFnWCs zCl-<=JoNy^YJ&{h1~YK^cH6&$Zp<+@{RGx(n9)xcVfkZJ#(&yb#Pi2xzl8q5Aw}sAMg3tN-A%1m0nFr>QN!!1RR~2q;0L_ z$hrj!c3a?)T|xBU4Zgg<5F!CEcBq&$ztlLiuF}?-6hLLXaAF26*L+WFZ+Rdx)tJ$U_k8C~HY1*H95LD{UlVR>aVADw zG)(T1tWL3oSY_kfP0df6YT_JmMoG$S>c-VM7!3jkVaH%6D1yGC1!T?x+5?#T0}BUJyNxvDV63wqE}*OHbj`W zocvg+iekR#ganLP_8-UOd&%{4?*`SCd5)Mn&-hBH_YF+iGNx+JraRSTvmiCys^&)g@tS&?;5+Am4xrk#g^aEY39n5UWOu%5q#w!XuqVio{` ze#x{<{T2P<_v19kR9O^=rF0Ky$caKY1c5!aG!m_}sN3AK|A>J7-jdUHbt)?6Vg&Tr zEc97f$*&vG6bSJjk(lAv>U92Tn4Y!;VDw1G8)6bW)c@TsV5 z$$9rSW-I+MB*GS${s#%C&_^VcI z8q@ifNzc-n*g@NE>z|T6MTT%IT(T1i8Ektk>$dpjcCw$J#pokd#~GK1Sn?dq7^@MM zua0G&RByd0c=3l!Fu$FeCJE>jbJ|Ry+7(DmUjosBY!#p;v4*PuWf7b z<>eHB7W2!U9_Mc`XJ`U66N-Ay`_5s1K0Nib-!%#a{~}=>+LM(RUkdbR4O0F%r*Cy^ z<0l@LE0+4l58zZH%dN|P2=%*$D_QGWHH3LyhWHAN7OM>wA?sR?1EdOztg{U?6$~^% zJ$bYCy2UaN>_?c<_ZxTI#k5n94NG}!LXIgF*9b`?}$r@66Rp;Hh$V68J6{G36k<%Y8BWPO# z_Zrr1L!kILw%-cea7q}Ip(C3ld%~i1%=tVeq&r@?{@3S{g3F! zMobUR6Xj06e=9NVvmA02M5*>W#S9v0Q0#Dzh-g=HInPVcCQ6bk98b9}?B3Co*Iu;m zC)WMm546?L{2{K}?V!MF=lFRiaXY|Uv@4Nl1q>xfvg*sIoBQcSp9EJ-@dTYR-x?Rj zLgi1a+pR-kZ5pBq0Amsz!>u@*s);&Agyw$8wKP1)yzLRDA!01?(B~R?8CpB3!WqCO z)R9+2MUzJu-NvzoMxNdfJa&BA70wRS4`iYM+SsY#EZ$9*_f z-p{@KyyvdrA1YrNnK3wHuGTmBib60`HkV``R*^V@gK2GRG%Y=Q+Ye-8TA%4xpE;!? zv4baZUjwevf|DV7#Tvo`8T=9p8|j5finBD#6?aY9$Oy6z8?gdRh&%D#EpKzSP3?*B zYfF8`rX-rByc->*wXq0-OL7rCwVxGkG2jZ@3iIA>*Z+cyqwT7$! zBXWlgX%Whg4Iey}i1AP+m6!6l1)Rfja&`t+aurRMt?jv#yvB@PEf ztXa|N2gv3RXlX@`CR}U@%g^{a=rp(HOr$4q{T$w}x*|_x3Qr8h?OCcKkR_6Ty*Og+ zoB$3srX>th*s{(AM8fH7Sd!oT?V)9v8LSF<+`%{qeuYyBdvEPN=QK&&R&Y zuE^db8#3OyXR|3FbXSynIUnExN`WgR(=9qK@O~GNJ$QDEs+^)eLrY{+271ViOcl$|_nDC86-2^Cy5#a*qcX6e{JFC{Dv zn2wI>CP&oNY{%4s8sLWVop~IX;JF0QC-G;(Y2Ro4 z#dWV)D|KB9+sznYhm~9A^JRF9gY+UV#PJdhSZ&j4duIB^7fBeT>InaC~ z!oDk4p!&k_NQPobmGmk7+IYC=Hw)94iPlrgrKQWG6_ML|DYQ0$3Gt! z*;c1%aAO>f-t1q z6O^}@vw#jcT*=oT2V(9E zJQ6OH9cUk$3QlN>L7-8)2HLs_6SXd7mKjT{@foucx1y>TG_a=?)0Qe64m;~3oeL_f*&Aeq=;zn!Mthgp+(Sym+4wY2FPjvU^rk9tT z-A*X#e*BtAs!?#r*3@8htaqo=CmJYbte7wCmeVB#BGZCpoNdZ?X5h#ep8ufmxhfQO z{N+C)ln9m+TD*wM;NUof=}cZ?S?)zcsYtnVYW$DD3gt&djqb&5{}CB7cQFenE_bhb zxztU11{Jea_|8!W8s)H-K^wu2N>$7f6}oK+nM;+X3aRc-3kl32$qr) zjW+|b`Lc+nL_#(KjT(a_ zrfuQcfsb^<`ivs9FcYGFw-=IC$ImjpT`pb;`f%fdTrjtDsM})6tNg=E_oX!=u`yeV z9^8A!HJC=fTwI7?L=41W;l|_2_Zj`g2pgo_iypC&+ur zQ6~=_?5M(X)^?Pl0ucm*W1tOUU2xu4C-h)k`3_Ip-DX-ncuA<-q^63_|89!G*0;9Y zKXiTfp3Awth}CKC{de80=G8h2<5}KnJ$8l=VnbxUQ9WS3wz~Mb`T1>$JN{JHp@e5~ z>|)iIfXWf6aJQtz<7EaqW-6aGj4R=;8(D`Oi8;DQflDHvMJX`lwTt=Yr)pC(Nzc{j*l;UGCKG2rihn!?AiM-3x$(^-Y4XY-4~T52Lzq2zpscksGGm_&&3cfk+kf|jPx z;pe|%#y2RQ|N8v@U$rF~fCh}3YjcS|MYzI&0eFnRTJAF z5$D6UebCuq!AqR^Q9A>KZ(WHR&x|?BhDBOl$A_S|AKUWTBP}9!8XnKMGZ2!#^${p* zCF90vA>Q9Dv0fk5&F}2Q|D=zz&$)d##*V(_X~qfuwAshn+|(#BELVm)$EU|>gItZ` z&a8Hld(CHrA>Q6=`<5d*yfFi*bmZiMQzd~R=9Mx{&FL;$1Gne(^?vP=idPH5_zNZF zHFf|{r81x>zu70Zs?qV+j9|m&az?JXMt2(x_EQ^8zUkMNK$o;5kD@Y#JNrv_G}n~w z5ddtzU5|e*FSt$J0@JcSzlWPNrgZ6wC>yYL1nJZU4;DK`h3mtL1#DvvXV9NsYTLoHiY>&~GWJJ83{|Ri7sm zQ^e%5GIEK71ZC^f+a~t}p$mcWgsFH`i;njO*{8}Mywl3^fM5MN5i&9yvA(DHx)u$` zbv-I@hO8*mxHa0akfJs31YOdy@;1gffX*-6h+CzQ+t&1bEi$^lJ2@WrHTR7G z#_KTEKDoF|5{KqI6Sf$t&AfcQz9{mM-Z}!>+46YxNN}GS0uWGPNJ&R(HhP~tYqA)z z4Cbty#h#aKSgUVKVVM#u7Y27J5NAb6_&@t6Urat7-14H^$R7D!InInm5!tQ^cafzf z(GYzk<(Ao7gyYqJW1;81t#i?kUhy7Qv1b8Rev(>*>~HOBT(CRH(>;JDDlpX7gZmjd z&klbJq`7Z)aEF_;L88zF|Dt^x3{mX{vyV&$mMu|?vNM&F^Yh!N$t&d_#Lk{*=Lq6>o}&L_jv=b z)2gxdw?$jHudv+3FO!0m_+FJV@q4=-P6cCETXJBV&^Q9wSeGq7;ABKHQj__KQ-*k3 zDP30Uuqgcy9-65-*aB&^zys-8S6mPuRnIoC0ftNPey#T$b1I3c*& zP3xdlnRCo<2fL1wgmoyE@#0%miynIo|1~59qiuJj1k-pKpOJY9x^=R7YUWEZpEar# z_vv;9ex9v&K(L-$&EneE1_1m%v!Z3f!_}priGfBv4uOc(FA!haFbM*DX-K%j#XtFe z{KA5!%os6goPC~RdM(zJ(Dfa!1XZ=DNgun}uY9f#CDvE<-VoMC&HUhhx|;+~chhE4 zZisV&GXF=!`h8l9y6Ps7Q&&IVaY-X4&BK??Q&U@0c_{b;9OSclG~K+W6cxFHB5cN^ zp|cy&eYk5yJku3ziC`|qKSFYqVPCF3A9bj;C?Bh>>i41XqcM0Uta0g1pR_2m?AUZn z2xm2RwzznuDi%5t0CL-WTdk$29CsuuLyR432y}{giq*|8U(s=N+n2Yz^lB2jG)mH9 z5Bjoy5jdNn?`8lzUOHRavY;za5jP3?hZxKXv{taJ^$(tzX;{JmF&90GJXovQyY#Dzc=Ju|VY*apBHCGMg9(A=1$1Jz#5{x9f z^wMc}lZxm&nH4;gSvDk7H}sfr{T2<83T{Ya$8Ub>Q?F33_B#8>F4&DsSfOz~$0U}W zoVjIEsh*7!zX%Zk&9PzA$DD+l$htj6PDb!4vKo^^9y{9BU}D}NACcM55-M(DqQ7d? z@Fu^D^AT3%yfB*i8AoSZ_>FJ~oS+Ri+FY+`hL>o;<5ip#_> zHeynbQ84#hvi4ddz)Z;Z3)FJ7{(^*L;PyeSpDfGXpD9A-6WsiI=6F@3rY*zh)kmO_ zh)Q+8^1$9+f8fMwE=<%h82)cJB(khmKW=lgFu)5sG6?f)Ou1;1E>4G?2D`&W)ws$s3iq7AiXg(HfQ!`zM;ju7^fK?a$t znBcfup4k?A7s=xE`RONr%%^-D&BW{10(MF(Y2RR zAwtVd%EH^9a791^Wz^g2a(50=ZP0Bngnv~_1O7rzFV==)xqSN8v zQz^en3Z8*bmf%t>m!+%)t^i#FUfK>G=vVjdGK-%bj?yxk_S1vWvKh!8IqR9$zPr)e z>6G5%9(@P|l7Q;9q5b{4{VQ^z$UIDl(SVjWierH1D%G%92B~wpfSjHkgB;!Yr=D7mZt(D*%4|RtTvll`Vql0H z6>6FljV5QQ5ea)9bv^F69EXG)S}m7iS*fY|+t9h>wRh`Q4FsXuM+W%ugWx#acCY$R_aiC>Ig~hU{|E@bkeX{Mb^F{kY z2yeCXrd~SRp?*`%Dbfqywv(r*q-+5(r#it1p#Q!Yiz>& z(b-Iru8|Cb6OZ5iJ788rLJ4L&pR=IYHGkn>59^}4Pz#A3F-@b*N?Rn>d# z+CJdzBe`>(^fG~k+;_=I zlmBwm?pesqHmob~^^Bu4lLzO3k2~L)H#jB8ZGSE1G^_B2v>odYOjV*yv$KkQi;L1v zTe1+Bko1d70^{RBT|3jRH;=`^f!l|7NUkcmm_nE)megqC(~$^)@@6gfra{@i*0+8I ze4_D}mNZOxub*22;Jtq6-IF;b1!Y89^%agX^mQiDCnp84u*aRj^w()0DX(ekh=8je z=$UmU@LhuYUJ@Ea>4u3dO?#nT+X*ezz96kaO*L)#|=@( zP7?=CjZ^EvwamqfME!<2R8EPuu8AEXlvvR?$>t$T%4irI1{*$RBM{!gBW3>nW%uDr zA^g^db`w60WFjq23-stB<2-XgNt}*{@Xo6&ET?}f34*04tNOVr1P3*r_`s*}zY{r- zxQ>kzy-CDYn%fqee_&{*#=v`=EpI`hS*7r@xz?VI?wn4eL`sUk+kpJ1UIeB;dJ`L8 zl5eMTxUR(vBGIbJ2@}gXF~q@NWAB2)sFmJ@p8jw$i}p~a>LF5kX@CRv$?Zh8nD`cj zIX1?d$C51nzLV0=abNzla+L*Kwcoo~F}el)^XF4;Ay2BNK&t1ITa)G7+|m4%1>%K| zy$QYhiod>_)u?7M(BeoqpurzRy&A1ZkA;5qn@3MsURo0O0lJ&-IVHyt<7N_RA&UPK zX42;Ocr`}p`Hwz4{h)ADJ#P}4C>hG=nz83w*()or6o>CH&OY?+my?csJSlp*tjoqy z$k6v%XyS#^AywRU=-UUZgVbumc=*Y#kD?ZH^k7}FPx=vbsKQ?#otvJHT&O2hkPv$x@g*yPMt=Jbya+=5P;B z*jG{`M46CCSM2V%&L;YKUdT#>q2J5!ZrUpYBx%`Zow<&bG zGWsW+tx*p*k1iQ(f`GeDTG>XkPm78jZiY@I8J*lfqE1^A&KH6}3#DkG7JK0Pd%M2m zRT;~WK5m+k&*FE`9s;)PVE2A0)@v6YVgt<(EDWvd%H?BpTW(YW-KSszl|1jK5#FGEd5 z^y355UA^@doEJ^!)cmU8Lo1617TB@Rcn#DD)7Z7e$Hd_;7K{o~_Fv+zjDtpK`!P5+ z-C6rc!4aAxx`{FB12c_#k?~2tL4(R;%on4t+!G{^Skg+?O z#nB(pJpVm~{|F!r9m_ zU1oL<;tAtX3al=?U|%jiu7ab|Oj;=MB5a2v1a>*=|FzDR#RmNASQnG?@#^xi%dnt$ z-@%u#YLaLhY2pFSg%ZL721~dx4y_(6E4|CsJ%N;MB2=G7_J!Crawly5PsGA?M|nMn z&>9yhC|npj-(@`a=$!IOxBoJ>%;UYUmoe#;w<;WD7GbO#=lmXNpr_#yR6h1&q?NPj zbh6j>Ae6~fQKWvV1n~lWAN7h_pqh%-HZA8LX~-EItI>7)7}JYNG{|jRpj$;Cm0*UA z`8~6W;td&O4%zzRbTLueOR@?f>DqmHJlOlqU`r!J`?V_eTY=+;VA+Rj#roapqWgvI z_`4Nad90EJvYHLcTKHKjm`s%s;$+tv8yUX=QviLKIot>WMl%3`->W9yl*CVq*U)(> zk6DG}%qf@QXnPh(Kl@xCsvkQdCLeuc{C8iIFR`o=&Zxa!Sgd2eXQ&_nHibj3&L!YVLtAu|dD?8h6|r_1#Z@z; zmCQC6`0HM&3f)BG1m&lBUyg#dGrv}ij zuhLneAI&N?F^#9nnrw<1kdMlJ*`LhpxN46ThH#Yb1wtNCLPtCt|BNk(er_L7Gr=T& z1H6Y0mCodJ1yJgGajb+GB+3f2Mt2T5!4mL0gr1;Xb?$ zTN#ii1hMwoAQl?Y#n||^%)-C5wo7jeBtIfkNZ%&>N2I)O2(Il45vrb@dOO?0?=yMt zd6ik1UYk;`-dZ}=dM8oXy{>{SZ5ouD%Q#*Urc9d9iXQ6$S@yu!pLmzw4?3119vdNG z#)8pCML8c}Bmbn%CD45^^Tum}E-U>)3*SD}bSBZp17;%t7^)GeX06X$3K;l?$@)(# zbDg?Fq{6%8)Dc3nrgG}VY=8%9er!V&o>4X6i_GtkW+=#Gr&(Rull`>^ z&&Nl7XP;FD@CxTk3*@&B{%BvSh-EX^PfE6OhOkilMZ80$1iWLNg`vB_hf z>s!t@>&Qw~jw*o)W)f(OW}{Lf`ma(NLrpL}wE7rH`G#EA8+ts_B9+gF!df8ugQB6k^_5yhsxwuO%R@)4|5=zfdlt6UwiWi= zTb_tP+B@?u{F(GH!>lYhB-vs;{~p@zKC%lnwWkbbl+BA9!15Eb)I}pG!Fn;hKcCx~ zues{W_;UINyq$STx$}0wjNM6Kj%){*(;ZTtj5mtp#W1dF(iDZ^D-oWgy`ceh-r1ZT zYd7}y@Bb#t%qsZl%e8e}+Pk~s=?FKd~h#`xaPF7h)O8H2hxyR+-&~{7&Hd&nqh|Ggq;*Le-CQ-d?4;?t>--o~4 zEGastPWSufGKg>9aXO?fCH~wPXj} zyZhknw<~Fyg`;zI9vX32k-5NqcKzBv#AWW{CgoT1uGjeIsHmxcw==~tMbhtFxpJXO z#~y~KtT2F`cw6|Qd`@~GFfU|d3WG&kPe%;?>E@QvA^>*dVRowC#x>A#Bn zuW92|_-}5VEe-_9oV(?*Z2suWj4tZh(J~@#AlK^I)xRbQDtOn1Tq&TS6-j-41I-?< zsuhLnGTVE>JmDw!dN1v5Ymw5f1;@CN!N^KXQoRk60qA~pMu1n4hqr!RjsY5DxV#ZAOTVTFk9CCDMN(|44i~rLN*@8KwLtf(7^Vk}=Lg`Q<6seGa>U-gg!k%e9&l zzg&utAwwa2az?^fUO!j5bS6ojB6bYO+?k71$3%tM%4G|C19@m5@J5R=^r2qgT`MB; zLo$I8rk+)@bdngnwE+WQ#SE^YNtG9$MFS9_b(d_|B%S)kIm4B@7!xWO_dvHm1KPV; zrN&|FGZ?4fNx`He=r0>P#IswY!5GO8OY6TB%^1OMTr1*OD0>Fu4Tx17;#(fGBuLfZ zk_4(N(iwWoan(!s=oqTx(@SZCG%YmTrV=_QUcTt0@9QFgTVnQ`FtM169&=wR7h&~6 zVn$thXx{X#$$VWmH#7d_bZ)SO_IC{5a&_J2YKg7)0-6wI!e#gJ!asYuzW1j4>8tEQ z`l`W&CWiDm-*m@{rahTGPElVk&$ec7_QzyxUTdVDPWC$t*_;FFy~IpFi&R}#9M&?S z_@Fku@vGktLB2<)mz~!2sV+pP^vDbk?Xj7sv^FZX{6o<5X-W9k(_+g2O#Vo$1ITI7Cz* zxD?X(;jiS!@?xgfOIJGTQ4e zHqe9?R%1#;)@4HF7`|}o{e1bA$K{RR(riycm`>Lk!U)&h_NoJ=A>&dMiM%q?sk^q% zh8SqgFQHH_LpBW?Frm_ATQ)8gLMfATeBWHG!7LFks*@fIaTeLWm=_Kyv3LIX1I z(!ngZ2=Up7+ks{!S+R{hpPAmlMeqzzWAv*@DK9XCG}NiK@gb|tc(2TL&)rBBuhUAh z3ZXa|U2jF!;x%r7a$LKZv}Fiua1hD%Pb6uj>Kq?)uHsXM zW@h)VlR5_YINN3xd$GGwf#CJE$KPGP3w=mUyqclE8ZrP8uTr#gTHK8YkEBrpU7xmE z7Zoh~Cp|Wjap|SJgG4QRXfY<>@>h5k|Fl1C0Dxn9F3Ea-+n&)1+~NCH+*?X?dq;Mx zge3%a8F>ly9A>MQzyB&(^t;}mykci@Y$CBXC`DeprJaR61}9P0qPj=rH^b)}#@C8) zX7wl%dFzy9F>~+zGA(6@WJe3DsDYG>{{Pw-&aJ4b7ZC_2$hkP8trNLW6Y(EK_EEPm z$z>pnS^J_*mOhgs-ReBGq-H}{VWePL@KIGtEQU#kH zh!iGr=>l|Z4+**$n;aTSeseMB7Fh58ceI~_rXTA&vv)DC6j!hOiZal@uWR`~`-i7P zrG(MTs&T{R(>BZ6-Ke;akZIztB~tim6pIJYsXVrodZ!%7)NWdzGDP8aRLf82UL@W# zhZHxt(X!}`K!CS!E66;M;tM9@avH&iz4@|VNM{}}Oa~%y)MacWRQ^Eq{h(t=z>JjM zpHKn*4>dhEfMG%REU1ucYMr)O{&4sWMN0e&rpW5%B?tSg|0s+iuBW(y3zZdvXEG-j z4YNV@vJ0p^^fGJ525=ENNfS+yo=+oo=~ig4n!W>izxkL%)GyNT>J4kVVWWd=?QV;2 zRz`hM#01$iQ0i@F<*WTSPIk=Q)dh(1ak$gg={s#X|FTx??}n(p_N5W|vSr748HDBM( zzdR(p44-MP)-@E0JZY)wQW~YPJ`Bi*IAT8PL(4pm=IZKooC!Ve;E-C9p&42(Vb?hQ zxzd|gd9QSsUi;prEaD8scY#S3tIoHfi?NlUl>P@1c~@Q2ooP6SIn~;u()Cv{CfxQg z#%-v3#an~c55srIEm0J^LyyE2dcnCVUilVA)V-H~bv`X2GCp#MDvl5Qi$5K5`Qx!( zTW~M8Xz@(8D9;jN(QlnqUz75$z@=i!9*fQY)I0?@xCABX6VAC2#`rL8_K(OiS96T! zR>qa>N2k?i#j#{p>BJXPpcFN)`k&h=x2FX^DsAp%Fim5tAzUr-wVf`{tLzt-wZG8v z51V&5`&m=n^wk^;L$3frN;}s&-RkZ8lgn{Txn8xhOPQ}VxWM1F?E*qB+q1I#ENaX~ zJTju_dNMoOyE=3I_XmoBwsv1*JSeH;RFiTQ6)|8s+ewKx1d=3qm!(0j7r9>^HGcc^ z*D>phMqqSwab&@{l{Ak>(SsRRo4Mwc7g*h=v7N{ai8>9;)pmx*(?blak|3mDo}{v( zwaRm0Jqn5kTmQ^M%IQIKMulCvd{2AZvtBN)JD@ib^XK%I>*t=3hhR+Ku=l$OpuINU zmF&t#zaQ4%Rf{LoBAV>f=?S?Bom$n~Cs_V&6uUf-^@G4Ra-YLapT`d=@&wXkbjg~z zw@;*eBGeM*A$jG4S%U8CIcVV=&@*bS?D4)srmp0ZF*Aa7DNZHo=5lwgS75FMnB%wj zw_6QVZ&#{Q#b%X6L_y{C(`OAy{nJ&(*>n%#Bl;o`tSBOX`_uz%A1L?>u7XPf=5hc7 zx}nbx&M(@KbnO{TK;X-^a$t?R^e^Ntf4?7QWkuJ^U)VBzL&aM4J*~*}!KvC-J7WjV zk#b-w)D;>edCqgEC8Z30K{4h^${*m0O9s&tGcS*cGYnAso0#mNGmo}bl7 z-x&e(4F3)9Ed{B_m$N8vO;}eLcht>JT0B3aBfZZp6W7f~YO6Oc!uo$`@7R>glVlx# zU0x-{MmPmgS|A(4{kVOjMK~#fd7>{_H=Gn^;b#5TkO|PVG$}5@om2j1-A{aB}aD*GSn#LyuP zdt%kdQODB%yZq4c`RB=5SMB8I^r=TykH+!yEUh8O{-PELMRjRAR)u$B$-+>%2*fK#C zVZ1l+n1Y&(-kN{Bb*uB)1YtrKSQl8B9{p+;pKY-pn$cNM>@`mo-ykYwdww6Wnj&q! z%oRH=u($4*+KPI5VI$CM{;h4gcUW9W9<#Y_W}TGO*a1NXRdj2oT_a&Er!V5YodQD@Dyke#=mQ2Xhs5%vj)G;bhFiN!HCYk|sgTn+-J z3~hV5=4#@FB&#nlNf3h{+_|)`YSBRxMdkM$&KB42h9cB1ST@?TXLo0@qfP@1;)5m?WbJ9P)^iSMQfMJg+i^jN!&m*?Ot%Kn zyE3Xi#mDsZfM}MIgp6!ney?(U3|S3d6W%}lBAmk^oxb6JxKP22C>BE^bU-;O9#mC# zG-}yw$NgZ4o!i9oMTY+WaG?{2e<7mA1>#l(xM~d~w~E|cTYcyGk+w50*>pzL$m<4I z%HRgd`%6PRPx5>{#Ow2W)=7!UJP&SWLlA6dHeFmB05s3-&#HWHWytV&kI5%p?xh)B)u4pj_T9k?};V*1=V2scn&69gud#S z4l$1S(~zkvNg=q1s}oO%Y{m8Nd68ATcx|DNZP9`ULRb2ff4^j=OPk;|g1`mmI`3A( zQup>9r%T&fZrzT(+gs1$_eX5`(^1!d6xX8CCzv1!Y27${_~K|@rC7_M(1Q5l`Puh1 zjrh&JNTpndjByRnEUI>RNd5JkEM9{%${o6C`#AlF&>{783Vx4CpgiCqo%9~fW0tn6 zqPQoZ5{82QeVuGNzzv`iS*UaU_CEiPI#(x=-r-N4T28L}K~1Q9gM=1)>rYu&ur{U|jE>e(HuOo=b(*i8VNzdY$~g7#b67v=`NLV{^*cFy>g)IcibwUmWroTym~c(gi1JYyxQHl*ekn zG6{=kF;l&NNlmB8`Cav7sOQ>Dc}R)j-j-Kdgy$LHpACjLexkoYbA<7*-^X9p;#B6$2Ak^ z<|AIiKDL#cl6!T{KP-$>E$+7H^-8I~#U$qA*?K;Ew0BPbv959RHgTm?E6r@1 zz%8{C?Rae{9?lN@{RsViiQ7=2BqP6_qWN+qDI4#u@ZE})*|@lJv)PJmJO6U`@<_ur zb+=IO&Uzw;It{5hkcrL%%=6%TQsa}D*Gu9GYZGbfgq36;q>3Is$G(GBQvN+{U*m&2 zQQyS1)=pa100M9P(ZtO^IU(Z*x>AL54SNqB+~DW@ak<4o0X)@gx|z0}=o`==nz>!7 zoQ~_Uw^c0V6&1IZW?MMaq@x^JFLhM~Y;JK+WDlM~bg}t~$lWpTVJD2!GEr59$QZ={ zn>!B@u-zEOY)Davs3UXn(ws}Ax6YT-siF7UA?PPLSG7v_xDD_HZ-Gi%`~|==3v=sV zmbOkDp|9cap(&*Llnt|8`~IExieT^$s<+9OkpgpY6(8J8_vBHHp*U6Rp*5DH_YRqc zZ|3tzDO+Zb&rGLQjXBcRpv*GR*vMlVaW*7-)7-)20Cvf5a9CzAYt4l1mL}&I^ zJh6BGQ21dJ7~;Ogiq9P>%vDVOEwb#15%_rGd)s^eKZ>h0m(;{pNdQac^hx{V?ur?- z1tw*sA9a6q^?1|oIp(!`dC^tUNA_4bM`r_jTi$yA+VN8VG|yRs;nv>E4$P0ijBEqn z8o-s}^`*I_?5H!p<9KmzS;~|Um$pHOOTk#@VWpdI2Gdg9IRikyLqv_lm3}_4B-2N5 zbemmN;HURmZm%_Ih*aTL6IY;IH&$*T_TgGoA<71|#SoNxpTu?_H)Gh1_Yo)fF8A%c zm3K!g`~y{6T-t?QZ;W}pri84%{ZRxm?FjMvf_Wjk2TLvH75B>Zb)XB_r7@4G>=}!$ zmhCCIO9|Kp-nkvw(LR+kdB@VRhHo<36#j%%=!G+)F=;R~gt1NC;`--7yU(0z^Stu%~DT2CgeJFHY8UH4)wMD+lESMvL&?ofas593v zMlZydAJQi!A@6fpQ4Q^hjc4NP8SUZH%2y$#5zXCrf8DV(gZ0i^wJ0{L0HXu@o@KGaBBm%gE010;qY&+T&?2 zPnBN2he^P{{2a%zre7LezD#@GNUdXfegBOmeul}wnVD3flE$H1JK?%MwD~XJPQKnL zn>|{(^FbvHi-mRwT}~u)yN58_x+w}CL;*<*8R#NkWv!9lCk(xc|MwD0MbXrE{2oTa z_}k6oplwSr?$=fh?)t~i^Hwy=4p+zm^hKoMO^`pmaeW=f3tPd@9HmfY0^was>%0>A#r3$oPEt`p%{8YKDo@V zk)pKTryrd%puc!Jw|?R6|G3a@GBH0*e0^$IX~9t(HQPP5+`iRdXh}r=byALV>O%GR zT1cUtXnBf%v6#ZGNby*i?(m&rQO8^wZ;GoWvv3plOVzLFdoffp&O<6Xj8`75HeOu+ zG4vV1l)!iAS5Q5Re2v%IIWI`6Y+2^bg3BST(hEJFj8LT=GggiPC6UNw;OZMkfRO@# zq|RVz3@%!}SEE+nfzgE9;d^dEBiW`Ug6{7LIjYY}_GgGLVJxres}=|7d?q@b?0g3< zr0i_T-B{~~GCDd@>4=pCC*a(wT-#Ni)1AK847)=sE^XsuVJTN1&lRXaE7>W9Hs$_M zp1$}yx$W9~bn&C>lv|IR%>8YSy1TWFMhdDdDur(6Oqrc}E^Ywl_ljwj#~eFn?i? z(+#4}yV`EP642mg8qc%nKgfJ6pMS9begm@GKpi~^JQb8?MK*Q2m_+{nLRlX za;V=jJ!jH)AX~+*^X|D(WeBnqvg||jn#Mw1sHHhnFIA_G_m_u->OM1Ixl14F@pJ4K z1lBk`BwDs$g}Hv7q}-GZeaG>GwX$-josz5-dvZdt2z%eutIYaC@j~=J3Qo{I({^5S zlRI0Do2TD;NpZ)%MUa#&#u(cbEbo^sWL@8E?EEvMr33nSY3{tkTN*HdnBXw^{qg^Hr zM-#8Ko4!`39Ud}$Xu><@LE0Ho=b7o`uh?q$&b?NPn)J%h=J^p}#1aPL-XZ;?XP}v& z%Wks~3pNWUC3XHN=yRs^ZR}J*SZ%lfvJy{ivj4TEOESQZRPehS8RIM z*jT>(DAyYu`l}qNA2~c(w*6+%#nGT*8g0V9#n-uJZte@Cy5+y#!U=Ytl4E{2q(1!K zW8(3PWP$6UbNBP;vzYqS9$G3&t$VBB*-f$Ecp7)?|J(-84M2W3&1*(Smj8Ly%V*f2 zty}7~8z$VNZq<_|@wA}$iFE(f)vtp}Z*m)|&fkQZl`OOMDxtl3#}^6JC1sXr626gw zC6(uX24lVDQ&yhNMkW47ajUk|;@X!tBiI?O>p*cu?W;U{{{<-uaDf{qp6X5{lw?@v z?7n&_k-YiLtIWGMhEi!rGu1uWMm)fWe6;v82s(3;wY7$4FJEkL279gK$vb+_7GmZ@ z`ZV|)+=HD2r+0U|r}-+gF=UL)Q!p(Yh=oGF&Fj3j?DDE+*X zj9%%}V1*g#5^`!>BgzN-LKMZR-bGdaF49mQB|#A|Fca5y04#MtI`CifLW!Pz_CvO( z%*s3reZ$6C)9MM=Kz}g?TISck`_; zR<1u3@qg}P#bnNE&-<|roB^8QwurxivzKCcEY+eB!W>_@Ymf8?n0))(O% z(kx(lbj_P=M68cJPGL7e0VR}YXZ&NmA4&mBdBs*lkvBlh3~alV!{wn}rK1s{aoY7I z3qLYtvLAM8?|jJ-=x(yu8<00?C&Y1{*I|fjLDU^jEq+*}83=G8Tt?BC`G)$dzw~6l zbR%`wGyt|Ed#aEoz$qaqC4-X^K65?5hZrm?Ko3l z8{REhMT=AKpeFs`&9}@na1Wt$u!x7SUWDMqW_kq(^}F7aC_RmcW;JiNU++2x>fW=q z34P0Yj`pQG1)pp?rNz;YSZimE_4)NrM7}C0Uhmk@&@N@^se{;E!H|h9D{=sSbcF+p zoc)OiQ2js^oe>@t;{{U~lm|=qpR4)X>v?-lkJ)_=yir>lM_Kg2t1`_XCyM1y%gW8q zGj+Qz=j??Wa#|I#Q{`YW$)UsZ1%$5Hv6v1h!^YzzWqEgR$P&E>RNNaXgX+qiJ%pl! zG6(xmKZvy%_{oN3{+s)zCUdvjH~Uip>)$G|4yy@U}twCD?tRzP@gtI82L#k*@h{~{}n{uJCNJTuV^K>lH^Ea zGA0b5zjz0phbPnt+^4FheR}%6Dv}*qbn7dDvB|3j(x6{8rowF(XZnGs82&qgqE_ST zHkPf02n>VBf_ZAFnhJ;cVfJ*fqxXcmT6NcFoCM1^vPG?k-zD2!fzEMj+YwHbtYU3e z05BdYvE)=RR!+5&~d-bmVTt6)t<++k1e< z`_IKP(>hAb)|;)C%jy;n8$0G^KSte%6t*Y1>CD!0P0_yUxW-#%YNw%|owC})HTs#X z-$Z11e}j;qnUo=PBUwh*7Z9*rES&&5YR4<|U)EM{0J3BCUyME{ z=T(jK%^gERpADfdA778!UJQIV{|Vq@SKsCzC6H@Of|(4lD?$M|Qg!zVs}&F0q=}Yh zCg*5-dwZvgcxlzBfC>^;gIUhmEz7_$q~aItW|u2aRsO|F^yFObX@?4~$0JPQ`R+_t z0Kq+F$uhe1rP{CG{-wz+{Q4p@{ux}<&Th~xt@ZEqu zc`)c_=`b?>dM3v=0f8gLe*C4{ub^VaEi^dzXEdF$u$UzXXCXWfKmQrqRSJ;jf?1h zy9&g$Qm5wgn+`kfFNwwV_Hf#|M}lTR(9!EYF8Rhe3%3RzH$A-hE#mghrRks&q4dukEML+{3z1&kt9Ysq zsyQQ~^pHZ{N`e4d$U<$=o&B2HN!l+$*=g z->^B5I(H|3Ds%A$y2A)Hk%6;cB+W{am)wEpJ&16s*N5eW5(R6p5+>s)o1h0 zk}QkHQuh}_WC88=z;Ex?$wCN6j zMMQ}gG8p{xAHR8?qj-`7hv2*>aW^Aes~bEK=5bD^9*7=!E$f`MjZHn7#6Cx!^qpIKk`Qt{mOM<{qnEi3=A zL=p=YrPH3x)gx}|HTqb+XDDySRl%)@BcvwFqD$>WS!oIOE85CHbCL@<82fpZFIFww z+uvCjF&Dg&S#7@*Pq(=g#lp-ZAbW77PZ$WB=ObFGd#a2ouf^_^vhums`^>DcD9={f zFX;Q1y9uL=Cvvthktk%&##~zWojxE8xpk70_tbX?ay<=hcCimnMcVZ9v$9waB-7$z zx;i25Wz<$z5>644;R8jt^4Dfl^Ia;2_)0m1!{7Li8wEJsM8kP~RwbSK%m^DFLuwqH zn;V?Qyb%(9|J<*}3fy_gLYnz5@^d{Z*I6>fk5x=_D&`vZGTGTJDgtbx8~hg&e3uZ? z&!GF1;8e2~uD7TsRj)oPR^ojp%ZhWTai*J*R2jaOB49qb=K9X*w?VCp9w3ft*SHGH z{f<(no%Pypp5L6=vw!e3>Pd!EC0e@v4_hgC+sZ5Ko4@^M=gb&CjPj_#{OtG!|(^>jZM+#JBIIi}xq zwM|c!*#p9LlE7AYN_{!ee5d8>KUrFMUwU*NmcXAD=tVi08&*D8=o6TlERd@GgLBNk zTad__@*hQ#K#$De-9z#q@DnOGIL&it5B}#9z%#^pQTV3+#dDBYf_xcbA5;@lw_;*s zq!EAlfXJVCH}%x=%?qk$;;ciXX~syYQX-|zoGNA6pI)}SQ6rS?y_d!^r96BW;-5)l zL;+2rac(7M3;dLg-s`&7*BcE(Egs{OWXH8Xk&Fv}j4E|6YIqu(bB#_v8a9|6(MKCd z8RvTe=1x*7HEzi}JSAJzN^w9(eJ4?0+iC8!xY)=p4MKc%#(%At?%y_QyT3W2&(fKm z98^Q{v6unC`eu1v#@BRA+k~h?&)~C7gxr27uIZzC<^jak*Cl)2=)$ld0Yx9(@@-ZXyDD zUI?S4-77jbjyWOvOr^ z-)8t}B3KZlwrv!S>$*g&LDlFsp8p1aI+zA7jXReDd0UaffW0d$HM$bxp63~yMs-E# z`78$AxJ&i{TKTg*r8284F1(%3_6 z*)n3(F+g0s2GyPgr^f;5(|H)b#iSfbD4e?kmFFNueNkOme~$E7^Xb34irIY(`Fk(4 z&aCv}z>Oy$`9j+r=7N*YtRyS76aGyjig2%%yg7A4?=M-0_GyeKaXNizsMwD*0+hjHw!I%Gb>sa-q2sIKf zi*e$dY@)k${Z$9lGz|{?rUvJ3sZgj5DfTo{t%XQk=~@1+`?>B@asI*FwI%G0X3{$; zWX<)lcaJW2Z%ewtpUyOMk{^4^opbzd(C<(3CdZmCEJnoRVuq#k%62cHn0>k2me0F2 zBYqqEK0#%F@!^M|3zF?E$eyGkwYY(^%;oY<8FteS0aKcFN9#f&-C=*v6}S<@`b3eO zy`=myXTHcr!Bzb|V=QuQ)?+4J_C-pzt zfVU#KK5%#GUz%g~s~OI$18VO1-?Ma6L;;<%(#~fLeUfQTQ5E9y-6LrP{GUjpk1IRb z-upE(z@U6)?f()2{znUFD;c0#L^Rt-ShKzN5%^jil&XSKzmOw*&>*T{00Qpv_5INMUs5D&5p=x!cc&X_9e4oz{$9e{hVaEA|+&@WF4Q=dNc8#;YW>ASN+-TkUirDfl-$GQLCIM*5+ zFEl2UJkatZ->6D_cyVj+bk3?8?2!r1X?9l?3MI;qU>x7+myApa4O7L^HpGi*awt)_ zeHk8*j+d*yih@zYTH;ngq&H5qEPGxTX1S$1`oyBF*N;dgKBcs>qY3tLx{z^-`NLn16KS~;VSNLiJlmU6qSMA4VuxO+i3`Cc89x*0hBTAFX~ygpAFj>R z(h1xQ&Ma#4yz$aakyRwQ^O}4*&hPUW&i0sL>Uuw+?`zQZ!?AsRFRqMY0B{%O9NOIW zS-I8VHV9c;5bC%KQK?xe=_$(3*I;h$iG55j3Kxa=-O3Sy{LCCaoe-fj8J(-3R(^r( zv?_zq8WbHm1YjxXT_+hHvWdIp7%(HG;L!n(CoA!uFr@xoF{gMzM=y~Zh7D=`u>>K}r(^jmcfW<#bl`K8i-O#A- zVssi)x2d-eyzG9?Wx_4y-K>TI@wwF&)mvvkB)uXXb3YYP5Q^Ull7hl(R<^GMJz7X) z8TMA%L>;Ncua_=SnV zWTmmqMn`1(*~;EOo`&B8la?3x$@gZLb34ir^x_@+vo*`jmIULstNG6H5T6<+2M35> zgRq?~yFkk$YS_`f-G3Cfx%h`i9Y%cP zz-q&j!MpcbDSShfXi~+?T1ocM&v5OAU!B@Gn9tqxK2<_Rzp3)(hSIj0vbA3bQeWfn zsK=$c(J%X{5En!wsNJuzX~SdAf598Ga8EkP+L?*nJQ-%tD;^$_ax0$l%O1_6P}K{y zYfxDJQv!89;m|Pc$$MZuC;Re!T1y15u1#a>Wd` z9;izN_8Q;B3D=Y78`|G~Jf!|UJV8hfpCaLw$}b?Oa_8;Y&s?|bOPZ{WmK8j56N9%; zW~Bwq3C^)_)*6_Gbq_kI(0ao1&FT=u2YT;%nbD`cXCub`daKc|702~4Bu$#vUO~Lp zQ8%BAooD2%Dy^Pu0}r~~a+5VCN|G;Gu5C^VnSMeb8M-M6hMm!EcJq)#42j+yh^+%s z+BuhfxNLyuKnS&%p1`lhi7o@`7Zt1camG_Hk%A~2rg6FIep86`_8p zsI?PRWn8XOXRkdxaM%^n7$Lpjj-1b5JE>eXQUFZq(2&ZS?ZyW8vWey6T8&s6EJM#v`EQjb*qQrj-BSu_hTW&?xC{eK^&Aqk&K zl|AI9=d5>Kq1yL5BqK+{RvZ^h^rku=;F#iX+P&gcFqGYQ;fkSCe>)$UwUTru5_{zJ zN>5HV_5jO%BY8Ahn9w#QZ5!kp$zNl9*>?Y3P^*v&hmAR_lam}}iy^80n`xSYrz z4N`IDl#dRrUvM0pg|~WWK$?!EqB;5Z z`LF#P0b`Kx^4Xg&6%$Z`q@R^C9w5C*2ZKV^ZS*J z#tXmL3lha-FUl$JD8h)%JO#d+sS#C+79Cj#x6R6mT8E>rOId%WHa3!wSBoS#qlHHUMK;w{6NmREio*jABsHejpBm9ZbF;|< z*O68l{fe9#n^hHXB~nz06N$+Tea!2p-7f*J2~qtDQ1HUPchjPX@<_xyc&EPH5c0z3 z-YZk0qK%d7o%bQUJFl6lcHf$;GbHlt8GAy@L4 zbFlu}jx(J{G0R^`(D7i3Z2OY(0~;$kyWsblH2%>?BIsH$Oym15k(xnF(&@zO{Tb>~7)Q%f4Tu4Q)7wnc9#VY6*9CNj z5Dsk!`}-iDTab_jgO1g6`lbgK1wKok1OivRc|-TY{8l6Am}1ap>w~CVaB?LBWf0}u zVw{LRh#k1?oNR!ymoBh0wTdena*hzW7=FVn!E^LPlY!k(@KF!Ll$Qr5G*$s;7oP;?Fo`&svGBB_7oDmZZWz*cbL;+oG<*bWMoPNg!Uq9sFaZgjI$$L!O51NC1TLma*talg3UKocwE~1M={yxPtLG?wTb-GZm@~P#nuv8S1 zF!-4$Zrn06D)oN4wV?Fb-}&XC$ShcHA0N|nr!zxEN{xrYVraIde%PNO&T->e(=aO| zk?)4#c&OT~ppw6@7Ed{@C(EW5tOjgH(M^$BR)N5sN17XT=}GRpw;Kb(Az{&gI9<%Z zI`N%r#av7MDnv~6xcY_oq{9x@%%^0%W77VkSIz!QFY@zAGJD0MJ%$vvx%=P)`%gg^ zhSXV|2$nVEL?5q$O-t%p(7(6zUw+oc*Ot|feEv$Uqua2VH$fbF-P3Ti`|yB?6SE`Z zjM4SuOq?v~ZI7jheWCe%Pw@zW@L4Me_x%L%(;;> zPh|*R%)HP5a28;_?Z?i?MBKY1BS*FC2GZzAy5C*akQ)sFk)>9ljF^BQ;ukbX7q|pr z=uOa=jZ<8I?n7`b+m2*?j$_EzB|0ET^#$Lf<~P7g^X&{(L)bg)2fM}BmY(w-f=As# zvR-kA_~rBO?GN9fMR z&(ixZK69L_+vm^#1*M5Uy-O=oCqSj0`gTz9e?zp+azFm>8 z5@V#`eMD0kHb`{t?Fx88xX3|PK_3iz!D4VRw|%U3GmCoS*3BkXy_9`oPxyqU$hOQ7 zK0WW|Q>%2`OU3Q$;sxHDN;fJg%MB`7Y1qgoVa~_r6A7#8d_PH%&D%D!MhiL*lQy#K zd%}g>BCO7q(!O=`5+XZFVO7YQ;lFje@VII0@<|ihawpHa-o@fEe?Jzf(c5!_WMV;V z!t5wGyM8r0J#BKKAinVpNS{*^H~gl-usWm4R0Vqz0THlu{@ntR89N$OtD#>zjjmI* z!>jD_o1kM01+BgO8x1IR-#z2t`=7646OA+v$Q28--&fz7tc)w)t-Ln&bML5=+o;aI zMs0u2x*nB-yb$O!A+nfEGg~RYJWG~882cg4qDLtY1QwXXEYOyaCM zW|}9|w2XYW_02B-P!?-h$}!QbIK$ARy0ajA*t+ZseF4Fe_pm-5o{%kYF$Y}KWv$EH zP~6dQH&)`7oXKhTyN!~)2gxqdd1Q970yePStOi&?L`sK>e;HXUhYl}*#(tBJOE6Mkw}G_XaG0T8PZ=wQ59Z-+->mH*IT7*sDz+%1UWwR=Uj|xUl|41todi7*Cpmv}V$opO3pz&_X*3(I zc@^aRINq#Wv(=z)_MuoNwI48X=&IPppH^mz3+s(juYcz$`nWlrnD#xAjwqeb%xiq8 zhd#=OI;!i~-RmyI2XmOqds#1qs`>p2s*3zSJiT>TlkXq5kD?+{qJs30?vRE7q7nmP zQX@vFfC!^=G=g+VE2+{kkQk%8ksKw>M&p2yBR{`=pWpF3f877?IPM+ybzSf4^*T>R ze`O-#I=z=vyLlQiV{JXS-X5FdKF^CPIz~K|WIaa`4|q4~TrFuFxitm>vna1gy=d5{ z+Dtz=i{agcsRO66Qn+yz%ADiiP$HJWZ|f!@SF>f8rmCkG|7TZ1kifivf}a{UCh%bjDQQ zR{yyCgT_MZcUtXbn0z z>tK6AEFNH(oAw`?8QU}Y@4OG;kxP=ckb7suNQKUk+a0Owq_DhYH*=9kh~oO5c027K zGz)v>gGpZX4i2gVa+VQ~Eel>lj%g3mJCaeP2j!N;@0-6l_H69KR7M9d;@cl<5|VsM zH){99bG?+TqM-n#%Nuo7fhWJ~gJAtBm9~|FA$GONHBgwRH==ec!zp{U@}WN%EqSf; zv2LOu`)ZpuI`wU=I(z8k1KX%8;Z^geJ!LjlB}?{@+b+QQB0bH7vloB@aDl%fgzy>ww62JA~bz*24-2<>ScZ*8ne3s|A+f^Fue(8_vsmNo8739!~s^z|05xH zaOOg$0@Vugz6y7JnJa%Gd*`-}M3ThFb5~t|O@bqAwLzF^zL!)#1jB8`@WnYUIyU6I zV>7o=7Q0mE4_;BG*-|1wi?UDa9qwR+hS>JMD-}&A+h^E|TGVZCSNuofW3WBMte3U> zY7ta?WYQoxe}-T#-ft7|^&vl)C)xxoD5ok;_{}|^2aS)hgvQGazrT_m1M*@3kw(%M z&l)aya!+N_|EN7fm5GdrsYxW~7O;^Yh~!oh9_vp(?TOHAscI0v&e3=sBaa1AwTFgV zxXSH3VGm-XF>SnumdEH^g_F0)0=^Gv8L+rOI-C3cN21X&jNumu98Jq0 zE}nUNO@|`T^A@(sz)2w@U3vpJ>Z@It|L&+_de)5QyNVUkIK=n13NT)Pn2#Ve9KU+& z;i%PZ8nC7dz-1Q)qVl@G3Y0_Fh>d??peyZYcdNF4M!I4v$V| zg7o`FYD$4}Y31gh%#YlV^eGLw%_-KHbm6qd7G|T#6zadJ zxs0_(FZ`^>b4mF?J;Vb*XEJM-9)38G4IIc&19~cgk=6viE+z{E9ts{yx^@(<;7O$F z#g+cl&E&l~KivepqUpY7Lu<^i4YFz%g!6}dpNcwnA7J%!H~h2kF4<0*pk(c`=l*3> z3@O2fHfnMb7O4=#xYlJ$?JUM8VCm9B5S+vT%X3EdLj!TA;RO4c24aiO^4`Dq=w$ix z|42+hKwsh%|71oGyB|Id_tU8%j>og`G4m z;L+U3aDLLfpIjg{Zzxk&cV9QHMsl%Hm8Wy+Y{&!b{3qoD(NUQWFN?>MH{3)fv!GW1 z2mGUnwc6bKXXHlPJGW2nIFGaO9YPZVJJsw@1;xAxGamuW6ge!TwWM+Y5u6WKgQM9Al{;rGGd|&OV36=T7=L} zw$YDORFh-%n{wB5BOd#5OEP|HQGjM#&N97`$>DKC<$%Q^k;xf2#9b6FqQqegwWn>` zmM}Y)_?GgN7RCG-%dnCpN5W#b4A=@J|BdIEC71_|QMQ-;=~d&5U8~|HnsRmhmD4O) zI#y3+nzu9Da_v;_=X>nw{4Xe(d#`U*SohyF!Ay&W8XjQ^fm&KHVCEt0P9CY<11dS_sD1uh`G9oom`KsH^P`TMwXq!^TXd zm(Q&e5^H{9PrI4yRy}TyLL%x;C7Wpq3HN9so}!*6p-u;a7DXBQ8urbI%xhMPj+*ex|V#^p)cGuILOw$MN}3qnL^V{erm1_skD7_RoSdm{No zZ15rJ?OW&JU_GLwceHaq91oNCswvT~P^Xzi?=|6;)PJy@|I#&B_t?X2Rzh3a@;~L{ z4N_&O|9AYuOnRV%40CQ0jQmbaa@fY2SpnS&Fj%kkMBcYFg`r1^KFVv8xr~oHx66jv zf`4gozh5WYKk4~M@auFXL|_ziBa#haqO~;wn$WmGi4YCoJ8@zkHk70H_{l?_bZM~L8TD&{}<|S31nefpjL$AU`u5SU}uj7I& zLU;v*mNIBvd{CoNv{xq&0WMR&^%tA)H?qM@z4v0#vLD~Gu~E>tc_h{m;g64(FY-N1TNz0yTEKkpK{=#vfy&nNoC8kfLpEidZ+n{Y@ zYu)@iRXD2jWJDjlIN_DUvXXT!TD4y&N1Q}T2}^M|rqI)Cy&>r01=jy2xR4h zoyNuK>M8_EkYXrgF>s3kmtgwmz&5m54zVM@lv`|nmf=xX*9JqvHRgGy?~f<_-EGjo z0%bUZq4qipbI|q8nTsu39f_aXlc%ungA+Bi$zHC}_VR+Jr_SDP%J;WTd82Q*=C>~j zhW^?)v-Dy%cpn@Tze1*0DV$P1R96&8L;fK6Y2mHC%6wdd-ieTW%>FDCs^~&;T+z3h z{uwCcQvj0>+o*e&Hb(oPX}y5`@?BtR%u2!?D0~JZY5Le+(9xkIrhgCK_a^A#S|FfO zKsTluHHsP6vGA&$W*u^)0EM5B{0MU}PyMozvvo_cT1QN9R7r%O*3~(8(whz| zmg;sqw{ac^9-Q%fANcWAhza0Vvl6GZ1 z=9i;^Z%|Pscq+c>E}j(b`*V6`!wpB=!slr?n2j@+e@DgZM0-7-AlI9BiV_B}SKSZ4 zNy$BIaKg^|LIMI>p8C25s&D$l`iOgS!u&?T-*i>!e)c}mRVDeq51qSeT|@JfBd)w% zqW@B#m&EVJP^V%mdDO8CI&2@uHTWM1M|^&cGQwQWFgB&QN!xK3jhE?CODR(^YU7^5 zwNz9(D>wu^#XoH~jff!T>fFIoqS>37dX1BMFIH9<9N*G78Dv4+uVkj!iQ90Dww6Ks z>-v5J^$tJ;VXBP@@OZ(WY0P>`cY19nJ&xgP*13{ug*b5>JBoA@AHWW^-GAkN{oP|u zO_LZO%`xE&Q966;cK?L#5b64@*`pLptN;CIU=istZ{%G!vM4#fc}cDNiaa>w=L1Iz zJySJEiXnp8T|vsvd=cTdwSSKw+Ox!qK9N2+naZ!bc(>?LGx)Z*XzweD+z8EEc{U{C zpr~E`rm50m&UD8WS}V5yJrp;EkD1j5)I6K6|vU>_d=dXErQh=6>SI3wWNo@*h01+iJz8jH)jKb~Ku@1}E_ z(0wi$^u#&9NSm%XB7tIY>FPzz82gkSMP|crv)*94=r{LT>%_?ws}inT($eeBu7r?(T5LULDuaco*{HQQt^oLOG#s%2GSUUffKOEAX9A1@$WzKNbMK z%tA7zds@C*-#(XnEY!SX><0{ z5@h0{<|iR_McBJ*&NF|m^@jy4@^w_i9XExGK+i8Zck!OfArAhK8AzXM1Ld!mP`Ia1 z`A^sWJ63Y6gp-86jD)x(*CIlK)+BBtT0B8XqE=)fR%Q|C%hv2!F(FDt=p0?;j_c`} z)n;}-7vCHG(_Qn<*E)lBTXlQ82K8O{6n=4FHs{E@uL@e6GK--0Pa(Q>ywX*Y(ciZ$oxC=)Y#BRxU0h+Sh2OEluZ&tIkF{Wt zYtakk6}S3dg{T063x8o2@@oS#E<8C5iSXsTm)e>l1D8uX$c$v?)ZMxghZfhL6F>tZ zoxhG?k29_*0@?8QXA--9eSWwjkLi=jF(%{}*Qs66PoX88MMSJs&j1b5+3hQp_Bx}-Z90eLE z@GFr-w1Sbp6wJ99;c`3#WBHm|qS1s7ty zL|e` zK|#pDe!NlVg+&ctUH!P|>T~E~A3U}!q&<(vTQH=a{q`-{Q8HS1n;Aa7(%I>vF1z%8 z4zNpdth#qQo{{CMJl});tDin?GbHChZJnPF_VtnBbQOpSbL7%xd(I z=qb!E*i=-JB?SfuGQVuWL(&n8U3n_*?qZPxynh?q@+zLnDTn(em`;E*bjU@!%zYK( zHN_0D8zE)oD20H00(Er_tXB~}^yqx_fdUs8R!j<7Yaw_rjozT%G zQltaCvO9-Mi5E5Lc_*#)aUXno@o7W{B$Dp$V1v#1&AH9f4zdUI+) zRH4J0G|8`91Y;6}WQ}&?r;>g0u3kDnAnqwgGDT0dCyBAJ^R9Pfb>w91?(NEPGJS!P zGtHnt#}ng<;eWang!Q=8ag95VXxQI{ChrIaZg#VYH4;1v?NHK3JeiKS%O9*%l6*+E z7-T#4-42>W^2S%Rq^jEhg3>cah8NX#15#T&8pygvBU*{d6X8;rpv!L)sI-|-C~uw5 zMNm#i!sjbaOu|EW+S%)a_3IxE@%QRI8&mV{Ny%E(llF7N`{YhbeF2d`bGx5rD(`KJ zwLa`Yz|SaRk0zE8QS#It45+Y)iLW7H$ukH|ADN{J_e(c zPztw&!mZnAJe}DgA3qpX^0GfZ|Cs6IZ*Gg_dxvJv*fhwF=5l3`dq=LQ@sG-C_Yj^A zY5N;guuRl}IEd@y7!0n~ z4cMRu{wioEY#m-W7OOzXZjach;sSH;?n&t z!NnC+Bn2lrE#^1fmE~~c6D~he&$8LraU+fD#9?s&>o3xHkLGgBz@SragL?np9k{y zltnNuN*~BL6GxsAiKscdJ&;C7eu-l-NLK%Tsq+hp3tACY6j}W) z*`xuXuzJ>iOO2!-i?Y|2H#pG>kPbizJTm^LjakpvOEw$d@V(;SF56p*nlF>MVI=T& z69FU0`$i%7X{fbKI(#RQ{{C7v07m7oH+7e-F>8A^tmi(4hmn2bBz zHE!r+6st#2?`D%iA1ln83u;gCR)4h4#E(TrGDZRK7j-pE=i%fZ%0<9*uBT$!~8puRtDE{Z!#iIwp5 zm-wXRIVhO>VEwg#c}54!py~NKs=GDysW0h4^&YMewr8&tE!+et0<95rySGD3R`-5 zaFQ|?HuP(ulZ|`fey^gSLib!{tcZhf1yZAk&G;_8+S)BNYny3|1)ewN1Sc@HcYLh} zHIL@_{^S413TEfWF7Qj~Ez02oqS^`z=rdVw`-O?DG(^b~XgNI{nOzywUPClH=ZH-M zDLgUe0ylqVJNVT>1F^y6WDFxZ>Td$2l)Ee=ayanxCB?0|9y#Xu-1*7RjN^+cRnWV* zcqhVR5WZ(LxMHK~=-0%1uOr_TmYg=kyH8BZ(Y2YE^TKS*P3fLP1;tDM$ouXqS;Z6X zP#)>%r>tR;uIR3nD>mN#)C^;QWMv;C7cyejTMC#_6_rKWNmCyC)UdN0rP^^xXllUA z)kTg+;*9SKs=g{VUi%(P0-=TQX;y>n#-*&&v-$3ia=hy2)%TuQSsQ<&ESQ_9xnvLv*_wnE;07dL{xmX%9GJZC8Zh91~hnjVn<}fL3GQV~bAeRR(7_=&BqmNk)($CHn_ct^i4!c7 z`*bO)MSWoT1xWm1mH)hS8TJi9o)F5R(EfhxkKK$CO!iZwT0D1au420km0P0!`D%<6 z$^xdYMJ&1jg)vsbA%RBT=73RMHzJ>TTQ$`&*M3 zOi(OQ&(H>gJC_gEAs+m_aF4Y`G^%CTuW-ID4dv*$Y~_p*F6!34W4f)xjV@C4;8{$w zPLoy{ug=HaaU*r)MFVx+R{)Rgl&FXi1YxSw)#qxi9S-kunvdDC1pusIEGdiLZuDiU zitaPHc|vq91aA~`0)8-WvY;ZFCia8&;ZFZOi4HPA>g)WBGd)YCR_|-dDuzGOP`**| zN~iSn#tgf~m!n30&KqwJHbSwN%lDV;Go*gBpoI$$Z4dY8-q)mxG(Ju~*2? zKjCHF7ZUdLrVcVmT;Cp3Sc`sjpQLu}*kmY6-f$APXc66lun9=oVR&_sr`{=$^fLrv z&fAj~k@2qr3lZDVDZHUddsf;3c+v|B$mzEcnPB zb%*F^EYy!OFf#V(5@~{CNScR1o$q0O@9jJqzc{_IVrF!cP7WQoTrAV-Hd^9C;VGY{ zCn{Jlz93bW#=v*?b@o`Qsy9$y&#fXo1yIU1!_^zpIA>3kmaym4KbXJfK|s!_+I;&}kVq=H&v!po z%8D7*Xi-V}?MB}l#${sWwRG3?D`ENOVVUgSN*b%;V+TP_*Uxn3kWw|L4ca!*Au>oJOxik`FNCkPcv~u%o%s+ zhc*|!BoaTXa$Luzz!9dSQU8GE!Z$I_F6q_KS|O6IyH?4GGlT&C`uc%Em`)R{@|Bb+ z9skR4Ht=_4Z|s@#(?I9UMwFJNR^q1{0N$$vtEE8B4hzsQyB%pw*)bVHt-@K^WE$pI6)su1o+7rwLVM|=qUqoBu-DMu zna32CwA-f0+VPMdi_k_&>YeU)@v`hIrwAy`9eDW_FaeVNSF*s%crdF1#D!J1)I{Ok z-{R8>s}|wWWbv;a&H~s|`&i4Eg6IjYfcqW!qqafUSwpQHiRn?F_ZZ#Uh`0B4#e#v} zM-48qzo$5bUY}>D{>v2=blL%CdqA8K$AW}cFNiFh{9V!2t)xRLVyGt0>9*4J)~qbU zNa$kql6f#*r+rS%O>h_mYORHb=Ncx6~1tGP^9X2PS^N~UhEz9axl{G`WS z>E1zG3{V9_u`5a;KO`i69?u$$-|L!XTS^&bTJB5FVQNU$MsGHvg$u<0;0K$m*h!D9 z@mbeF;;97BQbNt^X=j~8XZcadcW<^9ZiV&%^wEl?No#H?<$KMoCsowH5KJD$B|Mom zwdtZw`B0-)l;if{>(++{mQnu1S(qcwcGAe@p8>V6k78-O$XH(}YAa(b5`$K+9T84Q zj)@LFqhy8l%{%yk9tg4-@82q>l0OG_Ez#6@#B(b_X$|5XwTjoCMsU~F6k0$R$*;aY z@|>HmzQw7iF1PTU#$iI&&0c4~AK^63s`>jTQwn<#ztRrT_Ezcl-OedZOKZ>3{}mC; z2UO;6R^rt11UXLIq>6Y~&>XA;|Ls#0--pTv1z%|qi(kFV7LARx#(-2SHBzccJdts? zl#DTth)dR~%k2KBYWIxl5pg2HT6PDfB<*~!{a$7XIA8o-QWs+qyZT$rO*`C(JU~PWdE{;kauiuv&W}ILN=IW5#HE2WD+2~gy9qM z;vU*ud)Lqh*6uAhaE>D0id!zvfAW$K`-7&`OmnG4)P_#-@v^YFM%V3&80TN&Du1q9 zxs~%M-yKTO?m-O}jDDKCJOTSbhdkcTZdvd;Gnm+U6)v8bY>2ByG4Ltq`1A(&L5kvl zw3tOsOLGZ}q%m`e($x5uS4oO5O6k3qxRjpPHlWb^R+IG3i548OorwHy)a9W@S3g>EC@m>VNKhTLPvoELL4kUuq(FP6;CR4`=@p$LESx zUGg@Sr)hZ`z=NoVWK_ZGuZ%&fZ2-`UqH?#`E4q;gk70)IPPfnB6v3R-I(l*KbR%BL zy=tEbWrp~Gxk#xv<+rhY49|*QK6N5nbc(3_5Tv;@forzUrE>J{alMz2_9^X!YZ`X~ zI?3Llq@ykwSA)ul_&F@}kwd(Qm_Xf^EMSAl{LzfwfF5!2dJ(A{#` zN4Vs>?W2_q%A22~R)g;DF7e^bmr{Q%{6~`CLnKZ=-geZl<|qQ#L?XWfS!2&NwGgwIU(~6o_lyB{cg9np6U5>s}S0LS>Pr? zjt&Hpk@GsdqO_4W z329cw_6;Awy<3T~)fgGmC!-tO_jQ(Tw96Z#kJZw*vjb*)Nx~=#S#MUr)G?uiCR~`m zI&;AQiEQd`wE*||rC)lRE;=*ku-5-bCS=9sPIXf;0;>X$wXC`?Sq+s%g5Y1v7~f+r z0eHnwpR2LyaJk(fA|FpKTqJXUTj;faMZH5RXJVgb18g;jv1`Rxv?394ydk{qX|uL= z)aPcuABz;F(_U>6LF?9~3YR-zQFSK1=bwHW%^nC87U7kRGCNK!0L>Dw?5obds&hP9 zDB^S()&1&oD!I3#+MDHjb>o{;^S09GWmnflR2sC&uxq zLBn`K^(A#q&;)S%?}IGT*t_f}#m%=?Eotoo1p_2>5;JveRyv=HC)d++(I$qXQ4_fb zOO^~;Y?ahebUX8{RQ;RIq!mkxYM|5OVt>VQLfH$vL6V&p%6-W}_$E4Bz4wJO-+6-W zSdeLn^x8_&(Y$$`*w6c&v95I7ytaGG-;1{e-MJB&=JW%^&NU!Xa+DFejW-YK9)yO~ z#X*7nf1XgrV!18=JA&}8t{WxoPj9`LXN$n5CmQTErv_8CXE zF+&Z?8@T3je}Kf66c{^+Z%goWX0Q-zwyO}aGLLW4S?lQN$A$JuP1~8y#H|wyVMQ^Z z595hyi#spK03#{sH3_XP3RnLO<(kbsiVa||3t;tIbN0X?zfY;?mg6m3e}x0*7$UE7 z=c47C*xwR>oxtLYkz2S9Vf1trvByRr-kL(%CV(;&%cCs!)>q@TW8aEFfLHa*5qk1? zy-%&8c%AQg7It+mmQq>q5K9hek5RHLj~)4mE9q&V?t2WywZ2-&D)CMSv96%eDZ$Tv z5iqVZ?c{DsoIN}n&BziX*hvX);ka#_{l3o)FPlrw26c^+!}HAW&GcgbkdsPIj2+fH z^6_Mh`(u-qw33cs&`eLk$gj3fplO*jHD)8>knW2IAR7vb+Ic-a;%v5_rL&e%*kLy(V+MYdYM;+D%ZtT0KEIU-aF2rhDmsO|Nn3-h1 zcU_B2T81@o{vbrH02tw)UU<&q6fqgf&m}1T?4t;7_et2Ytg(|*!+?$)F=CIHt-+I1 zz3>NZ1r5oK($W-JOnI}N>rd0=T{}rTp%>lUqu@8kSEU8S75-f-wYH?OJ-86?O;T4f zkraJ5U4Vuqc1_Q5Qk$#xSW#Aufhc(cff|IN8+K()`KfcT*U7#L%X)2Lwa%>e@*k`I zBe{Qqn#a{ngyZyFnbqQ%VcFfcpT~+3Wu&~p&5tqrk74P$#vElmx9kS%G*}+BW?5B$ zv2PAUiZGd40p=e4BAnqTZ_U^~hio$LU)dI)lw3W$E>-l9YGG#mr3#nY zMJl-uznY1wQibRklWuS86N)->I1hNr$IN!5t9PP1OdPGb<&UXf@D~45Nbns_1cCxE z^`v&`Uw6o5JwO=vtOm782jhr(fhE41jSua~w>hmFH~2gqM1B7X|8^dvI=3ItiWT~3 z{^id$Bo01kAeC-xQ1c}w^H)T;T%^klvju@0MC{82fm=5vR3=YE+58J_Y#l7qa!XLCcY3hG5tpI;|N(fXtV!&pCa%CZh9 z?xsKgQlR3O>y+JgAbUeLqSwCe!^0-&k}8yyoT+nGTlpkYb6D65D$&#Y!bUzThL5C@ zBpy3+J{@2>CDJ03r}OrzrtG2!sZ?d}uZ7ys}1L~z0h zNj1Sxvc|K?gb-zfEhHj>JDkdG0v1Na1ga0+kq3;@Nkr7fgjELieYDg?_e^9Y#puOX z+LTUR091*Lw}qQ$1eG6_W?>NIszw`M?+FCqlGmj zmQQ;PMMlcLmIJz6bPZOZi3$`(Blo`qGPZiT&%En3A$|eHR{t1{Pz!)yk9W~s9t}oQ=YZf@^^5+?Gj~w)Z}$EaoLtG zzB(F}(Hgp%iR0kpl1`_oHv9Pi$~XtEkn4dEoG~~U2=Cvx6d8ZU^Y<6GZ`en`73iwW za&;zNs8(2_`_za&ae)f-{$b70I^A-87KhtgHc-N*!MMLGTZ=2XR)H0}kVOAl zZvSJGT-s(&-WVzV%Dw!ThgnV3sd=^-ExADMZQq(6vcKlnEp5+9{8OFe9;;%aWw;48v#3Du(n)SX_eKuphI^@!F3DVLovIHWzBVri_$|s^& zF?JQLAjgtK{L?Y^JohFlYLiRUgl z&t-}sjAY}O(6k`mqR9u~v1IOJCEiz@q!DBM0RRGTaSBQ+Z2XhW;O??d+Bn;V-yI#$6^ zjp<)>e%jt4Iuc4uZmoQU{Un%UX{ffAZclp5UyCruT!t)}jSeIv!Ak*@{#rlna>S=Z zJ^i?wkeS*^3}3IOQX1);i*L1GWQ_lvbi^GIUw~}hC?%^b8ulIONgU0Up^A1LW!`*bIwZj~3fLmO}to3DZY!@y~bVv(#jsM>q}zYughzyOo%$ z3E_=t2rJg93|m^6Am??HpvOp@vOfM!y00YdJpVT!AIUQfITki$`D`96o4G<@6EhMB z6f`u{&$*g5-D#P3w=B4HED6FW_sID}ZD1^zhr+A0KVFcL7$N|@rnvOZNTBd_&aQP5 zh|iskTxh-NXek}D9N7#g-x1qkk`A@{fRQp`lQr`D`oqmNxeuU;!V>Y#9}z1E8FdsI zhZxTHdlUIXB3J+QBKmD>TS7We>QK-fn5k0@5$bIL zi%I6LO>XCY$oj*^jT$`^Xgi&}T9i=k&r0lLB>cPdUZ#zgU5kBxPrSX9ooXBfZ)ZpgNVB+m$YBiU0h9<{PGpf3?^cr=lv-P~PB!+XeR5s70bFG)GOCq+yOkLV@e`B~>|GVl75{s2b~#mv2lr*LwOLuw z=N5KY|9)BZJJ!leVRCLc!C%?^V59Ffass#75d4^H#eXDV_)Tu(q|s(&`pN7J&ArlI z&yTe&NxEj~Z7ogO7eV3!#C3rPu!Vm(0)?o@5BdNbH1uoR&fIr#(}e^rtTu5l7Pp7A zu@~V=>cRark#RJ#QE0=@O&>gslQfrDU8>4k+{SDBdHULfubzKGe~8N)vlhQdh6FOe zv0Za?;Z>}s>CWDYbE$C))0wMXVic_exz{RmNzeMQhCL>L`Rz==TQ7Lkd;zEPSr6{cUf%~%@58v`qb zt^Jl(XvS2D9+J3sH4w=govN@tht#3{{`zJHJ-P}iBP4)pV3+jK3ZGIRlP9G383b|> z5Z9F}WmF_Rw^cti8T<+cPZtncuq}Y@m|N)DEul2o*M6J~WTXh)%x)#RCIYN*dx8K} zy_rEJI9z=3ind8rCvWHmpPL^!~ zuA*)j;5+-T4j`!f`Ry`E-`EYcZ+%%*KV4|9?o3;T1oD`{WxAhwL;fU!<)0{AtjuVy z?z6(((5qP&f_5&7SCvgTF8{8%sv8=3(Tj272znVN@9=aC(hd-stV>eraGrl*KfuDazzU z04}It_7)0FO5!oyGGo6z)Bo_iW`CUPJ2`%mK)L9z7Jg=cf}qp%a1W1)o zWPL1!xN58BCu#jHQ$!~(+7+C9v(`|De^HXyXJwgFiQNKr~&tOv6 zL<=jIKnl=IJHjju|3~r}=Pzv&J2!tl#V`U>$BIT@DOBiG{<0f4dC5V(Ui8w{$Y#c$ z8PI9Y`=%B>B?bR!S^EaOq@ez!Wl3%6Z13cX%Cr>!Fiwsu1rjgrA7?I{pHz+WuKcrc z!$8=COh~qPYfrpE_m$8cVf7oHI{A=R$#tAOP!u5c3`Qf5;G&R8?xYE2rJd)wEpOq9 zL{bVE8$i}&3aNA^%3jPyy~>OC^7wPGOI5&Um0OAaYN*y}$suhm4Ss<|Q?u68>vlp~#7TD+?0y_C%Avn&Y5()Q$&AK%l@#PicI9X=1+8 zZKfp+x9uK8R5{Hy8`{`DtV0D8r2@K4pR*p6S>c&ZgTlO&=nns!o;vbyQ`8@Jf6gVA zXMW$VyaG=(-wm?)cmp`Vg?$-dI9k^*@=x;q;F<*5sIByDBQ5G;R-j;}(>4s69?r=d zd%(+gSX;4A_@BZlB#fy7A!o3jAp9?>jeDVG(+4`Lb)_z|3V2E=Cg|*IPGGW+H$T`2 zo&^Ec4Fl;3HTnl_-Q=Evuvgr8Bs`5HvlYV0d(eKhTTBSRn|5_s+?w*2&af#@GH-e; zPRhx7mD}4e8rCXPL)3^DPFFa-Z~8LV{DEK2ygOD}QC&G(-hW|YVraAIWGzrP%{9$7 zVdUm#RMAtd49)2puMN-u%GM)w{;$;0$2?4cDGjqKf`Y$wqWb)^-t%sjiwAkctrqKY z?0)N%H(!RGSRU);Eu)WkoAS0tk}aQJ=DcQ#HG0%dO{!KwQ8ZSe!rIYeI_(eswL~}- z2H`lN;>zFNTilbFNHG#J#8!^(+wM#i?oJi|H00Z=n6x-;{;-z|)@~lOAO>VkPNNFu z%;)RFJA0X5f5>!8{P7lCbh~c9RUja5^#m0b*DT)Wprf;(w0FLr0gi1I9+SHK$rD%9 zWkZwpbV#L7GZ`{Oy9b+JFT_`qm*ZF^abOpZ^STJY*`I)<=|6hz^ydQZ^9ZQr^U;iVXdw5so< zT}(8MD*f$6PZr)~oWsttvH;!i*iAAhYh-kos*Oh~qNuUr9BD2+4lCY|YI|&rkHs%6 z`B-w?eI|Bq+*}Qbx72JU=ob-8=ZVD%M7yv&R&<{*B^vE~aNN>xQ1|_AF?`aj{soho zGCWC6PSXEX!YXnm+~d0kLRO^giBChW51Wj2Wfel9|h&tH`9<)n*n_xe%m{ovumJvsXA_H8{onKav@`RJ?L;3?@zobEC^tJDf%lEJ#dK zD5cxtna~C~olA$^k}*GWAZTyCU=(sZ*qRmD#qr+p^1 zpNvK!c}1&WyiAW@oMk5@5b#Yc@h`vXTe0>tvL)mV7aZLsUlbv^tH}E%d>ps(|1ahh z+E+G(W&}>{2~kOev>y%#bhQLI#krMiD3p@lU!e15pw>sCc)3z~?N zQ@HDUM2sS*ylJo9v`^^i9N7oX@LF7{Zkx*_g3AQ%j*}mV) zvlUXZOcV%-``W(d&2n6-bLf_YTh`XdSj&6hk)P>gWU;Gn*0eQMaXhvB>iK?e2o`hi zd*zq7HPqzKM%tD4(f{+*pbO0KGx64KL^|}ud?fS8Bdd?&8R&!SvylIfs`rd%^MC)a zwX|B4QhT?kqDE`4sJ3=dyToXV5=v^P#GW-vxNaIG?t*M!GHO zP<9sH#HjyS!u$J`8a(xgwer36l}mM*Ot3o0T(6xLXVMSI96H@b)XjyH@#(a1_DW;h zSBduV57KrhDh`MX2P@0&-3Z{Bs@F+xnYFPclpFS)RLMPoxb@2H4=`owm&Y43Np;X9Uf%U_V!u9Y5A6<_1VO zbahohRh{xv=XT4C*;v#hgvs#QHZ4wHNvzG(x*Cbmo{AZd6z1St7%?NhD~DKU5oSA3 z-o!mOBe|HG(8Qjzpy#lIzPg704GxF(&EW=5%iPWPCJiLO8Qy2D$ySBu8)gVX4S5Iu zK05gtqop+aHz{c>j7%0LAR%yLGTg)YbjWk2lLdwgzPI@eax!Lx^d_z~)OREsAQ= zuL;^k4o#WUUckAD?J77jP~Yy09ixxhJ&;_S--q{!sQXNetP>&1D7XJ8`T{N%Z(tz) zmeI2hjNe=Pti~tVs&kxFh2zFzN#f-*mIJ>)HI^|yZ$Dfl!|cm3)V+5A3=uWN5BdP= zRvn()^|y-+9+=xF>}9dmu>TnahTm@uM8s+!?l=qxvQe*=J0Ovb8UO+VnlDGHj+G5dGzwnZHiM4m>LE7 z2YLmu0LG=tn${} z%_Rn-#`9@Oe?Jhs;3y2Kaz-$k80J)2LV)~jRGZR#S1cmXVax(0;?5v z$UY}Fm3L&d=LgqqF6W);QL_hR8DO%7M{HtFhi!jy=`zi$_>?^2n*V*8IeEz% zX~#{{M5*YlS#Ie|8&bVvm4D7*!NJYz?`4%qopAgIz=9>ZaDlk==MKd__Ukm5ut>&PbwBNj?qgOZ?v1np*48ZP@B)o)T;5S4L4w`IH zsG{`qb{lUi1OoFUcv-e(lH^9;=EasF;|ad0(K%)X?#<&HTM^fXOK{kNVyq=SA=fLn znorUsd+(^d)^oUEvKtWmMse$jI~ST@9g8JYH7&IyaSfD$IK_(+;!`S9G??E(yXif( zx4csF{J$TNZ<2lNv3z-j8Qhq$jMpYR(?SP3uMfB~M+Qam@e#4cs5%~rg)0%8%8$7E z!_^nfHnD60_Xf%Fw%p@8a(U1nG$*__ zKK^2)IvDp+C`06NJImYAdFyj78bpa-4_3`RFkJp|^Tc&6vjXoxFi#Q?Y4&b&sS` zi*HAi+RRyE=Y~a@X+^^u1UUNK<{&-Y!T3sX?*O-_%u}z^lh=t^n5MFnn>dkApttU}j8X0pdD(En8j7hsze~bPp(Q*)lWe21i%5ij%D= zlj?87UqwCdf6(`ZW8=+g?xnsn)EcEC9$0BTPju3)M?T2jdq72_=QF3h<*75mm>`Io z^t(a;xMCDI725%p2`-z;0VtGwtd5Xx&H~nI=%R&|K#TKk7ePLD+v5>*1^PtjAYK4& z%JclB%Wb7lEhRr+5sg=DTFY_HJV#UMI+Qn-(%<*4cUX-R+TlwrV|303o9A~D(reS5 zCD#+5G_B20zH3t0q85&AkW3^gllNM>(LE;^vsMcuPc#L^048;{$suiju_JwPI;pkC zIJwNg$J*4`mz+Yh@Xcrwh6Bag0u2JlrC1-=*zK7ubKeX5i?`0J5{+ZepN$o3ty^Bv z5em=kdIKbxEb~WHOEQ<`_Lf(i2M0*>^#Cs7z^lntWn7M=F%kxTFxA>2Fp{7XzZ{WM ztInmM;<4wdwakiGYN6fL4D>ThTz(}aKJn=~w+E4?NuleaY!Pp9#yz!SanJBH*?@eW z`d3=efI&37y0>cqu9OZ`KGV1O&`?`KN0KG3DUQ7`B>pB`gW8o22a3L6^y#`qL1Dr_ z?fsG%XCL6u$Y#-CZsP2+LQAed6o4 zu;9PtV}5chIu)D!*=*%6YVhEqSr1-RH&?S_$hF1U5O!oEw>KDy+$jhdsoqO153&5R znyjfKtJD72Chz*dvZjL`ByqQ~YmkGQz%E-xup3ZfZF}d$n^COpKvssowC9T9(KnCl zv*pQJrce8217b~fNl#WO-YhU){M=fruoTJf1QSd#PDPL;*Q(b=G)+s#>psGrK%SNz z{+s(~y_Vn7%VV*?SL09}_s7ZW7jHT#cjhL}Y(IS7&65f;BbSS~_e9-0R>M2hbqz5_ zt*vqa0g6WshLfq1(?tB@)wrz36x6yu=AeqR?W1uZF{}?Q& z86qh__4X44R|B;qyT4x&VuL?u(WQfYo0PRgzS2{>Q@j61VWJ~y5vQ|QpQFZ;6pG_x z*!pmm`kUr^1bk?*$JY^t z%XvKWR#1uHI~v@FSUn%1(UTk9_d*f$3U(O^R|NZo`gRFOL3d`IdD$<}#O%wj%PxIQ5 znB6UGMp@bt!fXJiPT2}QP=;h`4-QEfc-#qn-^t$_2zPyZ2Qj|Vm@1%%mvBGn&yInZ*U`4;a zDbDp4&XG%9wX@vii7%P#DcNE|<5gzGJZN-9zvIQu>n=&Xc`?$E`g6UD*>8m@`|>U=WyJC!aEy{~wK#Hz;PS*!P_NU0o>p=^ zK77|IkEzwJ$d&hzzVV`AEM{t`@_||Rl4;+g(gvP@pyIS5rD@TA7UNj+e;{SsgRH{)!r87*3fnGTIsq5ITgEO$y+(7O#3Llc|N~vC&>6(9&8q#KL1}`)3 zl0E&liFw`qL(b|N%g`kjb1o)SyAiiYvqMgTNBV${(*<5*<6bwer%W9yjJzW|un5iwQocscBb!V%n-xen z>|v0jm&Zz3X)Zzi-e>PP0!BAW4=QA-@)sH`YW-T!b#@Fg!PoO*Xjv=itgJsPE?Bm; z698egS0YsrvV&||n#t1-Z}M}|4d?#gZ4-49?#6tmAaE`|b9=k_b^eR}1$g0&Tl%iH&UW;V zuQ+FIEDH^*g;h5048t!rv)0ukTO?M=5A-q&XC7ot;|% zKP+u$Bq=8K$v1z`djkXpIL~&b>;I~zE>YYyl`*7x_?y6q?qTKpStI}4k&W)`r3jb8 zhcTmr6%HPMRIQqMK9ljEq#hKg;ca!V-pFDjpYcgByHGT-pVw+@|ExNpm?II zyhSz9%>#eE7yESmq@x0J8cyd~V5q*p{RXzB9lD9g0@fsWhsu$F{xw%=}Ech0oTWFR?t zLHdv4Z?4Y!5`!Y`hpBdw()vSazo5NgpCH@F{cDhp?q;o??aPOO4{u8rtF?Sjd>vpe z-2D&lcA6xyMhHyxQ*xR4V^0_BA-6U=$o?zg;%Fs zmpPp7Pf!+%S!uF+70S+a<`z4V__l_ycf?2+iQP1r??4I(dAH5eB*7JO;tjWpj#{+- zcEkn23<}<1_VlEu{}fn$$4+BnKZt+xTsG}b?83p7vihe=w)cOQDO18vJsFl`$sHdG zEC?X0&uMoTv1;dv5q`~l>#$SRGf=xf@CG9y_1}LKV{qV3;4aAYBu%OjBHk>MpR)Gb z!xcB{<8L*;PApp(cBmBea9cx1-AisN2Lmdqvr0HGf@~b4(2hPSJysdL39_3eSG#u<$fb+MEDRlJ)knRh8@K=b>M#T{s_J5|DsW3x z4W5(WvV3{on5{4KuX1O8x+-no-9i$$QNKSya<0ca&{so17+~-thYp*Wf4`=^`Jy`T zl}E0_Zwjv#TzxKHTjspxcKWG8E)awleg{2-swVYtc4LI&Ow1afEKj}GX*cn1WMGr9MyzL z$i77o1LU4ITK10Cg^4xmAees1dP(`(OhC$_todr%KK!`7L`}NS==CRr%-%wRILj29 z`0m2s)bl!IY>*@*YQ-9J- zt<~9M>{W90j1w~B*Cj_Uy^kdCZfTlT*FCCeA9>_nxr6R2xAER|&9Y;a8H<*(tITEm z4SDY~e3sIZFi^#ueQk__j()nuJBV){um1j5OQQC`^LwXLO^e5C zW!{tBqZ!kiFmH2Tx8l9xIkV~G0Aa_~2x1@z|8KkJe4Ci}sxiyN^2s|<>sF%>O#?G_ zcmDNcCB`xCkEBNvBuZtMQ>(eK`GN>o`OmeOjoYfA#{eE@^E^6quVJNN!*9i#^I7YZ z=v1|2=Co2;8A3?TO9cJxcmjQT%NK;pvr^HGBoouHgAt>M;%UeJ!coS zMSkS8nr4M0!<+P2W2H*WdT3zwKxv^aN}VUTNK`GL;jeZ&XqFy;6lS-GaA zV0sJ@r^<;0wzSrQ>OUX;xrWW{c*MdM+RnRW%TMSAv0By2d}*xfd(P0KIN%@Gm&?(N zY_++WocZM*VhDSd_xXji8+GZ5pi^$Dm(`Pap_0I${VC*3znLhi*T@>(A-?h(tyY?v!A(n z3uQC>^4giEe~R@YSrAG|?rpU=;lA$)B8+I->sq={EjviBihV!2o(hzCJ ztnmPNr3P*axnFnD#aR1E@TsQ7{jgP*K|#u7fF?@H+MlmE5D&szi*`i)JC^vgZ`XG`jQ;+b?V=Ygp6ax!E}X8(rz%AXX=Lq3BT&z)J{ zrTFvf0V^yfxaPxpNbAJrZlQ{*vF;HLM2 z!$AwztBK&^gooxSCL&i~D?M*$5#+nuSteT5O6q@<({BC?ky+f4FLuqX#or*aLwods znM>l+7o40D>So1B17|iFzWCvgXWVZu^~GK6axja2!+(QYx|D(~im@4Pg2yh%X4~E4 zjXI6IXkYTx*@N;_s^bzAMuIYKRPrk3KJ9q4n#P~oIAFk*ctdUZF)vkg-@zcf>nfZ{ zDnWhNDcke&KDlX2TgOKwA9);*^MR0lE*12*m1ljSnsj67QlOt#xeZx@qE7*{L^ND? zeEW20gM#DFAl0>wCjM&G``(Ly+mFr=yf zdOFD6BgjZAhvpBvbzg`7Jk(qzxR6M8f_C%W0oHE9L=PXs#NGzf$Wn(x#R{}mw%ych zQJk)(o)5Dn#y@Y}G*CE|*^f`><^4VF&OiR}Q2Z-SM2Ry^ocX@ES99yIK_`%Z>)ktRmA=9#mHVbj<(T9M=)8g zI-$RlW#*=Gs3JdoH1D)zFF1&ss z-%|L)?S!V@@HaK*WkjbO19e#9FDQbx``@ihtm@ zFk4TSwiVw;^fRBKjr9&0!-77@)?YD`r)~J!(SrrjNcmu%obWp3TrNTnHx}ZZL}!V8 z;a0BYfAE~U)!krH>lMmzER^qx1(kuzl4J*t+*x)^9$W@^bE%u3)l%}T@cC#eQY|?^ zk;eam+HKPvx{SN0igrK?o1PeS`l<21SYNPT@$k<@DrZ|t6jZkAA>wlx=p2z+dO}uH zmA{JTT64pOu5#n)uP+_51TQ;919)xcTs$DfI?&X(yDVR$KkxwFs`C>2tnhX{6}PW= zZ6V3q)=8rl-Pqr68^--T$d(or1~9HIz!F(NP}(>IT3#0O$;uZ*zUB5ET+>>h&OQt` zFA>ol+-=A!8#cM~Je_A0CM*1KMI6o}k!li`h-yn|2{_hS9^vY$h3eHH!Cgr&b9I>f z4mp09*xxlx`RYkA*7jnBOrSGH_DS03+gcCX3!&_jK{^hv)|~~o>3kFcg=DsEM|8Do zkkZxPDV68nG;VzW4egk(Y#G8|Y!W93cF~Xd39#aC^goB0GitCuCeFnaZ05p|ilyuR zLXvquDnH49M3d8bpLigCA)!>A?Si|qm2Tpkn6=N^(I-t@WsHy*xbe3VlD=K@p}ss2&7>~2CfYr2#tnnsnPFY zM4@9uwj)qydZTlF~ZoYXlf_)yk}xlq?@-8g!A)C_nD-Y08EcI z+nbN4`kBj?KV6|->sp-VX2h+zc`nHLD<7j_gRScMM0W;m%x3oo8zms3Asuo{>&ujGAa>`zXC^}8j*zI+Takal)090$TVcWrd>xAfk}YiLsFi;P-hBmd(D!;VtT}<#NCJ&PtU3tgabJw1kEp`?sPZU|3`tURHJ(X0r!$uH;+ba zjljj$kGn0^@27nHxEXe<>v2fn?W&Sxh7c9La-zM>G$O|VXboKd6PfK;O|PJ~epKZ| z9&knMwrUZ0>RbcIwfq#FD-%2r{HH=IT&n(-%@QuND~{Y@eTRK~?EhyKscX z8B!wPR4fe{>)~mbE;qS%$+J*DGn~}3!1tSwgGkLlTEBsHEeiHNaoC)>wx}vrPDE0N z-%nLvPJasg{6gq_ug~igz+RJrqtDB?-YQ1X#?^d0%@Mq>_)8 z-8|Y3W-2bZ`?b>G0k%uUVRbc8abQX8O~9UX>Tdb;k>3Hyd-DLWPylftkj zfxjA9eg&ebLDM>71*q(~&vTWg?UUjHN7c zsT5t%Yku{xG0HVyQ(U65IN?qEwB{YI>r#dCpFaQDO?etLq4xtzYQH4+yS#DL?itl3 ze-|?JAFk$>T~y5PyNZb~jJ;USOdLL zs;Bc45vAipOq$8pyhTYKAdm}B^LAdS5)#31(4rIEwUHvYTgV>A7c!p5e^l#I4=15UXnJ4p=~ zTCP373hjXJ&AWTFdop2InDG3`18wPx+49ozB6|)ss?#!RJqX_gYToCS6Rj31(#)LxV*Ra|-hR1#Md(TLLzG^4K2Y z)lLE{0i5x>cdyAEX4flLzLD9FmL>^L?(rFl;9edIPTiWy8Xs@t9}6_5w~vDgsk%Z z&6OX`o?|UV(=_%xTE(eEH4+}tPBD4BcyB@7uL@CAcQ>Wkoc+DxZeoB*oxRwiZ62Py zZ7nS?+8Aq{C}Lu`09rul2h?~V^`}gxPn&+Yl5NCVWPzCMzJwz(c}3jg@ekkE{`FEy zydm^yO$0v!d;}-P%31m|N;#D}h@nGw{aB5`%8(rT(x~r9W^QiRvr~Giuz)qqKH}gf z2PAOtXr;sq+(xUaaLlicZ$*q})qOQVKhtGJ>I;mG8}fi>!8Tv|jq@G~+=wVn&E_nvU&934BYo_)32hqGF!VWSFKZzV38olQh91`sSl@ zg)wdB`K%@$T7{aNMA|l=C8A`&G+6Qku(H@lA{Cs@ktsI=ZBV9l@VoY#=)(g7@Izd? zn!#U+!=JUcH6vHQvyc33X+@09vs0{ad!=;#`#DKsEL(&uV4qJRfNF|Wa&=!7pDZzs z{-ZcPsR(9Q;bMq9zFo;brO{jCoi6`J?bW{+T_cZpCv?zQ$#B*D^&)oDv{x@T#17^) zW^Dvh+=N`)(lCn}Q=3;0HiK>=N#Z3E;c7Xb@RXjn*zYW|B$aG*(7OYeF^hAZE4^8( zTDPV1KU%ykEd9tTK$S8gJ-|o5d*nuIFzp6)r7ya%Dk3>MdDrq9Wx{f`*B~``-3ntE z+Nub~*Z7nniZWh1scr0{c@bGb|FaZl=&Sl&jK;j!PAT5%nbR*^bNYLhlcKA3^Bf~O z=uK8tT%U!iMRzKtjhqfwwp^_~qOe~?HQ8MU@iL%Vf#p`jSslGG zH$4mQzTqxA=_7ZGgi5y0g=2(y@4NA?>p`s8XH}+}wGQPUS%+29z(V1*lguemr#%k|;{g2{f@~aXx2{AETMo&fX?OEXcse;C2 z=a)ZXjk`RRe9A3&DJC6=u7$+>fxbPV#yN?)($lVf30(O2uvY(0%ty zIjqfqf!=LVR|W$Tri3*mr4>H12lw%@5)*2VDO+xAy;n+DzkkkQlf;9MjyT@6H&SXlumoyxJlR)1WgMqF+CDeypn@t+?2&E+ zxG`XC~H_6O~h{?Lc{XV?JLX(eG*5@d|JDwEc39 z2h@l@Lww59t`5eT_1?y-ZfP~NKPb;?nv6bxd37HOD)kWliyJVzI0FPP{^v*JwcI^KV6I8&n`xn3W-RDUP zRyebBvQ=m)U@?l(l@EKKZM9>fa&K01Wr#~hbWtf;$G9Xs>8+REiXjCA{$k?j^7+2y zBv@v9gUMMi%-88rC-*KzBI#YCrjmI{D1d9Q62f$7n__AfHLLmlvs}9UAcp$mCCE!R z6QpWaQJ=L%lf&(>IrO?tz{hWx7wkU-*xOW)X0@|dkK-@rpjf`!?R=msel*;EO7^%x@6DV2;8bmYymX$yRYyo0 zs%XR)m9@QH=H*@~q=8(E5ZYJsotPYXG4Hl;>M!rtyqQrlLwr6kkUr7Y=q4^a=l8_7 zQ{dOfY=Tt>=RQd!AXt>>Ij7-ZK@;)s_YR56z7nc|7%ymJ)RI}S%XGM}r7&VeTwCH% z?!pvord#DsgF3_*7OQXZK#Krj5Xu~EMgR}H@?{mXXs|MPPbt_iv(eR z>sl+@b&kj#Vj=RG3>!@4oLQX5cr}+h!F%=euYe8>UFoYO``ksCR}j;@E8Z1X+jaj| zMWKv+Ev0YI^=2EtnJ)yk?gY}3gLuSfUGn($!tMR@4CyWT43A{B zwQo_=&$f~LXpzFrj=LtE9$V?=OosW|BOK`>A!d#W{Cfk?qcOuG?*&BybqvBVJd07^R#yAv+d!%yf{6@2lT(0nE4n3xpFYC@^nFYOc z?iu{+&$gjt5b(#zJn7_OZ06I`b@(G>c4||JZ&MB~+qczb&28TeysF&EOHDBR(orW% zt581xW|Xe2x77Sh-S9TxikS>ovFpu*#}<#v=o|ENHAMb1Yt0*EqT=u|erj1WI<9n6 z<$WREf_#WB-n57-05un)GOo3**Ef8opg3%CRu1Mi_lwHtZBB{>V2ds1#aC%onToXM ziVQy<+1qfI*@A#;2Ms3WN9+0~Jww)~`fC1LTL+#Pr9GJ29ll#cK06f2?`Aw0mfy0_ z*{s;P!u_OQnT*fcenH^tF(C%nU2r%5Ow|5x`!VsUX#7$=wJ;B)w34m=39+BnMq+wT z7MLNz?V(%#*MEssATy)amV+>|9(zv{>wo)^wE`q%ma(=fDT(b zXu8KFK0CMG#TrdUH&-Q_A2oOm^x9ECQhL}H9jAR@5(jcN<86iUYoTfqOV4OLrmlYq z$VDKx7H&?<7)G7@7J0!czgZ6)bSIsDQdPDPAqZ#_0AJL;!Coyo$8mk@`g7@WxDlk( zf|pSmnUfwU;=S)jO%<#=TG>?K=Kwzq;>>Atdo}@?qt5|KK2$Tb%6Oi1h(Sd6 zjeJ0MQFnP7l(}*!CUGB+*}Xz5lWRk!?M(WP%c4T;eAbtOxnlO&EO04hwwIN0!pk+0 zK9`OP*V7>3e^BAxCY1dTQAnAZeTDAmgn#2!N=m{GV!8tJcap#wj#Fk}2ZAR4!pd~K z>$j@3FIVI!{!mxk6_w=P5OGDw4O?z8*}e$4jcjr^~rl<=c5gcBtEH43Uz8PQzZ z_IW+{yNt%0^JDHH*`^gqCP=JX5RajGtfhqcGk4~^SmBohIsX5^5!{Ua)~t0qXa(%ZBViclLg*HBOD(+c`bmZ=gm~* ztx5PhOE)m*vaWWdr&QB|s-n@EmjN-9AZ$voFJ#-}arx?V|FbdP~p;Cb0;I z?9`n`nIV7Cj~A?7Ynn||_OaLMgbTrr$SX<@YfN4j$qyCmA2i7pP3j<8%sUFk%DOjU_n$(G!>^{mxp{!8(62dbMN zxgD-QTWO(NiN}n$--m=h$G>WRs~6)v{6(eyYd^F;D9C1B9$M*vrc@P^?y^dX$+Bx| z9$#)eEUtf|ZEAn|@rBo1c%ApnI_TDJg=G2_Fi$yjc`obrmjr9>V1LZEyaNgb_Z>Y& zj@N#6!CGN zkki>?rzHB6)fKMDgS$~^@av!{%OHUy_$d+mE5bcU28K zw|hp#F-bq6-dnX#oO3#ab+D0CP$b1=9=Ua+DS7d~*9uHOJ!3!GH4PHBCiY8nK|*xa zd&|j-rXf5^(|nA>gq!O+wMw~h<(IMA4Zt}WhfY(cBq``mJVcN;+f!6^D{j74Zvr@l zJ$<7HcUcqBu_PHAx9#Nb7q_=Obz|skm!Agkb$o%r>-r`Oz7>ec?9{r`Y0)r;Nl`2E zxS+eq&9l>(lBw0YDf>|I<$1M{24B_ND#xnjcGrmDev1X_j>cLO)(pBzWa`EU(ql6v zM2$j>;aMZWF|EJI?U$B^@5IXwxyoLLXZ96tThA1@{oZYxiFoOB34zBZei-GK8b|u4 zq$Fcbp_$^`-~cj7!JmwOz*iwEAP15R8yTgtTxnmQ2?@J4i+p5Kq7&o3@Y}S^9E&7r zF~k&1`rLNo+!?L;T4|$nm>o(Eww=KED6EJr#)Of&bA4F1%aZ~Xh=Su>k%5-=Ql2h2 z7Dr$yiG2W!nuj7Ix|Fp&Jw^lnqZlkKTz0Oo>)0?YMfQrOITZf#aV|zqR}2=PY}DBV z0XtZrw3Uz#k1R~4RAyIWw566q{*Za7;OHySW;{z$oQdV6!(`P>8V>B3CRLQp&$}M+ zKHRHs&FuIjlk8hrgC0&G#B|JsKAqBD)J9yVX&h>x3Y^ql^|@KlP)CUD2w%G6jt7mT zC)j+aOx96VH2}>{#u+SF)JG@|@R>i2mNq}lHcd{;ny?||UMTz2M@K<#-~!;Zw%g`^ zhYS1e-%mLVB2z5=qsSn^k+6u37czdcdcw_$wG&BL5_=Rm|VfdF9O0?`VL^ zz5_5_LD1@IMn_4$v_fFximqY5F0Nk5jsbOW;&%OVVRw`^j|CKx*;jAMgV_GD&&Ovc z=H+oz@XAh;faP1fnuwyU30wK$+PzsE^!#1tz=~Jr6SDD)+@Df4$rTBhHm zTzf;U1=y)Y0G|;_B9s1@uG|FGWfOC?b22r#l#j595#F-$J!3bBJr>jZyWU|meYXNK zG!<7A*^gEa&y7g{bStpLnKP|E<3_ioP1EPBpTZPgqXB*_Y!OgPT$`|QN3>R5M>%Zu~SuI7EhRSe z%PX;FRA_)c@k>XiI=C6jJAGA73ex&j(8EYPU+M8fI-mQD^k>l(D`zB{(nL@Meat;O zzxrVph2e`oHe|FJDF6 z6y)@`YQJi`Wb~E_Lj@lX(AmSq$l8W0*}m zn-A%kV-nHOb${v>#KmG|Dzyc>)orz?r_&&qmYEEGiEy<+wcQzGgQ^e=67o0CVJC>f zc~Hjq<8d9TqC!#AySghBP7_Jo7v@uH^x!)3P?5Fy5(VSZQdEfKqv9>xt(3gCnJa}P zsXEb@arMx2=HL3BO+`sbbzvf_s)oA*kEoQCcr28n-5jCgrjSbY*8fv4?{`(@$+WG9 zX~`Gu;1{~O?27#+|57v2T4KeEO)P(RU9HaBcy>J*Xo*}_s5)_=B@z*1j5YYK<;D1V zv?a={rbR))-6PDbW_-FM;))VY(!uF%JeDkYK_~2;RnMf9y`I=ZIt~u^4rT{JlwVKn z?iPi0A5R%R)Vb53tUkc)PM*_TuQa50A*Y+b`-$JcUSc;M+PkZNw7+N?+}t$(hb0^5 zicUy;B*jRjyF~^$AdNCx12yhc?`Gp9>1h|tssFt#0LRoCd4wG86SPVSBAL9;B*7|98j9$WEo*oyuKElX(iHdh$^lL3G4Tt;HJTIkXKUG}9Ejpi3$ z68`WS(a>`+s3bqbFc^54LVZ?t?fU${yg!}NwCnZE9u@@tN8;HD?|HblAaG>E%> zs&dcZ*4yJ^8N{8Gu1f*3IlD~eh zKVMiO(n|TeOv@KJnJk9Xv9aMskCrw2#8$KY2(^2At#?Z8wm|P|FJUTehnl|e@$tMr zR%CR{Q09w+ejCt57AJWa@P-|M^H+VqHE*@!2)1{r=lNnYr=nQ4;xGbc4qUrkcFcNrk{3rHzyS!BjJ={~e~;A>r_ zG%Is@<>cxsL@Ya!o7PRCy|OYLQ}1k>vrKM`F$8zDhd`;OahgQ5N3 zf|K5SJaa^){Wp`a$h{OdZ?_L3a@`4a^7pHiST+n7c!}hOlzktjA6|Orp?E)gN5JFH z_KAhQD?7a8z-+vAAe{Btx@mocfQCDZWdW!AS`q&txf4S57TJ3xCyLi+kFX|l~*BJflL;WjIl=SgZC{E37*2>uo z&K>PbiUzO{d`p%Cb+`4?HLAbFXDCBBHi`HfABcS2?T-l5@$TM%*AM2wsC!SpWarnG z^*Dwo^lRB?PZD4B0_1D()4TN<#V#qEYZ&EdL}-zQ03Wp27q7L@A7C2H@POb$hISO? zJ#T2z>!B5Rr|nj_O8AfB+Lh^?wZocF$*_$-Q$;u8kx{|J!rY_<>-O!I+~Gj;isuP= z(NJI+u^y|}M9#|I`@}4u%M*TGaVVJqaMh8R(IDdgLhSm~7M-Au-sCG*5AOTHp6~VA zb?&@A@jec27_3gilTliL&+OXMvF|($*+mTUM+9h5jKu7^=zB9zP>unwPX%Wv4|_<+ z^ntFotLPMnJf}UB^XkF63RyLvZBV}T`t9&Qpg=(89%LtmB-&-CfVxnrSo#NNdEam7 zldb0W=i4&FN2ZP1{f%FqJ)U<-wI;++%!g6hEzQ6-M}q7CRf=u`c9{r{tB!E6wkc(- z3@cs!_{Nvp;za@5a zI%pG5@D`OWf+*t2BmrOF`nLz>=gi1g*g0IUPiY?J6uq)1=x_Z;(Vz@tDy^up6x9AyiZ5k@e%tLlR)lJ7mh#XM8N?dNQXs+%Kx2I&%C24&@3jwt?k}9 zUzV!Ox`X=2SIE%EQ2*}8#pq^6AG>V$(mxxgqsp&If`|G#{W%}<8qDx}Dpq@yA&=;9 zllYJ=yXg_3#SK0$Ty>fbWPX-#zo1DUdw0`<5E#?u9JnHyr%rEu*=nKZv(Dy(21<1* z(fs9dqJOfNoWDpw#9vqy2L)V;x$kjw^-wpzi7Vj4p#F$<6F-eP9962(w-GtW86nUs zShIEOTftdMm*)eftNzGY`EpqcU)_ZO)c9!&ST*Yf>rpj7N3TL|_;I$uews_w!jhJ! z_>PMm3o*HQ<*(mNz4Vr-1h@`6r+ZM8v3#(HIY>aFC1V>dt;9SaR+50V1kjpS@3M1k z$jl_zWW}8xNm~JY;f3nuJ<_#pSze|KMX9c+hLeNSaJ-L0*4joo%`g%-omePqLM1p| zUEMD3fa$GdDmG5Y$cJnQDDux7>dwN`T@WuyiF+|>4@f@fNer-Yq)5|hsq9C|g#edzq-d&!@ z*3-!;uzgnx8$nB&G8;b{Jfw;y=h2H>K8~z)^kXeOx{F#)*|{Xakrw1SnX?ag+!`TR zBzWfDL3TurXI2 zw)SWLp(OVYc7CVPC(jNT21c*-hcpX~3_69k+MaP8PJWS(&4)NH37qCTfG+d`{X^Xv z>;kR7fpzE;(#Brp)cCVo_H%fm_Z3f`ZKm%2u;WsM{1L>~Qwj{Vm&s-^gE zi1#>733B)tWuiM_*)&tRA)se53|*Xckq-Lq!N3g zJ2_Q|`KiB`_TDTr{?==+-d|*g;f`-^iYD0uDAthBt}rz9I%^_7PNVJB7Clu#yK*v& zKGLJjf;V%yj^MlkscG0u@{I2F(3(DC}8E$6=7V&6~+S*7ttP1ca_raol}2-jI2Tg`aX&}s$M zRzwj~Rw4gvgFTyIy`08Iqo8r82PRpM_wD>~8TdI7k4lnPXlYL6&-J)7KzZ;_#5jLv zrvoo$y7iVYR2saRw*V(;)x-HlF}e3 z6ph~GvAodJKLnmK$;nh?w=vBm9X8dCXNDY@hf`{ z2Js2Z&}rM1GUn5fGqAXFLRDY*;|V$1cPPF3?46Tp@QG-0r$Z6MiR9ZCE--O)-h7w< z>hT&p@4C+7#+aNiw)PLCBlPEgQUZ6tj_+ht(&Kj`2Il8?n&k=#>vV-LYJcI1K|THE zEgJ1xf+gOHb6A;<8JVIMNIlY!vSN^uO1@wP&x;H|j~#o)?(mFm2WeRp2s}umB1lu! zM9{%#TFP3(R?hFt&hC=8zZ&^dJrj%R%Dn)%$(EEjv|>WTaBn**Ck_8GLp0ei942x& z?U8wYjQ_P-l2BoW^f5)vSr`~`PJ#kXk+cu^fR`X7ZsgRS1H8J0zD zGyHlM3xfabAoFJ2J9@W+7wwNb96JIcq!N;q ztC@xMG^*k=Oe`iv_Cl@fZ9`bDcrO%DM@4j7=oQ;i^Ty@iJo}r!i|pDBJ+B(IJ^>hO zgYuBZ|A5^4)hjIDve}0!D9-3``ByxtAAlPPc)xADxG7 zJ}y&ox}rbPFn+aZLR`X_2%WR}_~HgXImiartqoQbcJ~wyqw&-%<Z(-u=o|}{Ddr`X zqOfofH*;7a5A%n~#Jx?y(}srTn!|m#eJT`3hD^Pj0(`sBDN}9msd<~ZYczxUO(Fe; zzKN>vDOB|Zb|d!C{<@`WZsL_$`(##Z^k%NQ`EK3OZ*34OB{y}y zr0)(Xt|Q|ODY5#?sOdwfnl+R&luRa;GD}RB>WUrnMuzaZruSW`5xI8@oWE}oZIR=B z=dl7w85ye{uS067Qu}WeEH60p1=!tc|KFV?*V>xW&=F+*u2S~&@wP_ugZbGM5GDfQ zIS&4h!m9ReP%!LqSt)MBiD@P?mjo?qJb^tT`7cK>k!tqORtABR^)HcLw?`M-eUp1; z^RTrvq^NVGLr<<+1&H=&Xu#pzq~QaGp&)wAybE2L_>qoYsZ%=0q|Z)dqNL;MPh-3E z&@11t0%~01@|VGWglwxUx+mAl$HZc-t#H}H;{4c8zDaXq)Z+)Ak{2o$^PoX_J%!@Q`;Q@ty#Hu6 zHw~;;1u>fCsz)s`QC3OLVP3tVbl#iCsefhmL}qu$%*YK$90jcjuhC2X5qi@94E+nt z%%?}NUYV-PP$xdVX=s%2Lo|cvf;Qgj?ClvnJ-7 zosH`Bx<#id#UV2-lLd-DtxjDgf6dr{Tu49u5%2i_-4OrtM0^MeAd1Q7g*K~gF&6bQ zT!PdZ+N8vj5zfbLY%g=(gmBTR+n5eM>#M-eV*c(77ic7uZpuMMI2G#x%{>Rsg!(&F z+(Va_Vmuu!r>$LCbA4{IVc#`IjIGPl6e%j+Xs*(+BuxiC*%8-LY|zLmL+4Feg4OGZ2Z?S!0f3 z99!g5z2$Wi9LD?p^aL(@fG@8tjM-`S`)#ygv=&ey1ZvvfCaNgKm;|| z0;@{htqe_COsDNz=%2} z@go)GT)W{t&8s7TcrDB75l~*G?7ZA@rv|^;x~jjD^!yx|m0OlJNqyMNsIl5O%g^or>zc3g(BEpB5jw8#v}RH681U&m$L zz5k;Cr{nYes|uBy2-?I%-w(>Ru)@3z8qL(7r@m8>Ry|qL3H67U0jh~wa3~Ne|CkIz ztUfdt(OMxV{DytT`sicpNR^^`abhfN*f_IS-fy+J|B*4FmPbW5T+Z%yd87gbnNu}^ z&)XomNht-OpSJ9d8IJ*Y zGi1cFJZq0<9938DY_Tx>^SmMZE8Xv3>Diepu=cSn204VYlc&o5tz#;yqeF_dji3TD zZQq?ypO`r^+gxhpdgeE~#xc3YoTeDoSuE0%?|T+%qBG=S+))&B`fWPn1GYprJ;BFQ zUt9&ckn4@ow|}0mCOK`<9{@Z~YO=%3$C(W4&of4I)4$dpL%7ZmS(9K(q*o7!w@N%8 zv@qVfQRCA~>^!MxQ(sx4|3^mN@y-00*eR*kp-wQ3GY6c#@kZBoh>%)Py&Tgg$6k<{ zlf^1lPI@;72!C__yR0JhwplaPMAz8@jnP@C4|;2Htq^JroqR}&Bhu|5v&**DpUI6j zodz%8MTFwi8Py}@F7Ix!&mt$8Ex#szyoPR66S&Zr0_cS~$OW(*|9<`x!uR^x^->a9 z-A-*gDdv8-AhS5OL%59@W?S^0o)8Lq)PS(wz6?&+SN1-J2{xComIjMc3r<>i;CGTeVkwT$)Rjl=CQaRl!Rrd`& z94>-u5T>Md&tO8`Shw_F>zCsFGLZ+0|54ce4yO*9(jkl-*ZNjic7+~)JJ#TerO)yn zrrhga)8$$`a9s+IS?3b&J1z9j3A1L`e0_Bi&tS>!@YI&nkpB`G`EOC_Z}3 zjNj$9rcM5Iqi9M#p*E;)+j1uPm!39Zs9q)cJcyA)xBC#U-g@%H= zLPMhr9U;2CR^jgqlr3j7P^|aN(VB;$WY%0<3*+n~jQe|1SV=MZ1iRYO&8(VZMbs^; ze90Slvu%=z8W;Fw6TuE1;pdJ!fEbFM#?y^={zn1e9hi;zbR}rzqE5dDRu+TK?Q*VX zW_a+-Roh30^N&{ptbQ(l&NRxP6_d)f#=*X~pf2S=tsBPKmgZ6wMX%^o?%F4)$*1(?wxObK zuec!A@3`rVZ_>NjVX#&_WS~uAAu!brn!r0u8YF~gzq0!KSEOyfGLp@e;9*6x=|zOo5{h~ zY4`6@tRAUStpPa-OP2jf&Q6}r)Qxpid+UJrz$L#$)-J!w9 z7py)r=d*U9dybAIy%jJ}{i7#9=~!FQ=Ia>WqQBZVo~MnR{a zkscwiFN8O`P4}cFy1>)__PjBRQNw+TQBgggt=b6k&PQ^L$j@z{JeM0LU|W&dDYV0E z1SF~VH@zMKkTkOUCumXNIfLu21SvxJP(PlfRVrAXYX&l(rwke`SO0E$r_3b z$VX*t&sOldW{9O{X3pSuZB^m>Jlo+SQ+NoX!C(6wL-9Vb69*9|2c60Z{5*`g za?zsU0U791KEMf-KE6u%8;;ddJGL>n%0fqcP2%`HN1Ee*56zHwaf$Eh-7j3KMwV50>3`Vhz5U=Qg-?o4+LtZ#POb)35>ZKh z1=igy;u!$}6Sn9%E!ydc2lmQOzpE@?n_fMHavSz8l98@oTpS>OU4HldM5>2A*_zfh z(y6jvKf1W7nPg?a=xbExIwXC<*nwcQYnp>RAGrMZTH>X>^v>@ZRn|^XOQxY#lUtmXDv7z?Yw`a-A++5lF3%BZ<4(>SG zmiXY26k`uoSAQ=%@RPJENxGQXD-dYD;6n7 zy!SCcy^0s2VTDYwL&TdBOxKzlKYsroo|U5N4Bp47_dlML8c+NrS{}}Rz@WK4h6o8n zN-~n{E$;nC@n&;kuJ_mH$L*uaGu*yFf=4moTq9YX))Kh=8gqM3BECA!hWYeGJx=KX zW%69V>-~fTA97eRd||?;K-;X`ATv$(7(@zKM=fL*CfE)D=!w@)bO;i)Sd6v3%;GU& zjITQQ!OpWpvh!R6NV0$~@Zu9J+azx_-~1C)$eEy#3%Gt;z>?wXQ?*`7U<+^T1+z2Z z*QWHQH|^_=J%D%Qrl}eW*i!ALEsz>y9Zb80UwE+UzZ&i@>*M2bXA_=%bXFvUWG|EC zAIu<3BtnFNI(>4xwPTJ))*8Ont+q5pG(nY^F2p@|SoEa$LrW*IueWCy)j9*o=-Ct; zRdRn4Y!gOb-_NN3g#jtMLp56&6lyx@pAy?>!GWfl;;>M3m5$alzY#{~of0xls=2xc zNAZ)5uq?*`|2lgb1(p*TFjT2#Y?=}hdW%OFhEc;!_6&V`=MJp$`j@38A3994Ti>U- zs|bK>6=#x({e9L5hJTGAP7_bXO7>HqcG(1|Wjg2)zwCqg8wlG#z*qjsF)rx+M5=dQ zr4-s^Mc8}DZd0& znMJgoC1L+NXZ~5PNnnCe2SVkP7xp?u+|r;v-blX`%A>b%ARibw0SU7*>|A1m`WfEb z0^Xg&$S&{}Y8o|1bl0n~1?}T{!eu+A-HKUxUFw2pEa#P+9{%1^V#lX%n}>6gNde}C z_h#J4qhorP7RYMd@A|^^8>!Ig$bx3B`_HPD?tqQ3;?%~|<+QrQHB@9-Z>%+uHAsvcNMz#ELsTGddTuDQ{qh31c^t+|&i zTpVErTGDc>Zkwbfnwr!bfs5|9G{6r#*0p*N9HdWrgtFR_&9Az%+4VU>52fyO+BhB| z(dElyvB2_AuvQGlouE71s3qDRz3g~A;#Ww{W0Y*F)7Liem07Fy4LgpSdH{z>TIBhk z9&u!`xW=+C^xdpSlwkkapQIR6Wb4IBRdC~Mk*fSvqg48FP>@MEKPD6?Sx8){`rkFP z=k(84AIF(c#OZ>b7GJmR3ge!BLzCs`bxAeZ*apH`<6rbKfI`{?EQh#<6Dh5Ec!=uJ z_;9|miio#d$B+9yQx&ssS}rjIG|IMGcHp@h4FLmA^h~bbzdTs=ay2noOOYr**d~>h z$Cyt|5iZ#l0JigH9k%-3lNolNh^BHk`l)7m{$WC_KxniKF`;Wq@ zA27zJbKIGicQcMs?c@D1Wx5VkL!& zH#$q%EINk?`1!?2eKHhJc74}o*IJ;ap8smtz`xnHdJN^`{axiUyohqoJaSf9j)=G5 zVg5b6BmU|Gyt68c%%W8P3@{4@5pSWar(Wy%Uw`%dT6!E`(EotaEuPUK@K5R8Jdf&# zJefCl4hGbECl!|SuWNQoQ9OCDx^GCyE=IClxuopw5N>I2n#6m&?sZ6Fzs2N0xj$mx zN(QrEX~|bvq{z(&TN}*kjH2q=(T#(O9xZN;mO)b{1XNVmpYi>shgIeu(P5jby2GRcDddy`TqS;}itin}%xUc{F`b%@FbG_n~bj4$e#g zS;s4j3~UTP**nYTwt48uNKd@dCR4gEVx@M~ z#kc`tTmVoP0hzbYJyt=4Y@z4ikfR70M9&^4h(qWT4El)L#cs;@n=a-Dr`FIdQ=AYV z_rUTSI-k90b;d`8f~!(8&Lc{vhHNgVyz@F7_M0~utWZSrX#B_Ivh{Lb;Rdhtakc#y z4%BCNjD1QU2X_sWYan`1=!=bp1RENx~G^4ecp3wluuKg}B-84?(P)JV?G+4Y^ zJWew|-*ak&@KTdT+^!zGbUcWkRmpy-fB}p zUN+iP%=w)kHIL*ttYs||Es@ie8j3+j-mc^IvkTV$(&wRM9cnJw)Nr_MkJlD3jlP$< zCjF%!qF)?@vWWP6T*wmD+nyoG-~Eh7wmsoUeb0>iScI#MgDn8}T{s*S7_@GuxPDX& zHyxt~KcCp?V5X;~Rrotk051Pr>O{&u_wifIL#P_2F53zBIyaHiPfz;iFxlA)I!Y?A zkr~g0B?sAV1e4^2A~x^xj@i3-V*FrpFn_?t9e!aw%0XI6mduK{fQ+?I)zjK4r*vW;r6{{>Sja0uiI0u*S?C>6cF{rJ2+GBLZB_0+Uen)oT>fTL}RcG z>C4-dqK9}lcl-^n*zVr%l##CzED3%^cl{QW51vnzqp);5m)}iWF*x8C(oLhT8A zaRBL3@beU7+ecG7cOH7XrhYLT2%}oFLa+b~-_~rKEV|5YeyBN5eS~ucI51_F;+P6r z!`l<`GCBNRM}PRbUJPLtLbE(`@Zm^AvYH4zLy)uKx%XFa@KToITf)WOpx_ zICh-yVb>{_m1UW&hsVT=-80YE@!-JWJG1l3QXHAmO+DZ#H$rLnD|`55ns)K)T~mrX zZjSlaPR)_^D~Q`VgvI_>byE&0Mv08_{ecjLW?<40*{ed1`@St!G{0ZD((Eyr)Q;Re zEm-qxA-hLXbCwZt6CdpEAjZFB@NTv>B!3Dt8Nc+kvZn@z0Az7h1?Erqnh&ZM8K`M{ z_@g+<-rwdE`B3Z?e7On0UOl&szL{0>Q_p9_S+!SpeL=V8`KouCY@a3RStUu*09Csy zk5?7^h%{%LT6-Pb&ui?uB*v4CSVmA5iqt$}Es_)sbOD=*K`#a+Ftr939luwsbHLU- z#qM{KmxpW_U2YUMQ4-3?d$lWc6)VDH$8Bk+#0Td0qafrR3svQm(b|!kP4ftbh6Qt# zC(iXzM^@Oc_sbr6^`so@^fxg>h7pfq%yL4^>i-+u>-iWm`fg z2pcw(RhoTQ^Ntdq+C`N5-Dy%fk(CQvNrh<>(2&i*fOi*SMEpq%^x~!1 z8^*GqsXd}M7U1u3iMSNRD}rHfE8-3*>iBGoVT9jNN%X`t-*BxVtO;>liofZb}3QR2R97CsPo;DWLj7X+BTTQJILAqmo$Q|SE$Q8c}sFMM%K@wmIE` zFx}y9YSRJAFT2m*;e9S6V$n`EYt-aku1~tAG*oU0DGu+2wok6=o=k-<_SKSgY30Q1 zbb-MHKkwV9H{29I_K+cm2s%Fmy)9&Vw(<5bqi(sEaqpLn{KqO<-zmRC)#I+j3A6Cp zXBC$J%z?g{FLQo;79C)^cEIIGpt65vp(aSe^n`SLDMxQAJ1V$)Qs}V%uN8SeEzn4R z;pl%|-{%=WaLSYM-U&LIv*jgWc2InI*l3^zskqXGhdR9{FPBs4ZyNh;IxU-!mG9)Y zBJl`aqW&zr_=Ru|-fkhs;)jwsfLtVMZP>C#wSlmgidfS#8nokm*ZaEo<1Ah&&NvD) z&uI1g;s7CuiUgJ5!d;oj(%0HlO;sTZKZYdMJ$+j+b(RzsYaq=+{W~d`wHwpfS$|s7SpGGJJBb?zDNn)qQ!9EUa)sc z*M@H=b_Jrl=?mO%NJEI4oBzu;Poifh4IP*gvXaVl-kXa{bc@P;)qsZ}BLjJBWX-F? zg}Zor%m@wUjl*p2ecefORrbsmZ?Odq2K5OVQxEIzbut`Bu=kr-5x4B_7GV`KLEb-r z>alMRSghe+0>51#_ouzbg?Y!?<=;buBYI9IGS*e4+x{Auk4xnJ^5@)A43{2kTr zfW73{F7%l~z=7@+eN5Kz9@6;52%6n;68(x?2R)H?x0t)mGv`%AyTL8rZPJxlF`>S% zkZA%SU5U2e^qRLBg}e#i-D)0Vj#;+V>#4iY`bdiIrpDjZNXLKG8T!hU@qjVv1)iJ! z#-#?>Ohtece#`xwi%)klW3ffB-0#fSZg6v|Io%)k0POj;R`iD)YlU~>vcl}3y_cq@ z$~rt;fV7V5U3{Q#9C|-_w@D-Rqv4yIye@=9^?TxL$w;<_j3&udWU;1l!0}2o`2FmK z{7+X;p%`%uNaL+OlcCflxxB;-2PQmbZ+hlARM-q^49Z=)4;1w|Zy64p94@N{gc6O~ z^ouPm0bY-Q&-qf`P(Jzv;ByI-?DC9Qut+~EJYtF%1{Z;M#*yt|DK zNDrink!z*ZaDU61_QHdyt@x>skT_CG#(;wPpJKQmVHZM>wT;o9!ofnRK^iUo+oE!~ z8<$cM%Bz1w&PD9DS~toO)&|OaT_gJ^$vq}!t0hdcsqofO{D>&Leb0$}O!&bO8Xrgr z!^)*eJZf*V`fJJX5#|DW=R3X{dd;U2f+@eC?BXRDgNI_)VgaNJs*^d z6rH&>KbTEbPEoWjDo76XJ4uw(psijge%&986gmkS{8`2GK|a(4;VIiH=I-zTMi)53 z8`x2$?}r+DvALHpPSV9-J!6UqSaC;*-OsJRuMk6x3n@L!sm?!x=%%o*SQKW1W+|N@ z;)UvCA`>$=ujGC9Owd;@2^yLhm2RK=IP0TwOUF>e~$P`>WYj(rE zsHbiE^eK^Xs#cy%$LndAeNBk2s-6ewP+KeRVgpZ0@ttgkmmtng9@>cuy_I$o-B#j_ z7U|@{UGZIo82uq{SfrAYSUHzhdFoPC!Kk^RUf5Mjp0ae0k-yN5jS(m`s4>qbB|9v{ z-lAobD()cxKb9i)#x$t`)uBD#vU)qG@pnJ?y5aQQe`*i@sng@ztUylR#nk8iY;nBc z_>_DpO4Y4)qj3fhdMhEcR`jKSN{#L*C~_Rfe|~gW4kk}J^S*D_y14%Y5PBZp`e2}A zv;P#}%*+9lN|@?EY`_P$Y!)Y>A=8tYwL_>?&`+mQ68}WQ<}JBJ)T$Nu~(a zh6q}hkSWZjaai4`5Sx>G;uig@L-l@iY?gDWpr{Y=nZ! zTI7`!_w36$LO6<;+vt}ssZEpoXg&6i7jQOJ+IK6EbTVXRKspK&KTp(*TUJ%X9_OMp z`tyG3@OZqA{7Bx}xG*3ER|c6c-kh#Y7!iA}ajl1jp;P`AoUp%+=_D`nFB5HHeT60W z(p3DP?rZ$5`sLZ6Jca|S<5r65Xc!^AxWoPLM} zQFnFRnN{NkadcGpuDP0{AP*D%JQz}_piPaU8cFoS$(Iv;V6c~21yD6O!@2oLBgVRE zGcAHls)sBWMWerLeDnlspXGzxxnfSNJKvANLk0=Fkq?RQE2=k%q;H!RSy^Sf>hg;G zvDL-xGD}jtLH;+KZ`J6JdH~R1ba;g1cz13zBP~bAh_Bt~sC0(imhjJ`BliQ9h8M;2 zK`v?nE(ah5mXj9k%r;W#)4A7o*iHs`Bjp`>8^f=Y+kTBt8n{(aO&3JZo zst`17%vj74Cnqlh=%#q_bD%lp&5v7Dr1d(0Z|NpOP^GB2@|!n`I&5FPGsUQ$99K^t z8YLDW2E&e(d3bdFrI{Y4ZM|3lCu@HkCr4t5t-XEk{bIqFC zu@UZHh)l|Vw*G=zT{`~e*c4y{8!)HHfBTU(F@i;@WJR$jNxdfxqY6(*uDaR#xcea+ zE#o~I_Q)RJA}qI7x$>1TfiAT;i2hZFzKf)U#Jk~M-gN^N+}Z239o*x-Gfa6|Nx9C- z)?}3(2mf?%^?YvYN&5mzwm!z`pVo31FSd(ttJuHl1y}Bb=e$Rf0TqHdhA^f>FsQyGu^=9@y)7iuTIEV*NZa*ev(`5+%xL*;5u30D2oYezK$YarSmyZ3z=Oxf8-a=nr+ z%D8^}e0VgJM`b#KCY;BXRNlwv(wJMEsKw@-x?p6Pn7+5U*gz5>+8zQ=wrfwh0KaPu zbw#9Ge6pL%TPqE-jvH%NX7+qeJ{}?{pAl&pP0aNrROe&F{;I7OJ+q2n<|mwO*Qur7 z)p2I(!f8>E;jeVhxJAUZy1icDs#KYel*B)u=()YO7@+B=I0QIT631NgR(N}|35_*q z#}2_1)6DqKg|{0;@(;S+kG#5{Ew&+<*G|r8XH{?a>Q>vn62B{gS7l5Q&&}lQP+STl7PbX~$*+6Lr&966VSf5a0*s2!!2z!xoh?o$!T-))y*IDX^ zu>;HAXP2(E$sJsCq|ojb_wB9CVEO5XL#3q|YM1p^JUoOOxl28*DU9&M9sD2J2KBis z&C^@-0gKW|dV|lVXfw$X@piuhU)wqxxno)LgH>`r=EY_j0(OrU^3g9NtPFlVJiT3juUQ)XW&3x;#26SN6}Oto;(>dh^Y;M{vcgHupoZ6wZojW=tvU(Q3^*-mh(+QP0y`!njMI+^*%JiSrWUj%vloNEY-YRpr^ z@Mdr1v*tNGiL#1!6^5zDE5;j$dJJCVwVy5hBBc{Hv8@NXZ)(iLDB1!|NBFxHRcx z+1#=Xebor-Kz04{yKF-lOM(e{uz^wxxJn-g+-}Tv^X#^z>f9&!nsuNghV1*<_1-8g z4Fawrz8^BDEH_=;0=oy2C$A4{{V;hJw+X+KRx%A%-)(hP=HK%k6wrD#1z=dtvyFH` zr2V5N7$&iy8Jq)E@<)YV_|#B z6aq>Xcjun9w_W=GzHf)2`_~fi*}iQT$|)Y~&bbA5Q4DM!1k=(-x^+C_&z^-|W+WQ) z@JaX2#8vXL?19yNt49P=+SnIAO!L*S(el+bs4w7|Y+ZDE%=cilQPReyu`Sz18|`ezUSl(Slkt z-#kw^v<+H5GCYjX_uqVX(#Oq;g;oLwv6h17A9@Vzuzx*Oy-Jtq-$(<|t)%NHY)#Rv z^jjmZuRHTy3qHL5yF-@b*@I@rSp92>T73EQc4p89vwd$7o!jBwjek53KlN7QUe{Y~ z)ZI|gB*O~>*&b{tQK|mcDK{1$xoU5m_RjEvx%AK);7e!Qpi8+IC&|MB1&u(}Pdyy0 zQS!XeA(>Z|OGKpv6URmk6?GrJ=Q0*IF8*9_v=U;v7THiW@;d%W&p96#YX&{D*?r(u zGL=6Wq=(HwMbJxtb# z$oAQ3$J;b1>A(A0uV%KDo|JF47ai^Y-Dr?%V7BVB+smo3c-(3?>#bAT2y72UPq}bt zeX(BgC~~R#=`IX$`c|?0_{Ih|{i|@b8DAs^{l{e@Vy;2Ed(+qE`kx(Z>cUR40OeVv z71?tl0r^SV#k?Q`CO-(s;)5Ugm~g8RDR2aGSqTszGwEA+^$|` zrYw!rWrWiEYb~_rW!7A-XC=UU!kAlV2nKP>+Tk3F_O`YI{@Ll$NCQpLLQ?1t5}(x! z>|Byzap|x697`xWo?R2A)g!!+I*LV3O3^>R2_kV~H6c|ON^L~%8D{Z^3$eKd)*V_r znF)lV?f{OZBurS%y|Y0{cvX6h!1#8n2q_agZn0Tj+rYm47|3M87V?Znfg&xT`Yc)G+ah9F_@v@ z;c;wf_*|uF#WJMS>bo_o5;5k@m}8PP0mF*(Z0zu(_2?mgy?L-N{=yo z`dt&^8zVo}y7ZM$?kEYiOi$8qh`!@*+LD8%?@&^Fle$>fX1083VL<3et=_y6oIDa& zG-_b14F2*yGEOP3d)IdOn1Yv6nbl{9e`71zbf)|^4}3+-neqygPxL?3 z)@04`TM{HcT`)jNCKesD{snpl)9&w`8spJscb+`p`sMV5@(GUnppc9UqB-=8x&N$M zG46p5kG#5r`RgS`x2*LNf>uwgWH?zmkcG2Kvf_=U#=jrfq4E%AB~M&F`PJUv26p86 zu2je=6*r!1w6@u~`Mmx3#v(bGa*yu&^77Pr#s-M&9mty={yWiwUC`3qHJF6e6r>x) zdxOkC=o9xXlSw%Q_0q-j-&3^<)qXjpsqb@9w~0wf(ROnK+|PKv&(tyo1$LYBNJpde zXZ)%0ildZam|}sj7&y9`8SV#o%uxAEq#&f!_#X`z~Z2O zRa4$f5(;|kU2lt!-9SLvT0g{O@`lZsLjy-hC&g0|IS%Y^~?&x#|#>^^dWp>TiQB zhBV`&x{&)NVrD=yA>B<;tz4tFTo2TgZ9!&MoS&jx0cB?v`Iq5*eXf0lNj;5yj6`>m zEFfU@_I4DikDzV*B(=INr%)ELF(9CgE9Wirl4kvUaZLiYtg2;i&#L8oOr7pF>w}37 zHlXw{r%|(!N!EG|vcR%NUZ_?ILVcm2cemg%C$3BT6EWXQNS->bsKbT74ajH0#;*B} zyN8pTp}&oi&;|?2?SanfSZ>N5i*UupsTv6mRlwIeL%uW;4c*?We6HgS$OrJdNw7Qw zM1SkcBU{Y#PUN2_Zuh*r|KcFV;}^0HHDK-f@rN_4uk`9gsC$Nb&DcLN@5(eGwWdv3 zuV~us*=xQ8)>zG#qyK>9-Zr*bVUrDqwDF^=`T~`SYmx|G9r&G@?g>a>WgYy{j8)^z zZi{F~i+xy1Y#|TH-&xL>1O%Plm>_2f@}f4WKT^8wMFp!Q_)byA&k;R80~jGBR>QVm ztx+piSVfzczdznP-aM+VO}L_(x)2hXLvML6${^YFIMZY_!(6i0?-nX#8)^94@r%C{{m66>wVoc0-zviWG~~#;JYOBZPK`)6L4;>gxOK zt7!AZoV>V}z)VG1R7=LoZyWpy(*tV;Pj4JV{>?2HHqEoR*tu9NyPFA+ziDhbvpeNFYLuosB$|d6 zYHWc+hic1$0t{nW%vnwNmEHTsQss(eo;N<_Zl&Tt)~X7@5^`hm z;6WbqcUmUX=jIkYV=*Dw@qjliHsqHeS&ghf&2H~PMTRu#9T9rQAl(R(-txHnUQTIf zB;Ao)a?^kiJEQGrx${uuCURY3WTh`B$aehRrm|0MdBk|LCl#g$^0jZDB7(oev zwa=Ep8Fg-lO>{&6W-gt(IJmQWY=vxMOm!fLkJ|2V?(ry@Ya8)=CRwyS9qrBV>>fNH{=O`zn z*Y|r`i*~+$iHi+a%oi&4DCe0PUK^HF;7jfMO+0UTpDJC7kaxyJ%LB;BL4Q?Do2|f| zo~(R3Xv1U+?0d6a0<5q$;K+(Yp#aM*x*|}HW?0gXHs`;?mSvZp7ACTR)Hm$005;TO zhyA0c9v~Ab9eC|v>E%J52GbpUmLE`o|3}qX1vL5o?|+I4f{N183WCHy329J~7LXb; zN<~DNqhqvygmg`m6e)>;#2DQnAUW7z^hW1K4j6oX`yTuc{s%kX!SmeD`+i^7^}2Si zmhH1R`nc9zS<0?!Q&A$!At=v@Y;nI}31`CkSZA+?KRT{2d97*pEoxAy3sRY_H~lVX zUrc-)LfnuQ%r5B%B}`3}T4q4JkOwjsf-^AAQ>*SId^vOPjS@+$9as`9e?<78n&Lv4NV$v4lc>4(B_{MMeJ0g2af<4;nnHVh! zKl1<)ZAf}Yt`gv(it^0UE2a;-IgQsw64GWmd5C>qEs1-?y3?BQ*rdwT&-r#(RvFQv_4m{DSI# z4^)7Clf;FTygT8@^R_?Rs0*|px|p8U+k7u- z$EOW!t801;ADaP;FL8(U&8SKGl{*-Fw`3_EZj{?^Eq>`dGkB4YGxk}A%(ga4SSQbx zZU(;iK~eE1vFlkjy2$DIPw1rbzIf?fx#kW~s=OF>Mndp5DGQd2O#Lm~k>{6IZthn) zpR`>`r2W%Yk__V=!uEnrU!-@PT{+`?w;5k2nCaOAaUd9m%kW%VE<0$}ku)C|&djbW zHrCO6>^$q|vo8z3KI8>4FXHvii1v1?GHPszM$g?b*82VGu2_2 zp8Wmk4&ylDzNLx`r;4_;l3hZzBxr2)dP>(Kcuw={H?u3{7O#2gW_y*l^T{3yAC(QE z_{%M#7riO^*F~wQ1Sb18^Y`QWeeC^K_lIdab1qqu!+Nh5%t1Qnj4c2CXweAXP*Woo z* z^whW;l`XBXa4CJQMaGh>I=9{ljxo?x-Oa- z->I6P>@i~ac7Z`M{0RDHo+R&b*bkt;CYsY_7&*sFT#cw%tr^ERCBtayGzEJCr86;9 zP-jaT_5Me=LSiwRo~=nbPfAq&oL9y6R{*d*^q4&QU|S(GXC93#>(;e3IWj7^GCd8S z>YLpc@z8jZf&EnlLO&%2g)KDOcHsV<7Uq>wIcAxJt(Z@CuZ80x)!~9waOdxf*pxQT zV7jK8i-FF^)Y!m8&@fMvaKBVy_uo~H^&Dcc@>Sv(k9yl_T9kxWz7YeZc3bFf%V)b< z#T9Co(p8xGD=KL0_s3J!dix?hp5pr0d1-M;WU5q}Rif(@pU9As7s7N|#JzjnMXwx1 zwRcHY7DVK2m#ELJU@$3R$gx=PveRsePvB9S-dMl`YMlY^&@ec*B|$Jg<@-z_yW^5w ztMlx$jjL+C=~|({0Mq-#aUf4fDs;cVF~}-x2=6ggK;-*8gd}v09&Wp1W(1h_I+l84 z{Sq1XF5t8Y%4)wHgMbm;hrrs$v-kDAc(q?20|q}|=fCAjZJjGS$xbvzH|!o~Nx+|M zyc5gd|Bd?`ADFtEw>$uj&$MT1r}e{xNH8dkxQ7N`VB#GmV&ta2{P@`8eyLl+9O)PxL$%-RuM}@lb#`Ko1Wo-+H-H5aCCn zDX;WBWG3?7?+(}pnoUt>qfVD6w4;FEBI=e(CA@p9Dww3}a=1AqC1H+jMnp639O^D1k! zp2LoyN%P?p28Tri=YIhGr&NUXM{MHBkJtGE;;oYXlY()Rt9-hx!HWqr>#a9FIdAQP zpvGohBvx*KeBX{!MR)7fb>6#3ROo=Y9-bKKpe5`mP+(US!W$fc3yua-9G(6He0-Pk zTDI}}eH`68E}y~uSUZ}q%uIKLNU?{KCDu^iBH)0CF4!vGS8z%WQT>DT(5}nrDaZ>crBII)4JFH0m@W6QBEnr>nEoh9zAj5JhYZmXUFE%7zwOZ!Z#dZJMeg$ zH_lJD{z zFMsU?_Y(O!A6LLeYa+0zzVw5FTQ5G6hvb(MhACoP-8P)H)ui{F#%E%`nYm*O~MgGNi8N3!5pfr;=O!=6Dcs|;&)`uzu23fz><4k+E z87_Qx?J5*DphtWV8RFTVHzR``WIxpodMcAyf1kj8)Kdw zqXnI}{HRXd@3k3`X^a}i^99UZ4(S0jy#E1oyU9@KLgO&o#t4=1GN<>fs1Ml4(e9$G zc=fJIZMDOiqDT7NZL+@`o)NH-EmVU|?iR1muMd5xkoXDIUvVXHamY}eY(dr_o=P%9 zute+4uh1K}m(rBfZ%ZGpqE9fHB~s3()5Esb!Df|zOBE07SQ$(V&0$C`psBf-(|I6f z7dWq{dYL#Jf*ig(3@vZ+Zg`gmu(RULsvJ3s*YIe0FhY^E!%zFGD6^plH^ij>4t_s= zlWmy$AAmD?w=*ih!y$LlsrUmnEyhWLoBioO*LuK#V91*Ex(RuAadsyRueRkF@Qii2 z4{r7$;!%mhYOz9re#>i=l4K5{CB}{L=%55I%(0j!8e^UNzB~)e+K^6lvo>zKyJczDx&(@Nu;$gKe% zc?U{q7Lhg-(PV~?GtslXQyWd3k{y@o<46`jj!Pva>L^7#3N-x0r9WgKvJO>J@!NPS zuf_0O)}CSTNe0L`#%)w%Z)ysRX{iV*Q31_AZ6safIQ4RRV*75yayh=9t!4Xra5JY9 z1+FLLTp?5KoG<)>;>v9|K+YR2P;|LlQp#Ql#ye~wCd;tr2qy?0I^i@fbj@WS@e<~t z0>-)xuP4xN0v#TlWc_q&UJTgbA!Q$=W(u$x*s7^UVN6+_CdA%3iXlub!4+N#O3oNu z%aLUURdN+rIKS5O?;|R4PN|I(M0X9-d%te@s*X6{)eEs-y5uNFE-4R`oED}wh@YZB z1vf6#WEf*=8Z-31gS2sXIsRUujJt?Fko+#bKpym&1fiig~VRuo_*{%PBrOEOsEw%>+Q;o-L!k*2&f zB+ZNk2I#vD@A!^|l-snihsuE-uVB<|AxXBk-TLyr?fxJh7O~a68kTaq7Ac0U^{_~f zjBPS^TPzKf+8H*n)E?oOSP1-lC%dlO*Y`;0MrA*oI?_mrmd+b`zd}}wia-!MLGbpe zf0f3i=Bz@?d4771!h_D%`7@wXizoVv)L!L%b1LGlbWP{xY+;VXK-8BrKC)Zfq_L~J zrr#|oSgG30fJ=B6W{A(Gqp~(;q%tXq)N9g5GnTe^O2%H?f$Hi@i4f3&iA~#Kp{~~q zmn~YjF-^9G8*;=oOd9sqtGgP%*xz06o#lH>xe7D(NeR^(h6XYg7hN?-6&ufNZ4CO5 zmlw1L-axJ)oHH7RJ8kYYkhTlMepy|Y+{q$56R=w`{jj0rhCLZq6(OR&mNjWM7$AW~ zxR)Jr3}TPC_lIadO;F`c0?@qom9-;CF3IW1@{G&#@*+ptu;J&y0!FZjCUxPj0`a6{ zn?CuMmF>3-6b8lW_ImY>dTEdy3KxaGJS3YK%+7;Da%@+(*!-wYBbORRPtc_-UI z#Qc?s|2rY3J%(<&m;MY;Zz0;3H}WLp{Os2SPS!t-YL8Adiux4meZ`NN+5^XqXUn`F z+2v=2`Mdr-TW2(^;vGP6;q0^TDl1w)mprXOc6fu5;*j|o0y9a@Px&U0W9(>QY_P5d z+};4gUj}Ns>vw~PK+CHW>#W`t?{ zy)AuUrouWeV+U!m_wi|*5(A%FMRtPuqNxcaE{jPGm#Y5&Lvugt9$0AeFL67_?@nSW zy8Ib$!~AWiU-K-C3vh{RfXOw`UE1OZm-E$=k+s(YdSyG{pSL)mdg-zOtsxJVT^Sn`}Bfs|au!v5#Ebn~_2t`rA8aFFHP#j%JlS@yNMT2~(jX?7; z2Tzm(0{l?#db@C{1rVvOGS0=I=lPePw9Y!yo#hjf#yKm6!zs3q1&CN<-5joc{Ch~B zRkBX|X^OdWa2dH5RD){9~(!v`h8Hsx!Vmie?>%oi}V-#>T<(3Le98VWJh{B zOply|ls`N?8?=>Ra)R|EYRh(E<>tW=1O8J^SnF#r;{iNx!D8d+FUK_Y2Kyh~T}cKZ z0;*r6X>vLW$ZphS5j&*eTkew_W-Yu_G^e8sNs-I@aT5@D~GU?#IU&(udyQrIe!G%?=Sj^+5l!FGjt*x>qqfWsuP zjZ84>x?;c0hHl3pH`|Tr*W9PIw5x{cZbs3_3!C?6;wrvor4l~+D$Pr${?iEdy688^jV=O8S%_pU(Hx_z>x zCg@Vk$Go&dY#ua(CvnrnmOkoa%vIR7&KDt!lg;0ubOaS2y{e2jtEbuf9o!gSigs`@ z@$>G%SXDV%h{z7I3T5bPp8Gvm`ZpXI%t+BMCYyjJ@*1^20rMY(>V(eN3Gz}r%W`NP zv&HL3%BSXEFnY5(DSl6@#6N9jKA!24yvw6aP>TgWsU|2v=}%RZ49A^imNNQ(Z0AWm zd?)?aD)I45EES8a=o9N@%f&uo2a|j$_&)Q=t?L{^S_U2ot7iQ>%MvZ=ryQaqM{aq~ zYVfle#>cE#CmExg6&fzR606ThUcE63XcuUBVcroOpxobW>0?za5c@yaQw1F)o4sz& zi)&Yk^h$nUhet|*RjYfoi_y#|@M^H5%Re1Dkc#H`uf zmNVzd`nS_q6Ro#b8+x6pQaS(t-W>R=T2gQf_1bg=5mM92`QqP`{v_$=|16#57}LCW z9vOI$Ulk1AeSQZ-ac(%mj;{YXVdKpgdnc;uqUvlZ=fDbePV;FwzmtzBTgsPj>9+FJo?&`BB_mq|utP<^an^zmhdcY4i0i@)We}#YhHzdmTq)x|41mVMM~fNDzBz7B_`)(h~v z)2f^+@u{mrQCFeJskuU`Ub;c*geU*l%1@DTLqm(plT8%1zTx1sqcf!Jv~AkTk*o zVJ4yppKm-$Z)n-r5Ir6{J(3HsU&vtrlfk_fSP5;*zbK7;XO0W6;qoMc3;7uk*{FW? zC`oY4vOap9rv1L1n4o=C{wn{CWmf|!5oJAm4x6>(pY>CCVeV2#t{sq>gA_kF5^XJk z?e@O7egZ9wG^qbk{#fFv_|v=VSbCKWrdKggG0)~!g9zjUaeY`vW`2Ikikq>y&RX-f zLWA7qdrP8lsIqzK$A)Z#1H78*6wH@$NK|~E=_8C(U$CWzRajHq=1GeK1HmXkpzEem z4P;q@=E(vhKb)i2FRfEmn0mol7}%|xbOPq>dNyR!#U^Q*UJmG}zur!}(xW9y+gU^M zI*!`eIpFe7t<&aIh|;`rk3V~UE0&teMTsC(!PHkRwZtTxli5jU?R>LawiLdFYPEM> zhB9|%Kb%mub13>(dM)3+Ux>Jse2pN;?Z3oKP0Uc_%E%rTPfoKgrhm`)#s|G=DT+4` z6ZQWOaA!S8BEr%$Sr6mRZU<ki>_cE=wCcXq>|_6RL`Ky#cI%m%#A3Ys zvHWp)STFD831y{4pcJ*4*Hq_fciqP^IgV%X-?ynn#65=ix=+xEJZHOjI{4eDn~g?V z{VZ<)0B(AHcgZL@Rj%rBSsu}C&-J`(a}McJ@pTL3TuC}bM%EUB2h)bexewp0_Q{GE z=*^88X81qcEXXOX5`XQecAG%`J$LUGbuuqca|Ln@`|^Y?C`Xdx6*B?SSir5x zatG=NM^a4?%7qrF`#c2r&VMlOy#ZTr_dhsT$#60-iawWI9~run#bI0u&U3N+xb$nQ zCfVk2+kbwbaBrZ993RX%y^eeND^SyyUb7%d{Hfr=XWuqq;x9tSoWewtK3n+j^(spz zslUwq-^@N7pXDE1{Q5K8X#m$NN(){D=W6 zKN#Gjiuk=UmAsgmf(N>1{pC^&74jEh;)-E0&W@+L2bs zTpxazdIGMQVM%Wt0`BeZqjPzwxckwAm_c?eRC99`N>td=yFae?(hrYB6;ep3M|-C- z&!R0GIn1g)OjEn3=!TF9Ltof(*glh{EA7DFVH>w3^9#;^r;S9Lw30H{s0<5R;8G%A z7PA123Z3{ICHAN!h>axFOdE5p@+ViWw0Pp5&xwNOCh$+ZTI$1h8Rl85t>VsVt!)ps z%x}2XGBeV{*5@~ktC4eYb9;_jKVaiKxMfpM@jm<1NMH2dNH{W-SbGt4yxoNUH=**u+P@6_Lnmkf0v?P z?$iO)(jUKH|LtiR>amPrav%qdg@%HAKd9;e*{qb4Yg%j&iOkc>>bD-RuZNfILfi{Z zb{xs5XXJ=)Pma@f;4*9;#gAt66j_tBo&z5I3G8;7B{Otkf&i5h74v_DBL`iicq;-CQDv2t&O51d|EbNgD{$sd}7L#<)B42uQx*bWv&4+yVX}5!eWE7 z9U-ziV$?D$ADNm*NXe*-)N~(m`Z9D%3+_@|q0e#7-Z`gGN4z@Jm>=aL(+H_{bmKG- zfX&>T>U{GEXOgHhV8_jDOpzqgeho1HZ96lq$ISqB2ESAr+|cy%=4~ZdwkP1va&Fp! z*AriQ9(^Aa8SZPmq$5A1x*K2;AQ?=6DxDd5LKx1zFKR#vYmCp#zS4+NH>WNLr`aU} zOVd%~!J6B1<TS{=Pwqn+ccO!^4*yt$8-I-pR70k=<1~VboFk+emZle?>oexi{#_}Ec%wQveXF) zh=qqUZenM9tS?{}rA5-}2;wI;7StkOJzh`A;#@Qc5GJ9EqlvH3%4!`Pi+eyl2XkkB z?L@^&&b6!B&hh!*ZSQ$1RNdt9n>_HUj&B-gP|EO!U&q6Ft&G;S>rK33SQxJM+gZ;Z zMY*!JE)-T%M_`~INR;O|1qGC31}?8xtlAZTiet;*cagtVoFs;@`Wku;=%BOI3tpI3 z_XR)tkPY3==1L=e#wF+$mOUGZ01;ci9G=^Dv8M~cOD8-1_#Ja2Hca@k+0*EKmn8qU z(P#dA>AoQytfISxk9hI(h|QSrOG*a}Z-0 zkxn<&m8%Uux~Zv|7tY&BbDDAS?4k0)Jk6~=zagAL)r_$~nL0_9IX(A3Gy--v3>1%rfAS28 zc(&e#l|Ca~iLtx7l$Hi4pVr1{x!ACL$PHy=*~kV~OBUH!&NCFew;(*ObA3h&@xbzw zm_JE@BV5D+l4=SxMPW{&R#<~MY7W-1v|bMao=e}v^>$I)Cs&_O%)cbD+!2o|0cq6T zs(McoGT-W|$oJ_m9sAiUP+)NDA#o7;7d~_m#W=rx`RKrI|J<- zBm$dj-pt5+^6d%AZXL=e!i(a70oT2NO(yF3GcVsKF2Nnzc&`ON|$;R)%eYnP0poMVEmO%$--XAXmqm6Z*N6p!Pm@!l? zRuQcYFWdaaD^)XrfI1Ue!za6*u-ZS+7F?~pPH_X<2w^B1l2M35mFIJyda2SIdwR^D z)uatDHJ|Dc%NGu+0yp&@7l2u3&cnQyYZ{P^Zqv4M{*UL>s>u;CH?kj&?E-Pyo%iZ~ zaKN`m6IkDEwyP?}wAFG_#w`8=*v)hm&c^=Zh|42;6V--U&3kk1AZ=OtYfoba9{i(! z_qZyn4;4zcLD!B)tdGIkTX?}Zx)1t7_qT5+veH|`@a3*#p8utYQ2hx{U^5Dx7D1L~ zoiqxn_PaInn&*>KK%0!sypj4v#>kcjbwrKTDA1ZvcGd0aTT=dBn>}i$hiMBgH_7uh z6JGjC9eAa*+RsC4=#x(b+U2_hVUDGcgTjv&_eg0J0Ticod{&9oWY@C&naoX55de4X zi1#6nn<<4S7#}ESUDu2jFVCxkDWej(p_=@OnjVwy?Wp}(sqdGKBs+;Gyql%;iA7pB zMMQ+(kL5I^`{`-<__xGBlY~MR8QCGK618La7h%Q@{JC$oB9kTwd$Ph^YK)sUd=o7L zZl0}>=%4oEpFLf zj-$i8evwp}aj$w*Q`3WNH&-h=Oam+GoTEqY$cn^1vg%%W5j|z&D^JlE?y9&0YcvU+ zBUnYeB55|#90EMc0)xBf#3l|hAdqQ&ou6@+yKLAdFL8Us28TP8VH=Xo_b3L9S`5aA z1;WBSL2`M`sbK4|#vuCv+sKxOX^a0{Kap&?1V!fhpHI((dR4_ zg&nHhhE*MLczqZDV#NKg7s9*bfG#>=4PUIM=+1H0Bdd_2HmOl_qLjO_Hr3`U;Zu?+8UD2_Q=%TM_Qb?TN zUiSn0oxaW4W2l9tCy6c2J-`uKV7Z~T&OFQDnM!GErRm~zi4 ziA=y1_M7~D>wQMAD;T4CzarT1lLh3u{(Fg!Z?!&BusUXKB%txrT)%f^;VIjXKQG(f zYrTPSA{s?kJ7{Qdn{G_}F5-lEmS>DYAX}&^>%g0myc9KTfaI^&amHI=z=j%Kj@#_q zH@qnunW`+LfAhBxP5O>11(+C_6#$iREb*d8U0QSI%_D(jalbd5d4!vg9`n)eYt=;? zI<=20SE9D2V~O*gq_x0?i7a})yLt;8=?_1|XfG!|R&wvkhP7>KwX-dyZ2JeEUcIOW zv#jgt6zs|ui{)?k*Jo8gCCeLWJ6*29^17Iv)TUl`zqQ6*z103nIx}U1iXN{~R(%7}#y4N*ruTNT8bda0?^UK}^04YANWrm^ zy`HltnGKf6M!6ZU;qWHVg=D05(?`43Go5Eu`egfem$uv6R6N4|(%wg^3X`SHi3nnt zX;W~`&s&rC>ZtP1AV#9e$Q~ahA@~({UP%8_{$^9Q>XE`Qt8EWwYqXbtnG?0wl!WAN|Hrc*Ywr4EiY=2{b}< z!w(y*z;#J|u8<3K znmVtCAL7R_qxWi<{sRolz5*PqDS=q1=T7);BotxOY5cA2X64_?v@hL7@v)L&Rus21Z594q zbF@XyoeL1ly5_O(xscvS>}<0UBHg80#4Rw4l^ri9UFo>F9n>OJ8Ya|e=g19e4D;)l zNB_hHGY93=B(|=qNS}|IQ6$S?{nVmM9?s5J^|+87wlV2@qFo6M3MxvslqOnz>$)XX z%KrnXr(YlYB8Evt9h(@t#Wfx}_Z`-DHPA*hX(7n#GC=y%87FCh@8SPiUb{E_`P(-% z+xyv%@Am*nH3Y8*ggG8>+pA1|zh{JDXEPn-dHnhwNpTI^s^X15DRiI2q=({K+Z;S%#e@9~sHxlrY2 z73-X(I47N($Ujm;jYpw=Zkr<@;m9VH3MW`9&ijRI>-VIqB>WaFo|DsK`hNOJeR?!HjXBFg( zP8(_cX97QVk8igae+!&{DsA;2AU43-AKy6TA}Hx09xEpm>fS|E_x&ry)npB`4PtSM0;qecWUa(8vqYre?%W;~| zSls`gdjVPR6_w>M1RN!Hwz%Qy=UJ!7W7ceQ`xZJzg0UQ5zU;O1lmveWcwR@eZz)gz zRJ~SpnQ76P`Q0Bu7XCz^8y>L`~?AGQXW4G|*Xe zH>6RkpR)3j74EhXWDRWgqp4z*_hdhu7i@$u>Qg!^*{iWGAOSCSVhjipHN#A67veE` zf8hD!5=CsqcLEER?ZRLA1^j!uN|UY4JvK|0?5Tp)-sCe!S*w}&c8Ehob=&LsmpRJS zIEOjQo6BLfn3XZy^6uEWy0`xGpiYkG1Ssy=82kQ=Vcyj6Et zP{tIOCO6>HzpVQ5#j1I_L3C|Q1|Ds@vTXQkw;qB|`yyL$lRB_FII+h8`xoxiJyO^P zQM8CTU4D!qHRt}Xn;3YO-olxlx+Nvy>T@_YRDlgGj{39of(HPXPZV7KRgU>UH_x zY$IM-&uV?b0&ly=t~EVjG}urOK=3kBNe>6XH*H=!V$yc){RMO+lkO(za9Cy4_ddfU zM4nO=C7F3vYije|v7Yx4;>P#qk7C<0SI==1n&`}QeT#XQPLu6NvYVIzV$Fse=iJWB z1~#Vk$v2<50X@g6`fCY`yX;OjlGRo5qts>K-?$tP0h;ZkY(h?dIYoVpqVvlMucGO8 zG?{sgsdl7DMQ8PLa%Y##gRv%ip2MtynTC+yM9ZG{?t!687?)VevodmmY1S@cCw+DJ z(Lcf1VvA?(nnRD;4rw`l>zcU1;Z)&jzJATLRGpEtCUt4)Y~N#F%n88-o@;1Hx3%l> zW9-t?)AJ2bFBpJArJO?@o$tWWl>nwTK37JSQse247U^m-)G^pozvYJnfr+NxT}Sv( zmM>m5;qC^fY%bXWnIJ^LNQrs~w>9_eXvyjtg6#Pj1ZZu;$A2;%APR=PR%v-t3LtZjvl1 z&$>G9=QSQuE;U%q|Awde66I^#@H2}bc5HxozEj$69&T>n{!i%)Q;Fx5z0dmA{5*Hf z2Yu!9n~o^AU?!gH&yhO1#{sAn$B*+(h+q|90g@?D*al63K#Cl(qFD3{gC~;?YE>D) zSgd?$COx5tQ!<|U^~DgjrjNRP4W;(4$La_dnj$440`#ftg|VHXj;%S|46q}@xU4+V zRbKg!25Cd;jZ)ST{`#(Y+}Oee^vd;TwKMN{%5qhe`$a3$>Qzgese9(fd3*obty)JU z*Zk_*#{f;@am;}~9kcZ}4euyLf&T!W@gf(ui3XMIZ3#TKwjv?2lQrwmp-$8%AFg=D zAP#dCLQa%oYgGQ8mwBCZI|oSTc7#S-&$A^jzAQh4?`k5GY}@Xs)3RNJ{6(6JIgVd#CKVMyvYcG#+uL zJhO&LEDys^O7QDPY|zjT^Y}hVRFxNRyA|y$Dr!FQWDC9Qwmo$y-6Tx{?`jdfun`MzHk|iKZ!s%l$N%0S z+Bk{BW~occgYSutrn5@6iqy#Ki1}OOgoT@tk+L^sYxr1fGQP?I2Pte-R_$$nzlPA~ z#p4?!BW$F|j~BO}908RKNH_4y7Oyw%Ojj5Bmv;cvz$c&P0edrQ7y(^mMwNR3R2I4p zvNl6NPI8P=-DLI^`@@|a3wC9>_PEmjkRRh4E#et{2n*a5;QJVkg zoJ(6_it(0%9$j~AJ1SJ#>MX8}X4Y;cEZbz{lVcVJD`KHu&s^{)g>ij*tCk>?vvdT_ zN-s_B0YZ%lhF-jKA(UW|jPCj~z#Xa)KLPCGPxzqFOR$yY?u1Jo`KA2_U?h(`P# z%PWQm)q)u4@S>5pXY$2Wt#V3*E#>=(ff%0h!FDU?XC51-#9yOgxoRT=Yxtvw!a`2T zBdd3&PsHscU7c876I+qzO5DdDltVgHRWmxMP<{gGW=Qz6_}BKDX7`e?MJkWl4Y^6{ z>GKJeWPps`pyKWelKpt{kg(;Cmtt;rrcrc%`=1b!%jkq@|4?K1B)&E%4XD1(TC7Jg zdhipmMlm0h+!?WRInl>XASK@58NQ{FCK*(g8+F7wmOeIKzJs1VE(UMl4{Mk z^n>q%g(vmtE$NL&f9oPtVWi?55Yie2wn4Et3Sy`zNC>ag-8@%vZ*U`+?>5E4>o@E> z#Jo00)1K+k^k=c)whI9=S01_g4Ag5#vU`cBf7=j0-j4mr5Eh^5K#eLqqn5n4-nJd| z33S1eZ$v&22Td3Sg;YnAJS30A9VS%bKzWe4tn5-yn$oU)dC_*gcfjVNsGSu!^INix ze7SkPP4ToI3i<@=kxfn@=`@)aS+w7O8j8EaN!P}G2}F@5e5)cq&*tFNO|&xG?@BiGu=Xw>7>4bWHL*IJLG>)J zVoyeT>FQjLzbY9nh~+7F4vV^dDK=ZlnqDayDC`Sn(wX%}#!B7dkGE5ERJ7SvvUonI zd7LKQ7&BjpYE9~f(c%MCd5CkR`9MS?az|b1w|L$u$fuK$Yv!Zv?fePPGmVD2Z)2~G zRWj;67#pb3Pgj!I+r+FHP0$iDd`vdY=#(RBST}p+#%H>(?UxiC3LU8tIf^CGyd(QQ zXD!@?AXjHhXSrPSaoA=cY|~oS{baOF+&#}iD8;;>5MeWD>L(mHF`v|ZOYF2qdIK&} zn3*Gsf~QnDHgk=-6rOIqvw>Bcj08aVqE?W54|EtPo#6^)E>SH?Io+qJDAX;%bQ?>k z&zua&p`AMNKp6e~0w7oRwYi?;*lVa~(+z1Of}>Ow$r^aAue+a`v_Aa~x$H=q{*|cW z!)&W`!$;IS*Qk-YPq+xab0D8NWVWjMV%+!ByeQOK(wj1%mlsb$b*VtQv-zrZ5Lt-r z-0RGuZ=k&#hh-2d90i$`74bRX+jQ;e#;owuihrP4kJm{q`nI~2Ri9?c-L%m40h zTx>zFTr--?-1Gn30*_fVWQC-Es0Yr)R)5XB?R}Y!`567wui*6k}sUlqg z)pjl?(;>PB|Mw^NN`e`hT&O8HT-?NRT;x~hCAcoZEPhVo<>ABIvB9UC!{6Qt`zo^X zoi`l(2k2|ywzvouuaI2r=s~wMt-JT1is+O>3R?yn#SWDVn)Li><7EbIO`j)Q+Vpyz zjnKKr^6~gm(+rqaD(3z_K!+K17wzc#P|%lUE6y+T0AOxXLQY$#CKulPfJb-l3YzPw zB{Pjrqm)ZURvo#yxe2+~iU;v(pN9!_hcQsTZjglFOd_}&!c&rS?2+lcX|qGip#0%7 ztm3W3Lt704k~0>3_5wXIx1QgKvRkdPdD0C^KkbjK$HQ#`_P!YBKu(&UI#GqU3kyd)+-)3NTq1s zZn7nscj3~G3U=bkakEvTG7VnHeCM`@uXH{odw*6uU`;9}7cBtizleKkj!<5PjwGkK zsY8!yhpmTnY&w6k`bw~Vs4Au#Mc6}-h8cQO^T$cv)F9Lg>(Et^7S%9pBX;7q;7^aw&44Uad*+#)MjUi)u_Km3@kd1?|_=N?Be>q>0-q za^)lPVVY^4QV%h@CY~pWI9^1c%RO@)$?fgsY^h6t+@VYD0`kMMk-x}c3r|wYbi6!r z$tfnFkYBH58T@tL7;2hv+>7M*ULsk^bLN1%%Tz>J>$ApcBrr#yRcj>HP>H8L-USrT zK5Z82)?`x(H+)f!OPRJWm~F6H{zUORb%t#xsE5Hqe`{ zPwbPvIhZX4DJK>piK4yTq>b8I)yLAB-QT!Uk!NZ)-)-E;$B5ymY%#I|o?+eD1sY)H z(pu){H+`S+=R18HyRE$~;9dqzfZhFGSL*v(u-km z*4XT`pJbGt9cO9zcm5Zj08&O%sm$@-At@>2>FI>7V8AL7`Yra9FIsNe`7+rO$AGb> z?qG+;uEE+)_tQ@wx=uL2#`COocF!_!s=+NbV1f34K>58A&!2fb$f?Z|bfC?u+@i}@ zA3x!6S+$#;uBA|aPiH|x(8Iiwhs8mB6ypXWd~m(`$9?~rhh2xFko=JVLn3`|2dY6~ zBtRdAx<$p_g--0;=eK*D=v`rgs|jL-l~Nf*ha$T&+iG3MQjbKvPfrP%io|1+@;D zldz^vf|BIz2Jz7A|8gFk=ul5r&NYe`N$rA(k;QT|rI)_Opxo>!L$`}lwh&n&K+mOg z1_x`=idg=z_Z3RroWx!{64|VL)me1FJ7_(>Z4IrSzkqBZF*8kH!{`jT;4hH zRamIrqk(xqnA129yf?9Lvb+g#G}c)!#moZ7xBrqOSDmufD$Q+P1{x7QNB6fMJ(>J!Mo@Uk~*ITkKZU_({Zk+x@#wmF1&)2&yFu z1q1)KYE~S*kjOym1C$A0Th1LslN>?8D+zk#U;p#6Xu7*)jI6L0u3c93vZ}6MN;R1k zMB)OzF;3Ei%={M5rEo0;Z?PD@f28z%JHIA{p)JYq-}$AbReokL``kS;|D2Hi^P60j zm8x%otEZ-?HK4suO+6BNTDc#|D_)cZ;F^%t49q``{3 zNFt*FNg4dhu|@WKuSlZh46qobpwRwG-ELZzJ^Il0vto9!?2MmzoXqIGzma;;Ll4c* zClu~e@xK#DPM<8rBlG6pjzKYGY-Bcz_=9@@hvd?iKMkY7tfsnS^d@EamLh3-YxYC)@}!4gQA4D{S4w|ANPzHp_l}qjK5wvCW8Ci zt}`Ue-hN&Yl&73-NJAZ1gu()SyYCGy)#V-<@(0LE{0m{5} z<^Ekk!WUyCZgBE%2X>K%X4I16D*)PNpKMl)DvjjVx$~M<78^DN2vk$ay!LG-;oY9* z({nLPV-kD&!=`6E2b>1Y@7Y`)L$`j`#!vDc`{7$G<>1_ncg0miWeWyeqI1M1AVtc} zaz3g>5<_kl5nR&~IwCF)dw;A01sO9>L539{8IYYbPR}$ zdQ!UJFUiOjvxOPhyGkQFMbRY9cc`%#2({LbR9bHH>#Higx4N{}g_ZNCj%*&(nOG}D zog|+;Su2@5H)8W=MjI5c-8Rg@XX620f;ps{X7X_2oMs&N9Rr=4^KA>uw}zGQzV>r{ zqlL++PQf&BBnD`$GJCM`hOC6QYLE*#G`!I@%HiUo-+3Uc#2S1AMiJ5Y6xhoRk;~7= ztb2@NK5Lt-gVXuGsyUoV-n3q)ZXcO!YI?=I{9Paq{;9TD(jbFHC&(Un+mLkqtb;or zaYqGL`{Cb!?-(3YxkKs9_}{;=TN4`{a-Uot52{)>M~=mK)_c~LUtmC6@ba^~e|_Y_ z7AadZQ~Uw6ph6lQ9NE8fYWcyHmyeW+vAuIJ8#E^S4S)Ry;iZGPQKVrHvdNav{Fd^T zJ*of&b8Z?L2)__O1ANL+ok2omu{`oGpeELUbQh*0a;4HTF!TK?mpLt8oECw~#pRng zq^gIsF$)?0m_%RqLMmT#$BM1C+NGZuR?PN@hU8#%^^9GJI;p6WXSDo*f+L__;a zLUP6$TKQnT3l}Ia?qfDp0VEyE6?F0}dxC@DM8chbmt>Pts`XVf8{3rx#tBX0aANlG z);YmMeWrihc^^lLU5L%WdvEgM!bMBG2*P5Pi_uFUfB!+%7(M56Mgc92SoK}iY_sSN+&yBTqdn{@ZGYW*R!|7EB%nTofp`k&?7BK!1FlH`S89!;jHs9 zD{DP@vg>{CYwv424L{Z1yiT`=N+th2ye%vJtzhl$91D906-oF0lF@W&*h|qlil5if z`1~iHks|ztr4tWqa@>wlGnZi~DKIjO$>BMV##(;VxulMse3np7EFnLh5UX%2+Pn>k zFi$NOXQIV~6Z#B3v9SEjqf9VVezj=bv@?4U{K{7#7g|+H+vX{)za3(+c&8A4Mh67!VvkB2!dy!-K1dZinfH>CH6aEWV_2vxB4^}-j)yA4dU2I!I36 zKPBlIh^_PeRm&GzyM6^0Ka3)oZ{F_}ixms1jX%M<8K|Fg?14h@5w=S{&72Y96o%tx zr@^U@PGUBH#=gqFV7x|TsW_kbV=Cn2B*TraLioH>Uk`rh?W?}TJ$W(ejtI4k79q_5 z=5P;8jI(dh<#$PiTmtLoajEdT>=7%`xX^8Z*%8;6fXK1k+d~So*#`88LZKb(5n!|E zaDnN#*9`%Pt_r_gq4)6%EoDL=}w==`E1x=@wCb zPT4&=*k1V_MGkU_-y82aFyYy@HAK(VY|MqAYrTSM$jctIimknfP&q@cA`L{T=>$!( zI>ca~xVM;UTZ6SiGB9*$Myt(7r7(xNJAM z23A;a-_;0&OWd0?+(EMelDH;rIC+W?y$wsC zT#nT3=QGf@FVpiFL4%pB2iTA(m`K%RMJiDEZcQvL zM5oQU)q!Od6HK2r-^?J31oPrc7abL2A&t-fN>TQ?)zLAVMoSFZLN{|AUL1$_ZetZF zf`<0OO>fFOe}dX3*%ZTUJWIRy61!uLWm>B`$Jws*IME3&4^O$1x|S?y zs0&pYmM`>+4W7jB8y;I7lVTYf?JjE($6hbo_oFS-MUAXPHG2yHMnBB#RJJXSnw3S_ zgLce?!KfHl$cEQTVErRc?Cn8n^{c2Ezx<F-`~&Lahe0eK*`Wk0`!quEfz+o$EA!ff_t|oFECC zhx8sfmvmg9CI8Curm?lVp1Nque*18Djt)XwTd;O4-3o_Fg`|%3G~0Ts#xiVY9AKY` zRMtTZ)MofWlBRiP&e3rr9lfOd4ew-yMzI;bk;7iJ3iI!d#y|X%y`4Hn^BGbEC$=pI z4U1YF&|siPYT=YvfvjHq3HoUL3;<3y2#LBJG?DX74W=4xyFH=K^6CAP1|H&nXvo}+ z>CoJ}28@^({awX&X~NpwE;7iQ`3C8XkkgQt26vj5*%XIP9BvO|JtJ9qv>#IU0uCbg z!3u&C(?y#%zvietIlbCxcw9`NgBCvo)JiWfEifF=<<5!YQeGfxgW^e`*v6`s%%f1~ zR>+9$zL6*M*z+bE`9yT`mr}-zHRIfScU#*5T9b5D>NIlpuqS>%39KoF3fUy0U+8kB z-jGP;FY~~xkZ>!X1W!0wd;o+2K;F*u#$KX8gex}#9hbEt0gh0+V8eYBimv0O~ z--4#cB~{IE=KD)L;4#ECS3@T1ZSTq-AaS9!1*!Sv#3L0mPF&0*qvf8(;cRWBPy@k& z%h^Y(BkqCN>mGow2&40dnGPE_tTx&UV}MPj8kdO`ibr!x8)Q=hk*DFrU$%wIozAeH zIbnebo}?CcZdIBvQq4^r$}+N15R0~eD!$&gJS(d%hygqqf#nNb#jovD5aD{%l71#% zqF3-!N-nOFxQ#zF+TbXx|xmCVzKv(><$W+(O z(}>-^y3v-7IvgRv;=s!l^$I?!1b5fZKS4ra!W$6{5{C$9>LcXq5?Bcas-zQ@vgGmE zF3O2RuomF-ncP!e=@Zt3k+0LecIIlU-P}TZ3dxS6wKtyWN{?3S@fD%HS!wX@z_|1( z*Kemi&bA*)4rv=j%C|2f3*8#)1kz`9eXAFm%*}91DvZz5>?qaBQDb-qr3IdOGGWK! z6wedH{hV~M^Us1=CB!b0JWD!ZXD|U z32*Eo8yDuJU;W+tc>c-qI7>}|ZY&J$+JuquZK5{&C`bUDaK%1R=s{Yj+~K=_cV zuWn?{c)n4@36hF=M)#-De8u~#+8;}q5+s5YRO*NV#J&0%kn{|yaY#mQKVWi@DpT&p zJ5_3EF=*4pn`*WMsmJeDx)trZA{ZuZT9~H7k_lRW_ZR9{@-3UwCsk!Db`ilst$c$)vI-Nt1o z_!jW+T+-ACZM~d3((Lua6Fv4+`xCs~l|GNen#^g|3|(xH`3VZxxe^w-04zn}{6eJa zosD!e@a7MeU>7r(0qA#N%V_5D%29wod!W%q?ar-R)o@Hi=cfgk4khEwuY$gG+fRSd z-)YSiB~ueFaowSl$t{mF-s|^KdVRlW?P7yYMWcYOeg$q>zt7p`u1`tiiJf@T)#d;a z#Vc&YqkZ`M(zf+|0c$t+b>Vv0L}mSE;6+B-jQLsjEMWu+>nyHJzRr8zR#ZWj#fY96 z=QO(`h`yXW$@ElHUD|*bofV3JV&Y-v2~E_;74+s7 z2J^_V=+k-FgaFXXZlCZHI;E<13!8U$PsTed#-tX&$Q0uU(Tq&dHzTQEN^l(bbVyDQ zWvm)eJ2(+ULu>E1O!Aa7b*9k=e@NaMS$>IlA&3rBV?=4IQkM_zLryqSTTL7)K|aFi zvyqcL{omjTQwFF!^qBqPp-l6BPzHJZ0xo4r_M=xU>rts7@#wFR%x8_J8?v_tyvjze zjRahINF<|4q;6-gYc4F$J_)hV9Jk$NUO2J)7ufk+{ao zwo@0PXA|oJ$aXlFI>c}pE(DM9d^){l9w(d6An8P0;Cq9u({L7eA9+^WC(NeQyu`lx z{+#9mrK15G%aMOnPo5#UJB>xir|av|pEy_Zu7rej9v2VibT6RFJ5L>ZTdw}yO+@Jf z#Anj=LwxU5-=r2ZGd;moqDsdjZW~wQ#s|5%rT(%skBA+u= zN%R-cpO?O>zb1?R+Gwz$!pYHB+#HL$I{YBeG~B~ed}9Hd5u)I8HSoRenUTX|Zlv+= zmt)J9l(ogf^Q>{z8DlVQm6DdzD&JO#SkC?H3bs$((f?%6t&z((EyrH9z4Us&=18-q z!whm!!mJPEP%V^G^c(y|SLfLl|0eZIAG!4TSw>k8b@8%BgeH|CoI|+!s@d3UBx|Cb zkDjP8ZB;$;`ACyg{10J`w*Go>yQ+)V7KB5A*$*e)Fd_QULDL{tYUsVL+AiRx zcUII$vT%mF_n^eO*2{@NW%kBBQcbSGi0=UxODJ?Cp>h4us2RnM79=ADpcwpJ#ox_A2EkD9pAH z3Y=M6HdNtWo_ux<)tfh4O&UDxq>Mm`QDy*cQtWR(pNVC%R5vxI{si5m8=`mK2wu#j zd3A~CpL<;(EBoDNtYg)_&ZRJ^O@_O~X5NkT6_3HBE;wm~Yxk%=S%Qb0#@s3vaaoz^ z>dUtua5s1CB#~kKO=lQ+iZ8TnbSoY^bKNe~zo*>ukVst&P!w?^wUY>PzE17_G8&Ws zTXtJIi|8wNyUB>Y4<5>9KU|a6F0i6u#v`q~md8Ky++zlGc#eS<)K-l*cS1dHf;|fv z^8;u0GbSjjqzkJ^yF5`VCzI1cS-A)qCOT-vAwBOVzNV>`**`Tr(}@eNn-&cjt*Uan zO4=b;NVR(l(6SDjyjNDHadGvv2>wr?KOGL%lUJFh8%Av@?H;Tr-jTkwzZv4#Ujq@h z_i?Su06bQO@BR>;ZAeF<{yuu&L;DGKZQ^N?5tEH)5ZD8scard#0xX*Ejq&#kC~5b~ zB_YK zQeC&@TT_V>*L!#8Owd6NJUCPQaB|l6E?8a4g&;Oh!0xrXj%3Dl8(BG@d>>VC!N~l( zvK?+~D>7E}#%5zLz$=OliVR-iwlHw_`EM!`&P|su8dE0h0YU zWw9@Xp8EIUWz1DB&!(iKKB^1zaG^B`8K$@;Ygj_#Qx~l7)ygX4F~`4z9^^_;x)X5o ze!94$Jh>?mq@t$H(eS%;x#xkgSGJ0cwEJI`${wL*#m5)zA&}X-wW9OH)Sw!3M>lN( zrNOu7a(q9eB-Plgt0%rA5-F)ap)Y*=O0iD&T7x4*Y}vxXuG7qKKCMAPHQg#c@OEUj zq;lg>3T6Dub1v7DTI{nYqv8XkWHJ_lwudfgS_MVd7DY41G*jqBZ}6eT5g#)#xP+1%?h@g+b1?K{f1oY|SqiQJbDKW5$b zPD#?Tx}9Vs=avq6U3$eRL%wkKdOYl+xvpnJ*a%@H#l=U7pNcd%Q>qooQd<-Qt_y>v z68yD;$7IVxUE__iY{OT@c(;3u42(TZa=j-@&EAa%pBt>zKYW5@3ub+KesE%Gder0g zY`D9ibWYA(kNn*NO#^j47rmY|{)xwSLhQ$`6j?wI9$?mc4|fk;>^QluEH31Q@Y>nz zmL+1APG3s5?kt-Vu><3l)Ylp?#D^bIx4jWbn%sk8DP4jOx!+p)04dC*!#^#%G4~rV zeskM7xLCezNvX0%7stbG_U=6_cY?BgocMVJzaHyu_Y?nMP+p~RefHMtWz-CK%G-Q~*QhjZxsb&=9 z7x(8QpMt-8eeYNp$>7TLydk^uLEDk@z<(28e}ZZp2u^MYoXPU!sl?id*P&3}%dk(wmu6AF33-@| zJXmM8cEB_4v_yZn|1~;3tk#xGVHEiWkg=?0t){;T#7!_Q(f$GHcDj8ppLZ7H#~|dl z!&nvnHn^ztLcN#c@DzfP_Wr=Tfr53gfO(0!F!vn9KUpr@W5~iwf!?2rZ(D20vhCbj z;4ci#j^%gDNx}oaplkE3+0)7?czK@KGuQ7>6ePw!JLD!8rS)#t?Jwr4J>e5|C5uJdK@V&sQ^5_2Du$>>_r5?nw=`+yp$(bWF{-aa zHt$#%cSMl#n;W+`U0Ua-6#7+XilGloF0zY#5cz^MI3e*N*A7qK|3()}N($b6w<#L9 zN>C%odVAY?x$ZV^s#c1hHRe}JdH%~G!2!M(SA%nsF*gicFE1##x%Y@!`U1vsD{nOu z7Kj{AbWXD!)R));SSU3)Z>{Z&J9y;XPvMk?9Gmbtbc4WI`v3Rl@ z_{M!p!sO*}f?WBDzy4>7mchrWa%4}j{mlpKHO9`Neza+$w0iirC$ zq-OE(={_5-^idtE>B&E#WPqUEpD3QlR^+ZFYn+BKe>FL3DJI1RZ{Q;MYH?ZG3ILB6 zqy~ES$Z~}*$;e(#3wpQ@&8StaMT@I;Uyl|G!)q3XzN7?Jml=)Z=O>6Odg#qZ2A@aW zQxd#pJfzP*1uo)F+GxC+iuEb@~Pykwp8KFsT|KItq%1AaB+ti*7u@k$(FP10$Igr@UXHpalw;E%uT+9Kj z8Y6tnKmJ90{J(mg{>NSaewPZ+bA_aV4S2-=J0JcBP1k?ZcK!e7|D-YdKO_&)pJV?6 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& zfKj6%boQEuz>OBL+)3i2V6jLS)=NJP#nQt(C!$-{*(g=O5Jq6)3X>4`KORb_mo@qW z-YotXyvbyWc?q=RvYxwsBH3JZ)Nz${#y7g|y?JO8rR8~XYjiN1BQ_$X=+xIssV`e~ zI9n?$OwFQiwgwk>@(+2l<0$y!-2X$@c|TJ5|NmbpS`sCj3Mn&tlY|gL_NtKW*pA~^ z$zCCpne3f$?3Ecp94p(gvd=M3R^R8LUhDn&{?s3!`*}Pb_v^ZDw^hsgMP;N-?)E0p zuS^MFgqWhq=$i@y?Xd#d_0bFgdU`TX0x?qo0G~-GWW_ zWY97A{IV9bS~a#=SnMC*bJ1^0Dq*sa_yg~!`FF>+z`8{h^z>8CwUx1?oQ@NrM$p=* zbx|;J$ZbG*`-P`C#5Vg|Up5=d;zHK2bnc6I^I#!RYPfmglp3s_cWZhXZ1mWbr`bK5 zsFa(}At-rs)t*zw>~r6EDn3jvsV>fjja3}t%U;{+bVP(6>zKs25OHqref&J%A{5W_js2pc^z`U@Y+0ezM%;NMTH1o^BuAp_VRWq^dvGB zMMBHl@mFsKjK3i`*DBNw-_A`wFRD8oPQ0||+noxQE`NY;<_6=OQHy^O#0eu@9p`{iGRTpb>TgKNYNca0eQeU0?m%U00P zMN0%DlFxUdW~=*nb%_L&%?G+_YgmH4pcH@m{j7oCZ~MP~KXw7|N(>-3Ljf%Tb@Zk6 z%|jATmr`pox_pdBz ziVE!WwC@IH&ZL$*)lEz67bxG0wsM6I_u$lis^-!h+CutA_1@{){pxqsj%P~x8YI8} z_cb#4&ue7zuWMwrFBR*G;f4@c?7fa)R1o`Wa_-F~FX*~%9RViUcdG}_g36>d`pnQS z(c6SDwMDJuiwDXn=Hgs{5M0YWip$Q=oA(qcj5!|RC4@hip}lNg2(zwb$9fQ`DaBCT z^TFw6Se2GNgO*0v4P`T0$?AjW>BNyvopRbX*6Y{j&bTuDy>Ja-fXNoOap8`Uckx}M z{Bw={N#sLto($*_^-tdF=g%U^PqIPdOh(_*L%Il?FA*Dzwup(SeknLJ1If5+&P1?ik(dS?Vg)9v~ABptMh8#Ki|}JgzMsQE$Ydy1#u< zeR7fXVpPa(gJ2tAH|qj+vofJ2_o)7l|BKzMLsb}Zz|P#HKyWGi?(-|C8jZN~;>!<}y9F7rC&4gkrD}UUkFgjx+hY%l z&n)d|otPk#ZVab(R8zlTIsrFlt# zyK+Me2*&A?U;yXk@9rw@Pj_{6i%_Rq(XBD^fW41*ADEP^Vc&!iKfOhf6wX`)E5>+f zp5m41WOUj9+1!~coRiPu==vhEHqKzaP@l;pULs&JUA1--vpXf4h;Q%dz_?=D^*1D_h?Io^r zL(lM@U2snhN9ZQ|3cL6nWK@)ta8u0T72T-5!n1OD%(+!Wy(gHC0c}$v_Agws>pA^O z_K+mOJq^E-8O{s9DbpnLsqe$9HJr)MzF$dY)RL03+x(8h9Rd5AxsdMXEjaK+N<1TeE_hsD% zk6Y-sbf*SO^C1rbxq-Q6)7qpWL?V*^)P~PD@RbbC#FW`sbvZk0%py*`b~y4X4a-wJ zT#2P?ccQyYBFPPSWTboyS?7Lh+lz~ItouRE5>(&;r9Q7bj(Edwt;h7`8_ZWfJ zN%Y$#O{&-PeCA=g6sJqAz;g8&!>Tyo0h--}|7mu?=TD9H*h-Gl(CckVpxHgX)Q_88 znxa3=?v>?}5{uqHG2d!rS3SL;s+JUK4+JUn0aUR;)~jorc_DI_BncQmjrB4gW3nxA zS{v$e<)Yj34Qu?{g>Ze0zdv6Ed+c$GHGQrlxfxs{!~wVxt6r|Sx|i+$D6uwNyBL3$ zSb+HdSBW*g{(Ef5q9*~*JZh@TQnCnfRSLINHJTDygqW5qMdQ}0NT`5TKV#S(-h`AiyVs%Lj}Jj1Ki{S<^-roTH)! zv~|+Khr470r8;%-Rz|wmy5}>80(zwpk@G-R_Cz+J4p~t^_~ibL{i`|?qTr`91@(5w zi5g)4Kgx_%=)^X{7QhS(ATjJpAN4d%^R4R+AX6?Q{HE?1>~X6Pk#FIac>6p1E$49> zJ4`w9j}jxU{CKar3T6kBHPtTL_`#N(Ym5go{7F`vG z?ZH|Hlo;!mAAYi`fJ{UZtPHwZ>guiLUc+?6{#QlwZHIUI71Je$v4fYpO*8uz9{V8 z?VDLwYhJ_u;h8dT#?Hy;@DTrb?C|s4+!(GZ$;#==l#OOAd>LDr3!E|EtJz(C0#XCk zC(GR6@?a_J#pk>NK$o0w`^1J34tz1~z!$Uh4`0kotqqpE)qorcKby5!F06Oef}HTK z5KShy(zx>(z!pjh8xQ40Bedu3FUChj7M9wZC&AhCzTAR05F(07H}ggJGSC(=4fkTC9C^C~uA| z3k7HT5lq`k5yOglJ;4<;xk{(;B0$C)@5fmM>zUe@p1v>_zohfGOG_qtJDx_W<6JRs zPT{#-y6~sODy#YblvtwH(}71c!)7}$y?YZ6fWpsxVXrSCIu3VmlpW=X^4(>56KzV? zQF<~q$_f`f0~*npErE`n1O`|OPDWV~k6qxyFoknsS|sV-vEaf7;GqhbIX6+@Vd$ICo8BL?CJ2(C+NOTy~4 zL-8m6K0(kz+i;yc4rF7{sZq-T7TA$?;p3IcdS8s6%dwtLd3usox4sp%>WnB-7!L9h7??c*tisGaDGL6(uHB}o!@FkmeA3OX+pA5H1Sd@YD zi`ap6c6TiN5Svh$D90p|C?d^F_%gQQ=Wdk;D14C)^MxdOOxxoO;&z| zMGb$wlqiIs;4m80o*T!;>5!`{Ni(4!>MgafHh^q;+M@U*9i#XiR!h?BTX;zfs*z1+ z){-&g80UOIoOQ&<`8sMk$)DaIU(CClkj<1};GrnV!xDP%o3OXW9Zmd5qDhAd(YlLa#5J%?K<_fLd(GhRT+1U`|WRGYg zH8g>L`T_5!0h!`h0kr};qVL8OOP+fJn@$@CGWtpeeI1)|y}$5SgRI$wOJg;M4>fPJ zJn34NhnLGMb?cPPtury3epInuDI5AwhhK*EgrIky#BD3@^oPH*^Wy3;)L9UxHm@Tb zfZKVJ2d6>+TliB=M5$^iWPuegl|}Z9h_OqcuEZOH-9E3zJ4XDT-EQ)Cfxp`SP*`>VpAi&H4RRQVuNtexr? zXuKe}okI$BQ>e!VX8g#_Nfe)0LhHsy&k{|tEcgrrQ0^`aMgfwDHF>kYbbNDmRuoGs z$IaKbW<=2nPi4Af9AbZNA6yP9u*=rH=>M_MI!a#RWmiTWdt~k2;-m{I-0z5Hu}Fvb z0;2hSAbc=pdU9d?vysk7Ogs*ZC2Wf{!9kCYT^i{a%?6mVU+FTRk4D&@+;dW{(00HW z*Giqn0IdIe)Uc>lij5Dz`k(uQ^=E=obPKI}@h;tUsI4a|>$iP-&mry8*810f5m_G| zokRC{IT@Z>E{C;@k7tz74tDZDxbUA{_|9Tq6Dg~dbTH`ONQ>VPwG@}IchGt^h?E`e zLMmg+?U51NAaR+U6MjAm`)WZal#2557g}`Bq8Hc5Cvkf04Qye{(1=)JK$Pr;HPsIV zQ4eFQocpZ1-eU?JLSjUQyg3Rndmh9?YVTFkeNt8vC15+&x&V2sR~}mC&RKVuY?1-h zRl&w)ezz!4lZ$k|+D=`3?|#~=3lU?dut>PtG~}Fl9kZf$>39Z zwv8^ai;e<)DXtI@=mdt|cx?Gsu#h}jT(bMw2UkV6WcqEFm-s(%eNF1s*Em{!381n1 zGUIRnIthJ8{^)ZZ`FheY)_4z%fl3HpZaAV3`(7iF)dMpazvMml zBI^J&dYefHwqlz!F#4v-qpORsNJ&QFpOZA`ytON5oS)d9YZvSh5}jctQ$TSxbvZQd zlC-&@*m+b+W3ELqm$A>2-e=NQzSu2$35Gw3Z+=9jYd(3&3b7pe^6p%+kguU7G5m70 zI`f^(b;~(-^6e%2se6K^!Zy)o&xtRwCTTiXslXryxze+8XrvUH6w9ez*S|*T^!OKE zYSw~;s>iD$aawb_a|1O_ZV*)MV&+BWXsWxE)Lj~Vz^?m3Xr>P4 z@^LJ3zIIdxQdp2)>HfmMcn4lO!|6J~9~zUx9}HXDvRU`&g+ipz3UKLizpYZ3p8eYR z{B^;_B)N=(=fO=XmfRVya`_VM2?FH0ZI1!1iZwi$Js4u;UV06;J2nL^MU@&~G>m+i zeLf4)dUY$Gj%qc)i;_LY`}4xQxB;H^**W1b8SUC7hL@>A3Y+yQNbPQ(T;CLF{rsqK zj-@{H^n!Ny*4P-}qSgCTS!wt*W}qH7*I6pqu5a!xwIUGgBL88G6U(Pyj2d(x07GZw zuMxIA_xh2JKzF08e5;{rEr$EQjBz62ASIi@1OCw`At^qIcc!x^ z-H8M?0AnywlEe5GGK~u^$%Qj0j79-xcn&C+n50+y4@C zo~w=Kp=9ao+5$fFl7%uJT|2)8sIOpHu!Pf5xt$FC^ zd@Rs-O8U_G)1@?HQl;rIcV#Q;>TGe{MXZGWW3hyLK%lW$V7YARAU(1iy)kMtG_dZj z>K=8>@&Cg2Xx^Q6t)}uTJzS=tU}g3%+GCyXlpBORy}*x=>UrXQ^V_B(l7xxPdr!fu zc~na$kRCL7*Uf@^B*%~*A`w)Z@76l8rLqa+-yDC{-yDDbXzKoa9D#McV-kwYG^i!MrR-PJdPSoxW{~=|s`{qmlCxrInIJL8tL< zTsmfBA;_Bx{R*cwz38tu<+Sm-4cziKf4rqS8o+4RP2hgka{NH(6Od__PEqXCC^_g?@}k^%T-NOQ|Y&bCh8irZQFN55TL0 z7JDlOtl>&j?w!&*<{wFUn=C%DzN)s1#DP~A8kPNH>TV4d4sIIgn&p2Od;I#2GYw`k z`SFpH;hDA;#s1WMD9zii$19?hDmTW+A)1#eZWp8S9$6Z^vHQ^^47cFm`U5tR(g<$U>B2Y33mAg|**12TsqH#Qa} z&0L;^XAslNccdYe6PMj|%SJ8WYo0CdILI6!ik*oL%-5qVR>j@2#tn3Jbva`=n^p;@ z=ToQh?f07rAgj=|VeMOwzf{XJ>!+C}Z0~OKNqj!!X^?8x?864iOVK=(^6NAuq)E=s z0x!)Gv>ATe9+zLx)-@@zC%voZfu5qn!!N>5*vcy;#7Ze)2*Vk_(Ki#y@{B$n?E5rH z8GWs+k86xTG@71+Cz3U#5-dN+Ow;A;A9L6czQWypt z8+Rp09KS%Oxfe+d+0<5}jM$W%ub**w^8FZs)jC4#ZG8;E!Uarb@lU|iJ&B-aorvj1 zf4B%^+YXEl$?!grhW@G|_qA?qaNj(;RMZYyAs>m0t^)UW-UQ5Jn=D zSKk5r+|~Kl;@X1i@~XcxX1#D^l&(0#(wD74x1nk|XKGVN2Aa5pjXlp4!tp7KyVPv{Ch_fA=XGEaZQ z5PNTjI!jy&6;`-da^;mescUYjz~2fe;6GVEV-GfQ9WfPwA^i@C7*Yt*Z`%!NqYnhnl0rDA zlULu%c$3N*hfy&_CCn7z)nXL0Jt>0A0Gx>lE^!=go!+K(5ZjR+G( z&tA9NVn_@=Mz(y3F8(??L&PJBGeDhWOy6K~`p~~gjGyR+z|K46$yv4^)Q<+Itv}{c4`xaQqZG^yZTx2w%&-&KG#K zY3ri{)Q)H}F7s!LYZzgc3qi!5GWmMwseGuq4KFZ)rVC(#b8;2|F!yIu({Cs!OCAbv%6#5`jBLhIVwZH0e0QnsOKyREhJ-*CYz{m`47; z+!&qT4$j|BnbCD85Hk-cyeU&jt)eVu>);&@3r0zJ+lVp)y_zTLZ2y_Z_;S|g^g=>r z*km8~Ke#d*NzoB5h2p-s%ymp9c-eyjtdQtYy5xjeYGM_brD&e~Ar;-ANW z-a2v&#S_5u!ZR8o>nZd-AObC$!obxhb%>!|`PeH`cSwqJqaR4&cMlMT7#H&W#D0)`}!J(nDV z*~&ua!T9ARquWKiVzDJ)g1L1AeE5J&$KLT~H~_ynJxLf&KcZtn?obwgDee8Nd$+5g z=rdEozSx?n}kbsh(HT(&-54_!3pzq6L7Z;kb1 z6Q?=x%mwasO^3=K%?mwO#3=L6hN8JOL&qgWi`U4~eRbnL}_HMQ90%e@~TXyE0^F=v5BB*6)ETA)MzBug&5!$Q-mr6P2&<$iJES5!5PfNyy|0=1NG)+mKgsV_ZFj8AQiU z!^Q7=OE0pU&dZJpx($_>r{4ii!~L@FTXlsV-KEF_)*Mj&So5iBK5|V^`eFN-U*Lhr zet(_dw}XpDs5zg9a`XzDZ(qtKwm)&`mfK243p6zkio)Xf2J3>dv`S~KRJp=|CgT_0 z_A+#)kw4~$MUiw=MUW?;X4@*nv{2|^NvJR6McV4*`cc^><7vOlfHss_fmwkmx#?Q2 z&klt9YKU{OOMCR!848kjm`^+zISn^DB0gXKPS@1; z0WIJ)gP{vWv1W-XjaZGSwW98(UM^wu{*?Xd^3;>rq~YZxUh%7Nky6a{T6j5ZNmthL zlt|i5sZZczV)6F}%j#mb*<-})=Wf_T-MP&X1|$16aDkobp>aMu0;K|WvCsIcsKAqI~NYNZd$M+C9!WMp7nNU+vv&;oi&#&$>Fm&NxyF#1}#2j3|u&s-*c zJnJKeLl*0L(8axGy2K=}(xh6?-J1~=lh4Q6A_9Cgx<7&qiA$CJT_(;A79g;5R5dP- z*D3lymsI{7FhkMAfb@0h=N2~hEI`mw_jYaQN=r}%q-&Fz>rz14(1uo zim_z0GVRlpQviUet0s5KN@w9^qlj&Y{z%vw@ul$tY2=NXa`Ua&T9R&(j^gGM8x85C zze>M0rrUSQ((rnI*{fnA-mf2cqj(ZO_;jP(SqlB(M6?TGtEIa6o^zX@hHgIK5Ni{4 z`eD%qUWC24SVuR&R9w_g^yPJk;?=|H6(!GnrjuQ95=$)~6)j&8w52Il*s-#uSMDNL zU=vp#vmk}B8EqJ>a!RA4G`i)U`0x*__~LYb@&(>589`I!EBv#6vx@O=O5&EqV3cf= zEMOJ4gJm(#p>6&g%HKR33^dev8sjO`ZyGH_O^FinSd-^@Jq5BZPPP?hKF?#(w09ui zTjeBE50 zur6vURJTnN4gDl+j%vZ3WD);#(L{YVyqw%jM+}(Ya80@dHVz%m62&VK89&wi#>hrP zBDx(`HN{B}#1NS4+7kfKrDck3w_(EU1Jb3f#CnbLTF zBy~tQo@Q!v)LEesE%ntPY< z0D2$gbz^xb1_FEcJ*!*wVEu>V;J;Kfapso5`1I|h>k!6u9r<>*Ul{VGSGfG#-!^Ko zv=DajvJ$5-pHYmCe>xiY=5T;6S_;+XRXTY|Tc_o6KJ9Ynxi_T{U{s5aVs2{qJ;2_o zUd-xffBDU%Px{1PXhfJ{FPVk}$o(DAb*MBx`P?1Zq;`_7;;Lv=>2j}G4G7m3v48B* zxxsb5X_lp4eeUnLszd)DRmW>8iIb}1B1LN0ts5iu3J%^;+kDJT>;C)#69oN;<$QCJ z={Ik^Codhn!>7%?2)_LGp2n#yXzA!lJdH|E%odTH5x@6Ehvh{d7bj**T-TxGX?lr+ zeni+ZZf|6)*STu$IA3m)FAx9Gb=(A9N65ds4sA@G&!4UXXSM)5;=i4RXMWp4YyM#i z-2$)C(vc%;#PVvR>pmhGIZh@0R$KgW77G07Iz|o(MwzdTuMF&+xI*{GA6|ZC|1u3`4@?FuWroW=)U|Y{C`KdGfd0)IoH@6CGyIi^Lphb!Jx3jQR zFK;Yy95@Smw}Ofd9z{*BMNOR(J(WE^`FKXt`73KR1KrO&PQNNmZzn@43;rYaF!hps zYK2R0zV;?_DV;v3V5FVhKB7B}2X%-2i7J#hXa?z*Y~Sl1X9k{`cH~`{Di|}ysY1(v zDs-+q0Fk?0Jrpy-Y9?^?<^@`RQI`dzM51~nliN6Ap|Bu>{J(X_2?yM;afJSrA&R|5 zb8e<@Ce|6=*hb6K&PU&R?m*x=g5`&NiFVr!v)2i;_z5)5+d0A0wZeZ7E|>ofE-!OY z!>RMU$=5Jy3QCIB-?QsP$ZH`ePa)K&W#IyJ7Jc@> z4O*j-2xBLYfHY7MHv!HH{z;PvE%7UWPGg-iC!oYCLu*c@nt|P4Xg_sr;V%w?;vRa7o(x*3+II^>(mQgjvv?v$GSWf$ z=)~!iG%Vnv>RgAzeYbsYI`6Me3tWZA-k4+C^Kq=mAmX+Caw-Ww@>rxshxo1I-85IJS$@H)s<#h%js!KA5?pPc(g)WsMT@0J z|Blyh%svYdZgc_6{@^88?Zu{k}Mn0CO8+zv#1Sz9Y0C%$6Eee|~zG%4<6cCo7BW|u~AbUZl7oI_Vr z7s-rk-hll8rs;J9eLd5~^SDps!1amV=t()WO#V#n4^gdxDj>Vo8o5hJ(~);NB%9{S zYQ&1zUD2yR5Gpx!Xb1$M5sUTDD$VM;cpu0l&uLKGYT9tiij=Hs9FfA0MQXSPx9r=f zWTdf(`mn<`E?=6TSvU0&yFj5_z8y!`^}luEK#jmh=-s+oqtZ|vF%}_(t3agY*u#wE zt*0Bc#@pd~dPC6DbKrVq6sN+>py-jw%}1k%a<@CT%mJKedN1f);hIZMocwRy}p0|_+}R} z-5P)P9Xh+>&AX>x`^H2L4)=;s2nhI{#T$lmB3ly~_;briQ}%OM!drm2$%7J^Pf7%i zub5K|yf#XpsBcmBZ#DFzGCeNpOZ~$XC~pu*J34Dv`BA89dWX!^3*sw%jEWyck6J(A z_Pgu|x{jZ}yN=&33j?hChXc`iv_`p0VW6f)(4sGJ$$u~z$z=EG5j6sfp+qAQLxXa` z(pBi|cc|mpC3jNO`%hlZ<2)eFwj9zKVQ83513wQud(S{m&xr@6<0QkDKk1#ukniwF zzZ~M~VmW_HM2q0e|Mv9m3HK^IE&ivce=`DAT}LUsC&;GhNv$3FBV|emIh7FAkM}5- zPT(7y*c!Ek`1ac8@$b=f1E(o0oK8L!D%%zVMAyfo>&6*9x9yoim`h9e#l<7K!K98! z71v1eV^tbqf@w(qU2_T<9hd#CbeU}y)c;}IPt~rl6%ShN`cAKCTdPLZ<&tuK6Z8tZC-*)#I9;v*+K*0=C_t1Ul~gy91eP>1LJM zl_J&5W+%CdknqYAJw@KMDl`A{%b<3>{Rcd*_JzU9b-yY@Z$3jxizm>kyV9Az4Hkh< zr#L%bN#YC^KiudpVx6nNUV%975XBWPHeESU6cTNCmxk96;2t$|z!|ZwMukf{QA<>N zqtccH_Z>e0kTKmQ<`jd<(A z!)t9zgZJUCkPu;*gbpM~lz>;_`t1li)WiP!71H|;Ra`A(TxaZ-w^1MYOM&5fVF)Jz z{g|l7M0M9tk!lVxvkpw4Ir{G8`h~&5^i9E>x0El)a8(M zexBK}87#1R5zV=lQm&}MBSJ>Nnpi}Fw6WEi8A{mBOAbyVMGyI}vZwSR`06=NmsBj} zhead6C?gsk_2?RD&4~-vasJvu{%?inH=8u zE#$`?Y3+@XrEcY9b=KCM$znuJ#HMoK%^-FSa3#^tx5Df_8~+deLAO78rci1_v{#o} z-F|ce25-bs0{$Wd;NG&xg^7|22q)Ioe)zf}_!NBpm#yi@nw_`pX8G<)O~Apa{#m2F z!MBNK{lO`i$?>w?#mW3C>gNOGIv1)-IVx*83bA^7SKI0c26;Js#OaC#3XI9QmttYB zm0W*5=Fh2t8Pl=G(vf1C>rR(oSe0LnNO#W$el4IVjx69`UHR+>L=?J5qL|y2ZfH}f z>cQtVK~94Z_Ed6`;^aHJBcB+=G=)CXXwW7u1c!TBTj>B&(U;&-R*w5W0bjqIaet`$ z1%_g;ApNn^Si%B^69L_H)K{(2H7_?D*r1}g`!rhgYO#{u7(iblBiIef>IyYY>lNuQ zLWx^s8_IR|dgc~0R4+GqDc8Z!gun0%a^PHO@}L8w!pV^z$gHptv5iW>9zzcich3vC z8Q9cT=Ek1%QS-gLJs7E8lg);V5JTh#Z)C0Hl;?G5eba7ioAj$g#z;QyfGZ`|R#VnA zJ6kh#tdUQ$bCHJ14Kt{fmmEn?Q{Qg7X|-#&D93S?*z76_LHY&5rxX?sTCU!f$>Q z%n6qC$82!d-)!)!SEM!;vKvIV0jFO@Aeg{AQ!1;8`?IAbjmGlbS(%*E;YvOT>3;#j z6S6KT{Sy$L757Txrw8+QNo3>GkRsBkc%8|_jKr zK(gZy{flJBkis0X9xOp5N{OoVG_2ES_X4yn@LBEjQj;i*(?XQUbw;p;CwpY^lTsW! z>Yo-1!}HMKmJ#tx_sgLsS<0+gq=#YG-%c$Qhs^kNvy9G1g{W?htbbd`q&JZ#Tk6Is zEbKy$6&AfZWMohn3Sy+(*j*=8$X<%^rO*u<7+?-|M@AJw={1q zuceYP`->{iP%B^7A2#2idOLWw1BWoaLK0qEE&>a$4cW=^pfi9LiK;j_rHqWHBXvsc zY17~#4H3%+LVypng0zprF^t_Fb^K-+J4g4KPsXRZRQGiZ-s~0SLe(0!UWb|a2_mk) zJz9MyBtt7~moT+`qz*wD`fv9TErk++CeWBez%}%Zn9}{*AM_2I_mqQC73Hr``T)7b z_7C)`2Y3I0LY@WtVRpung5wHzNdo|b@A2Q2mRI8Ln`G6>L8d++Gs_fU9#@EuR}e|J z)E(0NVF?duxGXos4Py%K&_$I$aVfh20E%yPxkXThfxl2 z8tu*KqKKRzH8D0ytW{>FvAruwWH-Z$E=#{0e`ztZUC8yPh+G4uU{B_vx+qftwCQm_ zA4Ta27f9lS3-n=jYYUa5{09b}lpq#;Mb!!$77eVy$ z#z$K}m>Usn4w2EiEBJ+O{5KcK6vz^00T&2z8pj19DG>OZ3l#o1s#!QZ#45vIxoY3h z<+NFJe=2MCrTnlOei2WdJ`7?g=o!$7^}mQzm}UXctz(jLlK8Sg8}oI7OYhg`yLVHp&L0?L!6Yh}LM z#xjr;hrj>J4#UDpy`03|?<`$lUX}JZ7ome9P`?4=qG0&u<11cM|}Y zg`8s7g-)Ey!XqI{x;BBfZ&G1YS(p4P=3PLJJpe;4&>5!#*uH>4{Fd{OB^@4GAefK- z+!CxtHJ}vB*trtr)5`5I8PtLH^smv+v)l`do%U0R|6;B4Csx#J3ru)tyf>XFGR^21 zF`L z@aAs}efvCc;<9)f)jQ%6WIp+RWqb`#2N%fwYgkcTmaW(0>?LVnfgo22A`F*~v0DUr z;J>@nP>ooA0Ef+6gSI;wJmLeYk0{xPFPM}eQ10ZdBziiZ?QW+q+>^v(oAuI~x{PD) zr_8X+Hp5!e7F3Z=*Qz4?=8_0x7?WjM?qn;rDh>YBX&FeQ5oPHOj*mU8?fIII1FyoC z4oR|SCeLAaAHE?b8Evt-WX`DSo(heA)U8Pq;wa*^kRi)EF4dHLWeT0{m+J6hHGS+7 z+l1K#e|(`cTkT>zNOW$JX#atctNGd1@@th^{U5(5ts)GcVq^2iu`inLSMSS9&iR-5 zJ^HS2m+|z6?K7{q#qI<<7_6x2OH3V^h9;tSG{d9$-nUog+l=b)Z-s^Hr<%?m-Qpy~ zYPPvdkPINYE>ou%x@c@Giq?QT3$QFcW02#{9YRqBC4i zB*%D$y<25qaj^{};UNs@`E>IPN!ysK^2YDBRBZ_b7kAzI#fgRv^i!8c{CC)+w~(&S zx^|v&jOsFY)g&eQ4<@8{F<*;K8v04+M@*e$a7)n@ zZfBaNHQvfukhw4VQgir{zlf%II*uF8LQIauC2n+4r=|2RyqxY)XyzDwg3TFIpLL%V zmKx2G!}Sm=QyeNK zk7+QO_wamp;nDa8Kec)SFPGP04Me6OvdKp7>y|?I7_(g}pya|Ii zlN&37XZ9Bg@jSPe3Y+LpK?_@j4-X4Mg#%VoCwZbmw%3#Xu@n}bEQR(bOX1~5vsnP| z(oaW-F%3SDaD_W+arViEKK^)yZB+Neh|ua{8;t2fTrJ<$0de&4PN+^XCpt06tzoA& zuYwp~i?g3h&(EQP3*}4Cbn4&kTM#JZd05$QJuJqB-EJ`eFXricHty!rrPz9mUKvvl z^HkB|GFS%E=90=_#o8FGUZBwfUp?W(&y{Tt2sd)Y`G?>Nd6U2fHqoY{5PQ?k0nqG# zx)Gl~RQ2`Y;HuN2C55dY4=r0pnuC&!^LRmK_jsylv3yU*x^hx%D4c$Vou#kaU1`46 z((;RjrS`1~&iUphmIm)INy1mMVwP$eXyzbCiPMWiRc|LAlXKYwJ~?nxBZ6mbY|qs;q-cWT*y87V63lKmsj4VG!{f3huyV|JTJKswE^DsM znT5<-2)K0?G!1Ygmu$c6CYeno$J>cIrHD(DnSAxgy~Fk}r(ND6(qhqIwc60h4F-VW zvM55I8ugFnF@4JpRW-fm8HmP}m9`&1h;hJhMIQYtZ4MtNPUnicTrA_KzYS-#5mOk8+r?xGFu|%yip`kA)_<(zSAGyAWn#RnKE6grd>Wt_EvF!KC})^%MIO~ znaF|)G}UnpY(emLqF9E z17Vk|r@Pcs>Z<51ef@sn-AlkDmEGCiov;<3JSmVV4O|W4eAU-th9)r@4eR=I8u)!_>;)BW0|`qyv;)HwB%`tsft#Q8L*(}u+l z`e^f$Qe4|QTyvsMj;&vK3>R#HEk-8~XNxf<13-S(Bl*Eaw>Hy{&^SXH-5(>Oi?>sq zZU*r=vqqj`G{*m-2;5iRGx{Q$`{G5$Y}oS8@t6{jIe$=Z#7`WbTa2|(ZO*k~GeiZ~xE!QYRVp&?M4jYfp z4XfPb>4bI+#$Z}G3B_Yo{4q|FI~qo zANdw^p4YPR(&H!+uO>VD{4j3i$4Ln=X&^75UrxG_$cFH(B)4tNodpD#oYgNsAN7pi zI26j>+OH>1_8%-GI6u?(k)xOGy~-w+QJam{J~DpRuSgF3_4%RS$uG}+cXuw{Swk+^ z*~1K{L;E%+_32e1{zo8WnI9~wx{5YdP=bjO;WtbvyTz1kwxt^B=rDeTD5C#8ynafy zOSa>!Epe%0Ov zn9Yhj`bp`{FobnDl4j*&KGvPBZniq6$P(X9cc-s+1hnHtH?U|}y1w~AM+UxXnz<;( z_dJYUGJQW}dW4^{O^GLg4q=MY@X5zIsGC7->XA2WX}&ajFWH~sy9U7gTgl`tcGhQ` zt9(kVwEn?5hCk1SMrrrQ?<*+wYb?p&<>72+GpR;{0oih`IzY&D`9yi)@NX{bWcUHu zOzl~A0OvQ$=e78eDZ`*oNQ zbdz{R4* z+Qnx}nFgv3c7q4q%Z7fVBEZ8Wur|#9cj-KIO~F77+g$#hGBvi+biG?lF0L#vzS{CCz=Z z5y#3b8dHQRRzwY>l#IHVC?$hLP;v}TTD_X!UL)yIOr4i-NfKOFr%>!r(kNMlG#o@R zwPJ4dXb$QfhM2H3rp=J8+t-r1X|EU5UW|+J$sfV?A>~S{=^>Ss*NfJf2{c5W7++qw z-(xkOiWz!cW0YaZEI$yMYDj(_!Tgd^e9q!czo@huYMFATs7_y!qfcuWWDNK&9760_ zHQO}n?)qrx9vblPt5z6Qerj0A9uIj^nbJ`@|C2taUA4IiX=4#t7X02aeWF%e*})Jc z@CtCo4#mGC;xkCQ&iz&h&ZFDHm0$7JLW5nmbO)?s&)f62c8HspEGLe}hHPXCX2Gpd z#1s}>ZFJ?C7TJhnEhkW%QG}4JU1pg}sN(|94P8ym2Ei^USNT!S9*?ah+{)>8H16)& zsI8Y$atUdcR(o4&upbU~!5@V~z;K3O!(PO-8KO6{mr1@bAg7}^=jy?WhYO3^Nkr($ z5Waj%HRQoPjNbU@Xnc%s21!i-Pc`LC!3jN_!y9EtF$!!$ z$}S)slQ&f-Uk|^kuW#lYYi?_;BSih2p5Y!N;5id#Zsp8@$%T_$+;cJ#cKq>tjtTgf z4pAUdZUTU#JNUD0dh!A`R~r)@6F=KVyRZ1wYWn>-W}1+Yg)`tSHeYRQ?1yCongJc^ z&Xk=mG=vl1j~#;Nwmq*digO0JX>l<1)5gCTebxQwY#5=cE%E7WXuS$>2xi~wFYS`E zIfflGL@I+&y?vTC!_K~e2+CJI7BVq|J|p?0&&a4M(QQj213>=AF-MH0kBrQ4K>kN3 zK>mi!knEII^P+Y54g-oLo#92RlBxsR!-WeRO+BL%;E!igCB|POGK( zX7dqGH99fBwly}7miNZJ$}$I%Gx$xXO1D=m^p|AE*H9W2m^b6a-Av3zkN6n03DxA#&`oQp}iCeL4 zF>$w}1f!l*Mt{7&8vc%zE_HF}=YSyv6kJz2fOA~(e{hcT&khAZMD?GG0)Na;j=@LX z4+;ui-+MuP!zB@-q?gw^ay#M_#r~*6c_GF~EQixS)`Ly?I9KK7_JjE}p`QxBd_7NB-?Vsm zccXMHBf3s!k5afOQP}a`Mr0&R!ULlyvMCl{J1K1mM*$m=Z;f^ywy{T1%P9DXxyOv4 zbEuykGGu`;UmF|!J5-~`q1vQ4?g&$YH8J8*C~PL;q$6anIBqhWnDNj;IR^Lo;lR)I zm`_YVMIoEwbVL{tsebU59T$K?U1L@GfJ$8mAUZDVq3dKcPvXMrYfYZsMwz>Ss&s*x&~^nBSx zRa?W@@uf`!mZT&&Z4SS5#2eli7ou@RPdWp%gzepZwggbz>&+yC2Syo_OI&6#0=uMa z&w6$qa?|EL`XMAHCb<4va51t+v$eR-@+AL6aG_ERnNZL#09_Mk30*)-C<WW#_#H<_ml{fdCh59!+$INKgyi9uZFi61oS$JQ`OLS&fxR>K3Nokpy*{+Y3 zJyW;*mCGvyf=#DuNFDkw+bOrk4TbQXE?R~G^%={mMum6uBf1cob2G0l6I%=iAzNcW zFJ$#0>26A2tiyu>rLiKmv8^R#c||wD>h!vJ5!i4=`wVMaB!7h89!)Kg#YhF3PPB_&th>NE&phh)9EUi*7(bKtQ@w zL>Pw70fv??=}oJ23)0;P2uMrA3?V&34mhyS8q~e_eLwek&gZ<~jW7MM_+M*X>-zp~ z2=VV;>}FCYuu)S&jh|j8gljl(`tyLd_DQGE-hgs55>&iaLh8_u z+T7*>oaCw+>M!k3(S=q%bK5y5Xt*t*nvLn7o|F}s3@f9Mp_-lXbwA+{@1#u+cG5pM z9UXSMw`J(ffjh~FCP3q6RW_1Knn+(maW^B--$H8FrZy%)xbAh*(AfUyF*CGlmK=TH zYxMzrgZGYueqlHJw2cANLMOf%Jy=(e5^uQL3)J$kPDAz1#_NH2a_|^vOD3t13wO6e zDkWcL9UC)ZX4L*ul_P>LslOi06V8eXPi^Q-&QBHSWTYhLm-RdSit9)#H9VeVW7(Pe zGJ5a%TAp?+s503k=1_v&Ngl(|34-haxIx8uu@0T$NjI`t{*4u6E}q0xdVpAx8>YH9X79;4am5_|_mvtlWqqgCrM-IDNtoX%} z=Aa(~>D$?5w+mnyO^>UCe~*m>E8n@24mJ0*g|Vm-#Y6-c|>R0Y7i#Z z!`st4E?&h$v!r6D23u)oP^X zRM7>BHs-g^4g}%bR6!wcvNAnRjb5cD4+*aidqzyg!wKeXDAyRtMk<09cgnw;_8!@^ zAZbL8wOo9#Jcvy%!x4cdQUiSn)T4voYr3GwNk}|>UWIgU7!#<@~ZlNcj+4oUH6 zF)Ge4Z~>Wr1(_u4(N8>Y)z=MLaf2Y!6Lq1X3=`fvjNp)k>@U1RjZbH53Pa=mxc|oY zr?KGR{l{wN=p27Va>HZ=D4vxrfF$xKUGx_{!@^RJ8bZN2dgSRAYFQYYL)Q3@}0Z`4SEiWN2YEqSiZ;VXWjP?J}w@KSrlVZh+qJ`fS za;a1~N~|JC-|;f%s9H>;A_MCcpg$yFkx$d~ADQK~yq#U<#_V@MKc-+Ex!cm3N#{{0z?6${`^Qw}R+v!z=C`W}Kif10% z%kP(n^Qi|=IOrq&D^FqRDYmHwzyQiQ$Vd)fK;O+mXPItgdG$;(iNU;8YGbmRpZ4$y zrT9wsL#4_kWbQ;;*erK`?h%?lT-?>&KPdMKq&tu>=$X?mfKDZDH+{MHA!Gyr2nz4N zf2uO3PeL`SYMZ4r0#>q~6{TO0EcfIXUaXgeT{G;@bi+S^DvH$1ugPD(=tA(NK`Te@ zI&rDff=r!5dCBA!IDMZ(Yjhk}g?f@>T(rkHbs47&YpQnI#l0Nk4{}8I7I)RwnJC89 zQ4~P$rQ)w?Aa_1%Tn z2`}8=>-3fAABA#Z-?GIGe|Z_2Vs`HF@%|dLwd?gZ|8ng7huGzz@XhV&%4ko!>61r+ zI}@g#QrWL5?@EVrbj8TtMf^}Q_4*RIFy79w$<#90?`LXxH{kSpHxBaepdPS}<7wRv zLcvruM_$MG)0m~*Pk#MW(Ql3*3km~I(&Qg8t{yqlt5HgM{SyiU&yKYvQR8~3hMcgH z9JEllSpj57xB4-tTWBWRe#83tp0mS@rxmeP?o};dm}JxxBWQVZAfn=euVMi_%i?5J z0ksPI28Xbux08ss3voxO+BmbweB`x$mra&?$K8xMsR21hXSn8hN7+TKY9~1M@l?Y3 zY*c^A0+cL>&$usJKlGwU-vx7u#{(+h>bQh#29&n_P)xE+x4Db&1HENemSTC0iJA3W zUU{mbVug#k!~rH+OA9(ZI%l}2HEiG2UJ}BCSXX+McuV#6RoV-9wio%8(PJO}!Xw;} z;3KJy?i^iqjJht$!_2qR#1+y6_)H^`G1JQ0K}R}ZGE?A8=4+3CgXJY_0F2AP3Vs|c zbj-b3|HgC2R@A~FddWg~9KADj{PE)mV4gG$wAp_lXx%0H#)y4B30Aa`GE+;!EM3q; zX5c(6l1vnC`=5%OQU3deLV`)l?lfFIfb!>OV`V}yf$abRLKOgkTu_CvyL*w3@bG`uEx41B-GJ@H)h!;ckQ!d_ z^M#5dY$C`)D%kdk;=?3zxWdlqQ5vxTtvu#mS~>TBXyu+jv%%_Bxk&}T$o?h(fWS$L za9c8ZykE#uLz7{6>9r!GBAw36XP%7C6`!hV3-`yhKj>K-V^WbP+JJc)Hr5q@T#%tU zbeFrxuZby1C`2m;G%mj2tS5C~JprfQMJtl$6)yNn&Jh*t+|=+{o(gECt|;D zo`)7@q6ox+Y=c$XJ`a2Qn2+76Stf8^w47fStV_LmY_Hc!UZv(^^z{pa0S_0w2|us; z{w-*(=ggam54FjWTd1gNn*OZ>N(%A5L%*5(znJBK&@A~cwA`3zy^(rY0?7JFh98HA z9{z>*`j0DtQ~2N6c|y}zhW7hjyBD#K0tfAjU03Ja6ZN5=zAV&rFx+A&k4k;++CNNS z)3wukeFzNK>DQNxPaX<>!=pZ*Rf(ScB;DE|-lj?%qo-$MzR0e?{zZp4?J=IWWFUnN zqA3VVSJ-Fel3`9MbiI&0x|d$@&RhSf=x^P~$SiZHkr1jKJmhjZf}9?8$*l{$wozZkTWJr9fVRvQ3?wN>fG%&lr28d=JT zXeKO0hMm7?KK%=q)w3%wVjHuwYuJcZ$xs}3iEBJ@oH8MMg5Dnpz&bEie=jw#=Jb{6 zgz_M$!WPl53s|PV6mhlfmOI_qLsabXT!RP!Xt8`#Z)f!G$B@^q&!wFbAk9(}Em(Fh zI!sL4I3urEd_uO~gr0)E8SLeQ{Pr}3E_L^$ph>>ST3|2>1O2f;(_JUm>dR0=al;ID zYI2gQkqtIwgyw3fpNtE=-9|2Z^ngxQbEJ{eU=~9=+@@lp56p5ZYKbsEj9*d>8pP;R z5ilmW9F@to>ULLOFLLhjrrKiI#k+7 z1B-buECJ1(g(g{wh5L7=ax$64xyTtN+CKgcn-<*{RGLk;`J;)fxyL2TKa8yc$o^#& zN=2s}1?Ck{T#+Xosh{i>BnB|e+o8GK@Wu1IKaRHym^42RSgur9z*agBT~65}aVT2G z3L&UoIA~zBjZyunNDNQ0K(9m2!^NVqd(T=#I|(TC5lz7Yefoy+yYdwgWBfN^8JZW^ z2$=oUGE-j0r#5Lod%`Tn;{I5{c5|4I*Ffh6l(;H5;cA$aQ(p4=?km(EuI4_#Yo=hy ziFBfi^ry86h-a-SFP~Mns$u0+nLZ>+&G_a?VSQhMdQqHm$XDS*e7hC>EoQhT$T~+go3!HS~ z!&0GjzNe9nNJ!tXeYsT1_FVY9xRzO)G{ZFT0uS|y)35YN08MifXqvAd;xtXDezVkV zR2bv=vGN9oKg$0b(_H+?1>Qpy`{TI4;)IKn^>QLlbI*w&ck-=y-HdS63x^iXb{Vk< zTqH?5&lI}O!5xa@0y~B!T)F*lT;Th&ND`H=7cD3k{i0@D!u2%bJMjQDduMpF@y=>( zE`Z8Kw$Gq)fj<_yE_jhXKE(GM%0WAqEU?uZCFse8n*7T}qd%v3rfHslL1G7-@}FEF zaLWJY0$mVZ?OduI!X4+S)T%QSHiOI8pI928RLq;-C#E|rvEgH+&b zytz7it2F9%+U$m+-}C1)GEbPEKHjJKyj+3-i$g3S!~{^9UL5y962=Npnzc>-mYz2| zyzH{|PkfBIE|}lAnwFvt*GE%E=B-E1npc)iKB|{^jCae{UPMq#DV|N-`NUbs+A+>z zCy&u<8P|mAGxcy8G&P`$k5K2L8_$*0xG25r1Nk~Zu0b8*OB7$9aZVP>jt_lZ^&70fHb)U~Q(MM{S@ z9KU@SxqYF}4y$7R4;e^pp>gmwPWx{%uy?1a{WXjS5ndTJuMdt&ii$o}^ul-U`}W9N z9u!6f7)jNm2Ew)lNkrk}HDxebPHSq;YD;%}{wdb6a`?F-%zd&8P$9i7KhxZ``-c3w zK>DqzQZIO0L;uPbme)v*iEMSF1eAXPMC*{R-1L_6yNi;MjEkd& zhr^{xFJ5b%gR7{h5{GHpAG1c@8t1+#oA`=5lpUpNw6Bdwi0BI07u_esWkrM;@XUiW2l#*!mSVaJh-lve6x@z z9T8qt6%*Uj`^v_c8YC0Rx>jZ02b@v<^ulvoF=@d~G zw_Ock&=kij@_*r#2z5r46GNc+sU{yC+!)Oguge6pqd!NGligojQ5_)V&uZro zXIU7lFdc~(!dO-SYC<`+JPuB<%JIj+?^jIau5DNoa9I`Dd!bnA~5^Y*S?X+^F9fQLg!K zq8zvXfU}?t_q;9|!>n2SUTyvudN7mJhk1caPA7$pZEFrA6pC3(qo-cav~!e2+u<(D zZ0pUQM^n9djv}qdf+n$~Ww=VNBtyB{Utps?lEpFx#$)?*FbassE9QD>8Fu-Qr-s3| z_*%0b5Oz@?YgSSJTo?bFnf*KncV`X6x--^DT>ccmiCY;+U9am{i^h8+TY`l36_8}G z0nvUw?)V;kt@Rknp_D3O@E2a@Whq z&TJrG{+x6#0sMWInnN8Av_a{KE>`!H`BZ}^EQd};+OeV{ZP{NzF&xFLyIG7;Szmaa z_`>78j&e!MGH2D!!*CAyh7j%zusqh&92D6Erb~9#s~jO(PR#15ViNg12M|3<`!RGv zTF;Loibguvk7q*?f+gk$N(Z6J4>iqX$ffjsd|jNn>0p~x(?eKsOd^k;Q|dz<Fr z-e-b{{hE0mDwxI-6eTVIW2c;JAY_tSn=|zBln&)WuYmfAo;5alw3>`Ter0z z-E+Fvb#w2i>GO?Y_0-v5;FX6V*+n$3ILBu0D}!ayaLSQcu2%t?3Y2r5*U6YxarLBx zU-hJef7O$kBDlA~m*P#iQ%6tk;w=B=Y*bp+f|W4hg7)sJ^W4PhEt^lbFKTT1>`@SO zcwK|IRW@)fM?x72Uq3+0YSCtQGcNxXkEQBNfDxKIv}KSl{Ikwaed%d;yF zP+O_lAJvxYdD+XuJa?~$MT2_lx@xBsFDh%!r+h~E$?)x}T3-oe-t}9DIiehbbn9~^ z^WY&XuM=l7mnqKG&17%$^!!MaBETeiy_iqlCi^xS{G$3Li_??&h>61VfHaYMR9A#` zh0?u8GfJi`rQtE06cY*}n}_l%hUslKG#FNSj9K2QORa#zS`}xfD998`oqV*1CSo)Y zhD350AG=(r5Z~;#ih`2Zwn%gH%H!q<*t0)BTQH?Czt$Km=a410 z0NthWBH;oH66;2Y3^Vn(^L;#Z>2!@h)GbuBy-K1q&C~_|E?(%?^~yJ-1smH-2TFqt zI|nXH2{!DwEak5a`@+x%j0ai>*;1SRZjciKk{8sEFWExfak76SPWFFNGxR>`bfGLJ zs>g$aYQZabkBg(@IP-Wm(I$8GP!Il=`fk|$ggaKO%wMa!9wnVsDcx2vG|$wt0)Fm9 zKx3@n=QJ5yE#ni|rZv>Z$_zWL6XMnRuJk`(CN(Zzn)J|Smi&}9nui>qGd6;~7u=Ma z>+uqJ?81G?V&IL0{6Yh3*Vnb{5a)px*RRF5oPT#=g_=Shkse$q81AgU$vr7{$;+ zwxpo|(!_$D`g8UgrpVzvObeI1ppN1u+x9zGn+JU6(Um}~l~X<>3i!-A-8P@BA8Y;g znXwXRY5&4gruAdF(hrk!hQ@|A5ejd4HLv_Rj~;oQiBUt6k(o=~YHA!6_{IbO+#^>k zW(T&>bDYL??x)5+eHTIPA|F?~c$KQe+SFiGh!g!wB2AD5>13E?E@yKsQNJx?Uc00L zOfoVXt(775-hMDJb}6Wt!U-$?Qi>VkRyNf>_H{0^to;G|p!Lys`m1mK3c#v}nC^oXoh=IRgvA3_1`!xc z_ShtJ{ciZpAmB2aPqK4qBSwN-4j4UGB*Z>upP#smT96X(^;|;~dRX z4+LmkfP225;9NtT+>Tt5`|A(ZCVfEbg7G(4F0tQtFL$TAXL}z@!rq@>pqR?2lX)hV zkF6Odmub%}%cE8hmoom}o0J3dGyiH*ib(6tprpg3)gjR2ZCC z{vvOnXf^&gBHbyco6y(1jm`dny1gV(n4@U++4iG2-6wV!tcjZ=DQAr&Fgd{P+=CHB z-n_!Ctxj*Q)}Dm<-R%e`a8o3t<}VjI_h> zvnXX91oaPDu7#;WNb>8C<(!e_!XAU5yeG-0q#)8c>3pKB4<51#*I32j3b?)b>uqq| zR|(CJ2%F`NpsF?Z3Aq_sg$HmMvIwWdQ%Xo9oq2Xz&li4qj$7Tt9o`rAaZO4J2eALI zzg1|^=JMgYvmQL)Mg-(`5J3VSSz>9-SI>tfu!Jrnx_XRP4un$7fZU)N?9Is%2O6$h zfD^1!amdFPdEL+6te;i)PG(OJ${@!aYlpmWLG(+cB1&^E;I{c2ekoG|nm%v@fh19V zhz{Q>%9L4A7WA9qB}!o~O95bcT+Y1eRhT+i;ADSPvH4k#G8?Mzj%m$#-(CFapEWgw>}(UMxjAgf<)nBji7VLzQGCT~p6kukl}3DT6_wxUHP*WeFO zapT}D^1<*P?0KV)OcD~G(>-N>xhy7H-)P&zY3lfh>3S#DFm&N)VRe4BW0zwhbA;Bp z%+7fkQni?_5sR@yo@gkbJU_krCbJAeVy{x(^bc3a5n{!_4P(z+7L8Qn+g_hcyebUj zG-L1Tu+5(kG(h13Xs^J%^z-XUR;S4n9s4ugP}lUBYgR@C$QaDXUw9X>kOdo3ShCuP zU;{hH0;lY4;&+>pk<#H%wTio&N2@2Ubjt?v+UMGy?b14qOHA9)+!?7UPIeyanQ?Nn zv>SqDpZ0boSywOXyXW$#J2s0tlcd%=ksLnWA}mr3Viar|m3UBlnq~R&?t=|oTlUHv z1cQ`KP^DO*^B~b5BiA6enx~dGeto@W}vkMHPj|simSt1{n0&QKeCMMWuaRiZvq>W$h_9!&q>ZS>hvW$)XX)>BR9Ba_CoY~;kRx{%Pr{|Y|Nq64usrW9 zCjC2eKs<>6RK?29;z{||e80}LS_KP!g};BEX*ugnfn!GSY6PIx$m;#>4>~KPx)(q_ z>3?R$bk4G3XOUx&6|-TTHV;1Py5MLKwM9UXrHVND-|6q))PL0)^q;JlxZVVA%f4PP z2(n`Ev#eP5oni3KP!bn9b_e|=XIvj9tdFd7zyu9SZx_or6Ud+J$o<)mPzzK!u>kKx z;8u2dm@+P?M%7O569zx-QK?b0mZUjD?@@5b z65P#Vt7=5VN8M+)3~$mN+S&~qn2U^BL~1&I&$I97=6T!BI4e8|0b zfBzJlm$q>iK^fX&gFXv?++a`DAL0sM&att)v-2f_$}7ud$!@tz&7gjE&v83{*idly zuJxeVS0+lwIYM3RJ=A{H8$qJFa49S2`Ok-B)m?lQ<)l=Nv*#Am6gIuN*WBd21wd5T zb(n=K|NiNTIH}0-DEO_tQiUpMB_sJhHd#*_Ts^jBOY?-C1{b6#8Zx}kkyr*)Z zeavVG9-&^Z?xI&k<6e9?h*i}rt8=?u;wQm1FKOI7*|A)bJNIp!-00<3y*{5iFV3}H zBChUb^k#~67#A}p*z-EqU9`pz^Z%mOb(P#o^iJ6Ps}p5u@bamxfN1-?h1kh#W$>N* z*Xc;dlQda+ zJ;amCbNRlcMj8+_cd;pXnx3$>aD;1qT zm7tOREKI{f0U6oauSL0Jp|H5mY&APCnecdQ}rQ*o2 z@=(J?ae7i;d$!koFP(A&OJM%W9>FNlGh&g;&lc7Z4c>) z8!`WB+-dlAYG#R*pNteyaR{@zyxL?a_qbh{5Y2?zeFD-M^9(9$$MUpojX#OIbc{_F zj9C-ihn3=zqy5PQ(F*Uzd8@@S`!bY?&%0@0ffFPlGoNavAKAgI65qPfUb*uwrr+>= z<5Qui!$46?GSa zb9HAptinZEUildn7j`CQbbGSI-_Zu2ENE;!m!mlDMpn}pKfS$pj2hfnitcnG)?BSH z9&*z>Ud8@gKdHFeC=AY%Vba(dUt~R*hBrap4OmID(mPC^ zKxpK(?CcBQo6JLaxE>EkSW9|VT&>7ZSN{u7s@9Ex!gW-!TJeVF>;W`>JUnyQn6ev3 zad}ZV@&p_xS+V-7zwD!iBq>aXuM}Uh1r7Eh{ZO0018E{lli@=zsLzkDsy!DqF`pKg zNWcr+Qi$6J;{+c)d4f1g$3p5xM$U8+$0o`S#6a|ly;4s1<@*K9Wu?<}cntNn9`5s$ zPR!gcReg?AhMieJkyIj6*;0~gn2GY!TvvkqV4+^0G>;y=O?X3G(ddRks|puzy7idts6x+WG?Gp;qsp(D)1R~h(X z+9b_`|7cV{T3cnaMAE~F*B;D?*FRTUct&IW<9y+L2XX-&z08;$ifOMQzDJs@2r(Il{baHL(#Seo>s!83d zJFnPo{mGaSk;tT`j1KfR9jsRoP(uigyy9o)YUc|Y3ELg1c&N~!Jg`!9fDP({XtzIY zU&2@@D5^o_VznWb=|Xun?#|*i;bX?68?ZrN!Z7UOSpX-amT5)YA0QVPjR&--PZQo^UHMC@foJZ%1_C^&z|>i zP)lehei?EPEI3Y85gKU?`L?-$vB@02ePy>5y~iCjM>k!0^;g53yNXO;1kHnBz)c2( z69hGt(c%W2?o$abX1wNqVB~&-yj7c+{gD$wjR4Bf0(NL};!J^qY=vXS7A~c+RVy$F z)7nO8C0@#*AIOv(PZ0In4*EthGxASK1L%^*prjGF?DaZvvLxT^KZeCHooLMiB_KNGtMq)OipF$n3Bey_%_+HkVqVLM6~=Xr6Ir+Xb)!{+P{bR zoziG*IZJ8S-w;+gIUe!4)=1mEpj9=4`0S*!9QozHmfLt8#sMt1`ya>5#+mDCsts_w zB!)D0>YtVdyDh9|Bu6W~HtxgH>&2~&)Qrl=OwH(>N2d&{Qh0vNVyQFOenA(@=DIRz z`Z0nwE9Mrls)&+#w2tF&M`$ly2Qzcx@0lhUn8iqlabgXUU@BPuh$)s7fgEyCO=O2X z9){<)Szp=ge7quhP~b)A$v6cI)o)TNa1TJJ{QWnFE>GM_gI{ad!j&|5ZPo=O zlXH4i?vKvsiCMg>(XY~eH8XosfH8T9dX|3GYN7FUs8WRCRDGvOMB?Ip2S4(H5nZ5O zoB;VJJ^7pF_5BWhXSn2jj79%?*MS%8 z(cdt7?s;nSGB=Z)ZA=;CW7j?(Iy0F6daIo04eiG!=lKjymtZpGHHaPH~ zoD_<3H=@syi&sQoizrC-TmxG~Om`%1r9fQyGh4m1G>W|81rik0V zk>%*Ecrs#cOH;x=sRIa)>_A-h)wo(OJ3-jS^M8~{vEKms`iai+v%L9S_TuygccCQp z(28-6rOJV<{rHot;SD%PE>?NCsKPG%*0NLLXppIL_~)Au?w(Q=Okr@*`6(vqa$3Qq zrOsrQ&*rCt_iVU?&CHQeQ_J1W>tpHQYQlwy8Tf zqQ0yOn}&!OL|=|ikwCAAgut@w50Tv}lWmg}t=kxz=IdCV!HS@qhCqY!kGG1n;Oz?v zvM>4G+SWB1cpy_p(!sh@UU&rl;!{4#mlyDS{`h^%?}iP*SFJX<_;C5Q|CrwN@uG{i z2C;zn$F@2AERr80-LmUrGlXxX>a=1DG!E6v4U()?wz?;bCZ&RPIrfyn%{0e!yta8| z_3fvLorQgWUU!y9CbeR0GBF(5=+XVAkg6`whKd&ok(1liJbRR+`Lyl>9stPZ1<;H> z#l};xN=Y$8c9~^8WwJj_<@;L$*$LR^!%C5rayD3Ij0-_f#nfW`ct(|yxz3i?TRxDm z8EycgYoB{%`JAx^fpp>Efzd!b&c*8-EE|>8Z4%CKagUR@wXl6DC$fmki7sz(_(g1K zlJ>=K4&9xXY(3ci!lS;88W98Rq<>PsD8B6SZ!#H_>7lCCnBbi6kp+^m!v6_I!FLKu^h2bFaD#LiaKn`8M1|$Ltm%5A`ceYa_uLa@uI2c zaET~uS0sZpe_|s!r13oXj|e$7zRLEPIVi}vQeOfI;AH5+oDW=5+DA~?Cxj2dYGmKEAh74%t|e>$jLwMyfjbW_8=Ts z2~qre!#4ITC10yu`$Ns96P4MAikTs3^4Vk~=%`c0*Ml6qg_(W{K5+UKiTV>vHg!1b zu;8!BhLA3AY`%(%MEyP4JZTjcj6cPn@smGM@?R?~#wT4yZ`=#q;VcQzqWuDvn2Rvc z?jLl-P2Q`I{(+NQfAf=>BY(rmXCyf;6U7Kd8*S>$9&WU?CjWc1*_@5G)7G6%^yAN+ zrq3ztGi@JL%75I;Xptt(LKFB^csMgrbmWjoEqxFgmb(LK)O=BO(HVKiA?1f=)0-wT zu6o%bcq=WH$>0We?XEO9a?#u*8VBHpLFHFMjKdS2YCxz_$}$EkDQwo zgjuJ3{-+SbLw=L+u1dE(Ja@+oFyCmwd~+l(n*ez7-}B9+&CO|`U0Gb#LwDmvT^(iT zlFGwR^lTE0gw2~_iz)c>VQ_rzC`8l;C4~7tp6S&iR4cjD+Wo$54LU*Em;`{ky3viU zyvbj%-P7DGvjYMpM7$*QRq>pmaN~9d6A4^&_;xuX1vHrd$`QC*+B7g%z{sJkHVnsq zfofAZ?Tf7}sJedZM?TI^Zt^bQCf1#j|80|>`N=&o3(LQ3auC-TF@5#P{Qm0g=%RkP zOLBaE!=g8bAS3E4?w)j3c~4_`V}5oI!6GXx&Vm(*?dkD=HMWVru=y9BuV7sttf#hI z_(>&%zTf9>JsHUV3zx#@6`UI6jL9FLJwHOax%vsD^}O1ET_L1BdvV0+N0Ehq`74&2 zE^SgCAgs{}mRS&18yB$z>jqtyNyv z_If?kMbjU#kQ$)QNzNwC#{wmZN$mw~Ou{pT3F9L`g$_3J?7Zpqzbh&Wfd$F(x;jdhGt zbK0d5?76(Pr1%m$NPa+H?ISjNGf7hI90vBl)|uD@mVCf~jmy%1;GkEg}d>dJUT*?1i* zsd^pbdq5O!EkZd<$uhk`65-jHx-QQq?`m8&ZfuNk7|8K!eHNSFM*41hTV-%iUz0M% z`bPs@-5gXM)fFhg48F6N$qL_}9)jet%?b3?d^5|#$Iq$I!*p3Kgj&6Pym$W7MCW|R zGFijf<0M6*wEyN^^k)27#)qI$n(m=;HzR@Ja_CS98L7{O!e+!(s<^{4*n6gF#jaVXP`M z!txf_)pgw9)4g(qDHYKc;7M|8kn4a4F8x)C(HO(5Uq4P;}J;r49+SaK4rp+mNlY;aM?q(44GSO_>DBX-+rA(HltxB zxbsMYAg?l7I-%MK-DeW=CU`w^GIzG9S4Iw6>S|*u_OMLF*;4&!RAig~r&caoj!KyS)chwWOhgnO$j>DdyKVUDns@=edj-W%NmH`>0z zLR7Ckd{O7<{14P{oBT}3lEIL{kjq@w zOw8<6^%3GmWg45W^Dt{gEFssa zdNj`$|3Arl>aTXGH#3Uy_?*&{xVPvv))9mRqzn2F#C}z#ZAudI+wqn;Wm$~*ik{5^ zMbRDU>oDJ)*%keWi&g%?QT@%|R>q}L*Uiia5+&V0P&8-E6z2A|XLWwPAXh(0TbYB^ z)7beCvYuIdTqaFwZbWDkH1>5SK2#BG*uuiP7$WZ+^a&%0J!wL9aT_+>-vf=wMlbu6 z3TT@CIp3`cBvZ77K@6ba)g{mry@^sGsI-UOfb}k5YlTBD1%oHX5&oNz0|DfIxho*E z5%e>&G5%=0aD_&*_3MY?vF@(;+0D#hCBx{W)tV~sxvv+gz~{m)f93W>|6dK?(Qv4R z-dSg375OB#G7mS)-noGXMi7dc#f736a8~)hLQ(Zt{-Jtp8zglmm0BDw6qOmG_+KS} zO|ZD$6Fwpk1Lu$bwM*mry|(n~$KMnb$U3(6nIwL_zo`-5vXTopb%vO3Q}t2DQ5n)=D4wCVtPVqL1oS0Yy;@ zkPRfUax@MUvo5hKl6R48_Y$zcm>&BK1)QY3`mn!ljl;^xVLj!zbC4LdWyr3iB{&D! zgn$S@ltbIGjki@JRj=(%`exPJw|-lQcNhS`iq(J+?*P^3yfWs4=ORZnC$7?|&oTT9 zQ<%W!f2?kbhk3lHQJPp zkOB6YRk8*-8=J>5m8`v9QnLT`$cVQY=}`ZE0ad!B7B{n4RQWMHdRQ|@Yh!98goB6J z7_RcMs&=wg-{7O`f8=x84y|cQs|GrPdkcToFUfGyDXJr(=T2qQ9cz|($=0K_#DFe{7?$2DK zceKpHC%}b;QoJxEV}*+$O1rI&Cvej9y{Q9dZF%UA@AWH}y@`p5!GB~HYHO}Fp0czO zyhrIhU*i}fa>r#eX+WB6#U>!h28aYgJ6+CM$~hAQiF7_+* z$yRxLg1ptz(?c-Wh^o#i!IzW8k(v*MC6iNJRxbzI=18$pO(?l4*Af~k&4AVTKIXp{ zTV&hxB1U(C>^#(M<`@&QrlhZv@kO8Id55vFda|Xs(ui=-EN8;+&cz(e{gGgxkqCad&hr=@ zu|{SoqfJ`1q-e+Pl!mH9-f#;m<8R$D!{q@SDuHplUVNN-1NAJoHs-kA#MFt*iG!7{ zff+hix1GHrk2X<7Ne0B3k_F!7$G4W)JbQqQv3Z9Ti&>CL&by1$Eq=QrrB`5(y=YUYET%Z zA^~{-WFvvFU~|^ zmOo0-txDk{*M`|y=yPDo# zFrOeSh(9Yp1hsGi+8M>7OB3vo1SZPG#o8&R)fRK=%Eb2y5WtMaheS1{9Y$K`4 zLJDzuUJeX@p)Y*fN07mDUGERrD{-(h6FE2=XotSH(b^&VT)*d;vJ-vTJ6J^LzvkJl z*w1Ih9I+hLUjwb^-|y1Cca(#x)$QRzQ(7S|LoBsd`^PpkN6F5WU7n}EzM00ZN(pmm ziI?IPN|NpSa%`F49=8%>_s3^(`CRJln25~51?ltL8OU`H$`u3U#up^Eavfbi^ERv< zUc{@XOurf&GDFVF}YT&N!i$gG!l6+!IyIr zRD4GQbn5+gh0hKex8K}C^?3H_rBq%~-+$*XNZo6Vm(~AmKo!wq)77MhXk@_(d0pu} zpN>0ZylyUOgsA||Ho_DaMB z)gqYU|H8ATb3Dwb+UtMvWNp;ZqPo1~LbAoq$EA!v z<#bAQCod=aJ02PI{CIlZC;cxxO|>E(qUmW}jBgKONGRGV_VTFeoiyp9D_MHR^&d7_ z^7r*JaxSXG87PZrH8Dr4Oih%h)(?1L66Ot|ZN`@c7LK_0 z?2>YV;844TP!Su)2K^029dn)LK5E898a(uH5xnDxH3zRls_U+lt9YH!X6NCc`Q{N* z$>N@E;;a07T?w<0%$y!Xxgz`4kah)lZFD5vdP)U8Kb_yy)*XzVT~Quh-pQ7+EA2*p z!prd`GfKk(#~k>((m~iqE{v&m*OZ7kO<&oQibcglh)@W(t$Wc`y>U|A_-=iBn7Cs_ zJ*>tM5m6e*sBOzm{e!}sy!xD4ILi)b@kBLI$~al_H!1Ep~{lTdYcJ$ zxdQGW9a02d);ir=bVsu3*jBQ4Te*(gC3Lz@D&2K3!H zW|HQvOI$}Vk?Kx`zuqe!YQ3XY#|-)aF~a^>H#k|=`pU-e_o~lR+}9Rg3aRaK@EB}O z*PF$Oc4(pFE083QUb&4W=XYv47Z^O~$t06wzF^lvKu}>NV~SMr3Zzt1rT@B$@9>a* z$-e!Q!*HG?8$^YB)zxxy{pE1HP`yV=W?{o}&4)9_T)Rp;qw)h*3Mj!9(u8YCusXs3AQdSSJE#(V_<)~Uuo$>B>*wM^Ajpof7q9bhX0mSyutVRLZ;9bu@1zvsH(Qkjec>^%MT#CE>H4hO}9Gd%Tj-(%j6Vfr9dn_xQSFkc|lTWaKG;T^7J1J z51z}bq>c2EwHPtiVoV5v^cG1tm$Z9dlnbMY-2(bO)|tDExY3?<^d^Q?qx9`{SC{=; zk>8LP-1jm|$LkGE=k*Qw9A}p&u67bI*z>3dUwALK#U>Ibjt=blNq8)|Ruw%C_9`3O!{7#06G(DBHI5t+aZC zYCz)^w04k$tSe>m?cnEc5{-mT85L+m_KZf20j5{UC9M;qSXHg0|Iv4T?*jLR83SMS z{`uquNtcdemAu@$;iet}jXL}uaYU74cO2={Qs#kCq}Sb{KVZ{*awYm{)|FxVnH}TA z%xLFjC8KR6h)t3_xMOv-4_T*tT_Hsw*Pv(crgPVq8)+G_u84J_ph6zm9mB$?^Ztg0m!G#YKKRUZT04r)+Q#uj z_5Z;W-TS2z5k90&(6j1OZ|qIlY&5hS>m3AEdALn5BQcsMaKoyj#BRxm;r7t#bVVx?TajEkqWUwyXF+pYVHXeqKGfeMEt5DP>7ZV9v zXK?26BARWIEEsMEU4U#@?ro|oizdDaxUBcb=k@Ah=TngZixSk+^nnf0y6)5C8h( zd2x5Y-S3ab<9bz)|9)^lVQ8r+R%P8o3Nr)fn@~9Cl`x~h_upPjS4RF6v-Orl zNNYsNX11){Kl@UOJKjWL6-ps9SmUpi)2zaMj8ePp1Q~sGcGEC5%$K z6&ew=out&Ak-2iqi3P7yoFr5p5*7iymcd3V2B@!I#(6kGC4lL1_ar2|7bpmc9scQt zkTyh8g`mk4d0UWHeA<+8yzRS}J~{rVKihuVp`CE7l%jr$y$s`Go;O+2V00Uz-Tj!N zW21+40CII2*1a-DTh<)SLG!cu2>zNg39D$;G9W7}Nl_XKf0s?dZI#$8g@fsBd>dR9 z{uSK0fSDMzpS5HQN_ZPTyrOBb@xUIw1Klw(ph0ak(*yUzifCrw^NK2~q_$|gg^AN9 zb0Sw!=UPR{U70WmvvGb{9VD06GXLyC*Jb()cC7zOed3HU!EkiFmI1E{*~*(`Tm9>= z)|u?}%gN8)srVofftM^g^B8h*#KSOsCEoXWxz<4EC)&CW+BfAzI1>PaFh%s(x9@lq<@bIJ7d&sAOHvIMvS?yDHZ?;yq zSNn5eO`x`lL2Yd(JU6b>!Tz7xvJsbZouj8s9oX>S*JmyAyQHb5{+Z&uyw6VG4)TrD8s}8X@6x2i>r&<;Q+9=a5kGfT8(dE64kkp z!tGCQ%Y7Eki&eukdx#a63IhD=t;$rLzl*CjQTJG9Q^6KmNHdTaSG^$&UIx^%bd6*d z)|PRCt1X9IgW@bXD`@$JWmHGp&-od2XyO5fP(vL9I-mr;0`(4{6HBOecd+e!|H|eF zT;6?LTsOhZ&(|Ktmb2A)#KadAEH5lP6YS#;I@dNeo>VJ01<2)wr0ZDiiE09ezov#eBH6$^`wMv21=n2!Q0*dUY>VeCc89i_eH~( z+v1LMA`Pq9-05aGp&n{6w|83KJM-S0_q(2xj#kn2>x6wEJ2wt%f zd))1Nrsz$slYbM<`9^W)uzIg`3RkLzT?7OBZn7@oEOPR&XO76 zsO6r`QF}IvR@5ZdAFp-;X!)dk7PTjfX>_)KYDe&Cx z(y#|dZii9M1jodESyWd{!^WGQ<;SIlmtb)Zfc`NlCJC$6knmhPDDom7Y;|p;KNVe2 zjpVs#p#;e@_p;7>LX>>tp8OU3O#nW;s;bPRBth0GoW|HpCi>R)eAdvorlvLbvcYbI zw}7c}0lLT6Lp9^Mpv%}$laB)xrr52}n&XxS&s?Pkfid#R@XzlfoPFuZ4j1w($zoVO zm~yl_fMfSNtxPx2{@ZV<;=5CFTZ_2czwWH(`Ls#_0BksWYl`a}0cwA&zQK+uhSvGD zNjvS4%w|JjsvD$0gSJ)izwmSmDV5bmH-$Iz(kG)324VZ-YTkG->X!Jx04F7jvk&s0 zzIgbLBTBMi3Y1mR@3Q*L)zx(G*$G$K@3#+Ng96hy(iEpjMJ4*S{5nuXA`D)1Id|`D3i~Jtl@64JSpF@IBwmt&)CrUUYJ@kwPD~tsnWE+mKDaupP>5@ zm^SRW)Ln)7c*p#%xV#|Q>9$~|hpD%^Ial0>&dc~*OCHqty7Me6sZ^V?T|1#)+rwci z^=6?do}x-cjv<6%X^hbQzq#e=t#OC!bQ4-tZ`CB0;sx{|d_j_X@jPx@B7;-0-N2!-xwojMZKQm9jsjT#`A_Z^eVUwvh9y=dlqr%gXCk?fsG zu(%}B29V1w7IEbA1Ql+e0-$&hEDPD0SX;$v_gI9?PELnVG>>SxF~Z06%JSq`UYr!z z*5TVdC@vLpd6Fb)cjF{%^70bQ2v}y)UUJve1_&Fr-yzhvNsIo-1t0@l01aPXkTD8( z+XC`Adj**6 zYXD)H>mchm7iz+2X`<}e{F#cIcl3Z*vq_(O$@m%e>PR9!+x*MDM_ z(mMQdldsvo9UH297GK>jxLREOV?Sipn*>LL4am#;-Y4ylxxDH6Ck?g`>?u^v!U~(2 zuGA{={v$SIV+t9II5h?PB1y91T=jyQC`+C<%DLx@F22e`91d0!6;O*jU{f75?t8J3 z72OHIovwk z4opcfo2c*dT8KX1%;UD+ zC$$Z~p<&^mq^2^fH)1ueud%l5X;2%c@|uYh4e9672+YD+5W)Six>4)QR}2^!HGD7(*IO_^2Uq(;a9G;9+L8r32- zPaupsItlJUj&CRWSV!@wp0<^XMl1ZSHthSN{q?@Fvb|;mqVsDsAS=JO8SvWqSv13Z z8iRO*O3uoYVvEU=zRLH)!>^upX}Q0ohI)2`#$taxEem6mR$1daF~NW11Y0gFCMV2% zyW=v@+a2@sZCtg;!6WxU_@GIaLKo8GYW&?UxS z8a=Pw&K_xO5dYHH?9=%;fh-8Q9lSU-Zp? z`>$O1ZlBh>3*3e?WC_O_o8pQu!`L=lS;3jiMO=@|s?y4)B~87}fEwrkYHVRqT}ENE zI@c1`@Q3f-6(-mq{X9<^I4+7n`NA@rW+#*3?!4iRPdq*aF7&9sbX`%>LW65Xp&Oi5 z;E*DNCWxjveaTvqJ;McwpqYXx3=ew>X@a}Qyu3KsMi0r^sRLYD)!oPCK}%+{S9#P1 z_HW~d%5Eg;y2(yDLwDQ^jT;YX(K}hQj9Qv~sllttxaFY6=WlypIaqs6!p$A6?je9O z3*J8P+5`AzlYe2B&(@;f8qf}|@qYuDWu4IIL=Xn4%e||oaxsd{UR-@;V&5Izx$c?k z-;MhbSsF+v@z#ui$s*ymFtjnzGv=n&iQ`aIGWg41cu{3l1`Fl>NF5Ic%e3d4tno2l z1Ne0q3baqDTw$soBBQ`~xAs}GDGhJ+S!TP2Fh>hC7O|#0=IVcM?pml1Yi(SV5JgR2 z?~S@{Vru%v>q)b%>^bJnu`&+^3G7fjtf8voMEN(YosFo!*^gf0-hll^(6`-fRL>9JZveim^V_NA>! zNKjDJE9?5J(EISyT-WSIoF~?>cF9A!v)jADb7+~Nsn?c{aa>#h+4u1 z=kZUZ$5gFhXe(PEFZX@Cb<1$_Bmmmv;+V>Q4{%DT2^Ms( znBGBux;x^5>rW%nYqp=J7b#wP+VjEo>HGzbiYZ`mifA5~HJ-ervcJn|D~elO0MdJ5 z&~}(icwW}ZrHS_XOLhQP9{m#X!maNl0zQF@@?VAGNHlwul`;9a(W+&iE?E>+*nENN z!3_F(d=q_Rv5e3dLH^5^wuDoRcI}L0k3q4 z09mMPVRHl_ETL&9b_x2~PW%lKaPZO`aNJnEhw(kUFyK_lMQ%lomUMDr9OJunI`5X6 zwCMwpdg0}fYY~hX;2%zI8R0)rrPX>`y0d=Sr|tAn_S1}G;$a4_hvEURoc;F3d8IeL zK*8IlX0D^|XT`Nui=d}k;CyzC7eI>SrWY3F!P4Su#WF(9=2p$6nG_lWnDnFJYc@Pe z;p#PMCKNCE+}t#nPn#PEB8Hu~#2SkZ$`@(Gcm3J4=V7}>K_qwU+j}Gq9#C@oAtPv^ z7zKUN9+kn2fuwg2p7^KVm1^s%5XM?mG$m|YZbIrF?*rq9Qs4MS3f?&-wSm3z7v6r0 zn8kuXRwwF?gYuDmm*e}v8im$wLH?0!tgCgbY8h@Ge~P z6B;!>5^U5YCnsviPkwIUktjG2rBQ#CGvIGg0yF@FiN?UP#%&GKd6jkh7BhJls48Z; zB-X)#>%6JIlON&FTrZAZaU0THz{krvi24f;royiK%3gl=UQ=*z|E^&*Iw`boxgzs` zTT?qG&D7LM%#Q)M$hWrPhV%xQTnT5fT4h?M-7dp8NeI$b6!~i6vPPUxyTdD9?lNWb zTrG^2z_{~>hP#`gW`PA(7T7>b8G!@}3{yY?bu>(saC->hhAGEd@6LcFncCBwV3@jQ z`sWt#v6l#%EL7lfu!I9>R5zR!ccgMQBIdp%^$v+qjRf}*@cl1Y7qROj2Xw% zl-2*oY3dnnn&OvcfQBe|$%1tS)89^O10OiXM&mgTPOWB#`1;~Vt#-=dkgeat@bXTt zo?^C`U`xfHxi35esc)zXb`?Tuidj!+&44x@>?;25R7OL`%Zkc>Ei2U9yl@gI1t5Vc zd0-5~NucijmjtSl%iz$6@$DCnkIcl$Sp=)e78Ma2;${w(B>Q6z>}YuRUd@+2{`rn;uwM7ZlbL`gOQGe(}E``rmC4|~GijI(3lk>60nlT4BiRlXxzZyt? z*CF!fFcn@scY#Cgc$kWmC7CvnzB<+%9@4Sg!{Cw|U6c3}sCK;qE`R*-XRjiM9*t9# zRzR+y2U`cuWowNx;y57JXg2kY4vok%EHsGGYJt$8{R@NW<%eg2If@+SV>bQPX|#!)Lv%k-=J zpW4DLDtP!ZXr3}c<5G%2{KL7eEp4v56x3d@d2K*~W(&09`U|hzI-w`(>NVd{8kVgB zKX9EUm}18heIv(JB0qL4ol5D+DzDM6YM-T3x1A%EkF*U!VcXL*7BVd02un>+V+?Lb zz#b_t2HTymGRq^TQvEF449E7(Lg`PNwJ6hvt{v9 zT*Y6~-jn4NzR7r&Wr>dbYZ zojoe6?btc?IS*^I#QeHinktX3=Vj3me0n41Vm}L6;g!&)*4;6}u(XkfXGMlW3Kr&A zSP$<~=%if4TJeOG>F{tfLM;RF<|^5;DD!e)5sJ}B?)SMF#RuVx3b*F{VHYk&QW=O* zwnLhSBVK#R&ALZ0ac7ujK*zM@9nGT7J-YeS4cr0R?_<(#5fj@vP#LuR1>IhedaNK= z60NX5`twHosyCNE<|CR=11(USAGZ^5l|u~5pT?Jl$W*s2HN^8CMS@4IV7 zc(@HALLpqJom#gjb5Tb@=Uao{D_Y=@wJ`q>NS1{1aO0DMk?vq|}h`jtuJi2M7Ag-sDbE@LXM1X4(K?v-$D zcf@+!&{6LF3`ucLKRMDey12M- z%alg+ycG;j2?vZ*FMRZkH(9WK-C7mpqCx%~_zjSN78E%+csffRC+HdN1!EZ>z{iv` zYb6}9Wa*uD(aj5&EweM&W39PvWI1l^6sBobSAYl5;)Z}{TV-8o{+nmZS~u{yfbh}X zD?plZD1xr-&I2mBTD5O&@1;MPjAf0%VOsjAvWSS;+RA|^hhJZJP-TBq2LM6_4VB=- ztNmsA&bqa9!(z`veUQfl!V9ud3&Bu8e3mfu^35~Qph!6a<1ADbE@i}q7>pTGLasL< z+qv$I>o&|cvZ&JeB%b#jXsfD05Q8@-#Qc0pmS(kckvXh+yifStUY;ZPMxv1tTs7@e z#%sgvGdn4%Y)7-1eDgAY#N_K%dA7vi%nShOCPFkRO0W++43?1L>!0wZ=sN;+V%9RJ zhXMmLc+8137WDG&!`BTHrd;9{yn~uiS}o6du`JmbugiW`9nI-JpWQWWnpBwdVJ>ad z(1IlLE<1_P*k8`;S9KzzBQRvpK@?dKmV?l@Y?4jC_k|PfQYHClm*{IciVDK>vecFB zlFgH1-vHM(h4?wN`=dkd@+1AcW@G>JNAM^(Gp9iuVgbYONyDD?tcLe zSct@>ENdXCy&vC4e>J9=3`M1Ti36f7yLhpE^?~zG?)(+@(wx49V1*rXuMI8uU`0tE z$GQv-NBA)Vc1Nd|)9O{Pp+4<1z)oFL4LxMMl|lw#Q<|AnROM|W?{T1&CC5+7TGdTH zhmP|voemt?H*JkMUFF|oYR2+*Uz4l}oRv8@wZtbTU+w1-&=*{6N&6+y%)Y!Bs20{P z0eRu&>91CrIbNlR!jf1xs5Z7HL3BhU)D;GBFk2jwP;itMsuFgi3_Ogr+zIs>IMeW+ z@-nZn-y2_2sndR~wy-OkP>2{BzOWHYVK8Wg&D^{nR%u(A$3%`M3n)b}OL;@yTMu6> z;&_ouiN_{fkIVxIDM(VjW&gCfW*_upq_}FX?`6L?ElO{Xl>uhARKuYC*?{c#{<;<2 zF6ZR5S4dCkG>~hk%w6^=Akj??lKqJH{fu@wy1NLtHH4aEY0XMXN&3FD+e`m0k@IC} z-R8qf!`4@;`y4sAAnNDa#NXT}=zK}|^;^dbS-Zx@Ma)K1g*O@h0bP$`h411Sh{=pc zw`UiHc}w=RK`plYFkf6iF!vq~Y1_xat#q(vGO(pJEX(!^!qJh65yjCu&)w4#yxvY< zvaItL9*MYv>+A;oq(zm9rNGx=KHVSVQJ3D!OJX)wp>_Cxk3WN=DoI-vy^x&cWCwdz z9)-Nh7Ac7T)0dP~(OyDH9{jhPVni)gdpczUGP*(^4N_M1)f@rA82o3;m=I##zCp9_ z^vdVY74AB0YG1}CM;#Ro%D;7#pu4(#=H8W!&T22}2=TnDvCaoa>UE+vlq>2h)Lb;K z%G!Yc%-rlOjTDT_Yx%2IdtLl_dgAA(wQ3D zSe0wop>6kM&~sDrr{Ee53bHd>^K4P6e1}oL{G#M~-sdKB1z!0g7!gmb>5a zR}!JJr(3VE)!q7J^9c77iY=4d;@ihoY#fM@_I^+#Z*zK&io`u0;kLZv&att14P%EU zQ0=c_gg@7$YJAR9@Gx5VxJW3Oao!o&9j!su*DN~g#y9W3G$Cknn?&)1VtF!QgsKD9 zj-PKJK8wh=FF;~KP>AL+(wI3$kES*-^qF&9|6eG2jr*Ksmvjr!Zz%f2XJ|^} z7yvDlZZJ!ELK3VUzw5=619t0CabWe(OmXnlI}^)-9p)6}#t$&#%fV3jR>6Ua6^n`N z)-o4Wk#QtW8PF-@Ex}pNhIx;cHKdWTwif?j6eL@XM}Vge7x&E7_uv?);eYBLq9}R0 zO|ZY&_s89i)t5Ldx|SCwETp08>&}Rqpr5f3dt(k~QS--%zoj#)Uc9LElnYx2%qoCB z`18!c{EYpevSLj3v|(GP%}N8<&1(XBY^8d!<}Q!7>y+lNLbThvDJo39BLbYZJmdE> z>3L5?U<-+PkE(8~sG~#suYb%U6I4uK^ZD5N!?!b_P5HL0yY()d2Y7$6+moBV5HQ2o@8WzKd4Kyf)Wcrf zr^xv-=RSJfEmpIxxWW`(?nbju7S7UFcclq#2$k*Uh|^v$AX=Tu0XXlBj#rK+BYc(=w3-AF}jsTRH1?fsm#B z_3x0S9A$?KSxUA0yts^&@as3!HY4u6WDE1_o;iGyXwI9)xZXj4_qYgqe{cgrwOmKf zdyqQZ@jzbfA|IcvFvH9fv+)~Qn2Z7#vs&!bT+<=rz*gJ2Ka?8E%1Y*|ha9L^DWr~T zY)bvJzB{K6el+E&|D)946kt#8CkGXx5v92+RGPG4Q?>qcAO~DFe7zGd=fkswZ~kJ# zep)>L!zY$*GBG$a^h03n zY}=zj=t9`r&3pO1S2b9<+?r4L=Tkz&qift0`IRk$yXEM;qd9y@VgShx3dD(lZ zpH{Pv@f`+ye%z9dNDAMSqrDte{qj;zWtp_V0u> z_x}a>EbaoICctzyg4cBd7x?BBeD&|0P|zukDd??qNv#!`x+|id!zrvch|)+hI`DpX z5A(mfhurV(k>!MFak8Q+OdBw!S3$$O5Y3E2hDDKFgVYdvd>YRK7w&|m_2WOpw&>wXVYo1hm%)Sy8r54%iA|Z{=Zyea_(}Okv|8^NF?}j8 zkL~C9v?=wE(@(fdX^zpXF&b86UFu2Ir1a^?4!}V-!z6qv^T@>XYkd3L_{CMNJWbvl zO6I_%6BX0Y_t=DZW{Mi`BNDp%I18QhMVV%I*}g|B-c;#>HAH5!Jrg1BMnA0xMBvOJ z2K=b?O7rLOkoOm&TJU7gLC^$nv#cO-4xYv}HkHa=$E6WCL7v6g)0+?7fj_h;^3)s5 z<_Ldk9A{#|UwDSsR=QIG3Z3)>g}z&mVpd%D7aku^z_HM;VQkp{Na#2JTj)32pN4Tq z^VyuWq}46F;F6-RcXP*x<<>*EED*;!Qo~Nd{=)8>V)&n z;Cz=ZQ}nN&jM`4uvI5`bbO4iRC2A?mdRrfIJst^sm*v2BS&j2uGSzLvXLv5bWXbSW zp_H(wcUPOQgJ3@(u0E?zs4-|Qpu|4)L;QyDE6blU#w)`SjV&Ywa}@ItU66 z8}JL2Gaw&rjWypc6usn-?P+%NU?wk})cP^}bF{^o>G}2Uwh&BQIHp_7gk2bMWD zhTLgyj=X>IsYKfI>}|sko*WEmXVZtfTx)?~GLP1(UnRG-9v7Nxf1ZQ`21s*1I_xM`t46B6V5v@&H z)HL$UVf4(T<-MYE3Tc2qk7+a`vR7aHdPM6VoMgNHR-*S?x3Tq#OThy0n=1-dg7RI3&mB z_3<>0-703o#DSTEy1`~??@H6fFlW58cv+*cUmBGd^(>6d7t0Va>8s(7h{=hgfTN7D z?pvEhHQEqof_+wA-B(_*uPm}Jx35pC_a2Xonb zW3(=(CINpRXc#{&*Q}XhqAROm_p27lYR6cPj~;EyZR7!wYJ}=5%Ydl*68V zPHt7SN^rSY@I}52OITQI2_tUyBKNC@4#ymM0_JyY|XT3)BT;TY=)Abz$wHo}-ej$8WSC^5V() zzG5^}3Sl!`NaL44O}U+ZU_6mS5%Tc*T-}}UQ33(UkZo_GPUL)5-e|_QY93AYfoJvE)>BFg`n>IW6;3t zwpO?t-UNo^@}Da4xN#$=hOGc*_z;cN+B83LFQuN5#<`aak<+-Y0Zm>#>KeOpe_P5* zLD#4d<%L5vC~~l0hEJ3-oY;q$k31o>6?cLjpHxN;SB*=)3Mx+-DC=2=W8KF@6rvPL zs0i4i@UD=4!vl+|BT2F~*ZLMtQl{}*O^4;RbR}`c^`huDW`({H55V>T>T5cQ*tpX| zk-ny%nO%EoZ=J*`s{?JAg_?#DdpAeS^O)Ms=_!|JL#IO);>HxJ>;2-??z7o7Zy45& zOaRieE@3u+$j{Mb{Lrr_UYD)x357G|sIq6>f(3@6*^8nAb+#mZHJ&l~ql?6B{4h?D z%<_c!CW~Lvq=b?-Mrn?R6z06E1`f6rL7W1+TpcfMO#KzjuvVVQ+Q0C4>KC)<%8*HB z)bvxs@`L8k^`FIitC{08@h;&@sNHbn$c@)5i6V~V_@Tot&C?7ilolsDDqWgWW&DN| z=9<$Kjt2%SLu^F>NB-B5WB==|sXN2sylla-8}hyRj@8uf^~T5Ri!wpKIP*~CX__PG z7wURIPL`oT_vX=woJ?+7KdQG6=#eLlTc~0Orbqc$dD*!sm~T>&=AfS_B zk7wUJHIo>+gg#pe;e;(ojpXOg^>4LvzPf#`J=EBa01iOWuTq*^n9uWDUE7c;iqf0*@)j;m<+u-6P3n%Q)VF5*&QqmUYOCJC zE90Ovif_YfjD*oU2?bDv4ksH}#Z8tD?#F+34MaqZrF%B)&#s{k(`|;(AX-u zbKul6!P7lIOD^BzKSy|%-BN|oQXMQhYWRBP1u`;s!tbR=<+r@-_<@h-jAy6m#es=y z*dH7oafA368HwWdRQFQl&*@ikg(ibH$N_nChQuAfl5xMdA3js{(qj|Y`x5lvM{48) zXA&+E_9N?Ssp|2VQCRgC9(B&^Sst7s<3b&3!r(#p?D3#+csytb91j}rf0+C^XdKzY z8-V^*euQ6)OLpD8M{rE>4|{kDG+~zQNFS~X^x>s>?w?TaW;Ma`Hq?`SJoF#q(ti&c zDNR$NV9>Z8Zo3fqK=?+9*A3Y5pi%jI(6B;U(%ZbIvo7GAN$%%pF^A9p3cDn1*T6{4 z>JGS%>X>S6RN@r3Vl9izrvb;EB<=C>#_a!I-^zjY?LYEx156T{Km&bWa93-`icX3~ z<6x?3qeSWT)`4m_c-v zCM~O-?YU?^GF@T~H|0vdv8fbJR@VLanf|Wps}v^<1GlB{arVF?8_Xp5-WcTxGVDtgHOf`Su zJ=8Sygpr{(8CMmWz}felryW873MyX=w65E3d%Rox=Tgi z=`iOD%~@b#oBL{z*C5$nT$pjo(u#TBWkJ4^QRe2Rd*47^o|1ctl80$2DyE`I>C||W zvZ2Z^r{2hN;e?K|$^EC5aO1{l61W$Ww%#{^ukiz+-E@oh(!L96rnIOKFcV{M_ip(i zZ*I%PY1PzF$S_U%d?;7FBqG9s7v1W4#>^t+f>o(^ARP`+*XCkppTci>gVyVVV_|ga z1f`;6>4r^gH8}Iw-_bgUOrKP6(fhezZvk%na_lEFGmMZy^SWf8-d}xl-PGusaO1o~_m3sXrf`Rc zsEC(NTn_c|b+uWr`2NY#J#0$RWX@URhU+>icpPN2;t|bIj4Eo)L#1F^22#dAY(-4| zlhLQBr@&KeM1O%AjlzPXWn7UA+YQa^vAq!9=gaIBBGvkFpworoy zM*XqUl_4eQfy$-Oevc=`sLA9qPPa?CAotN+5cNtz( z&+|`{aS#9~$VsU3ve=Kf9;L3HU?w_@Q>M&wad7_Gb#4=CK6z*_G83)7Qb&Ng5Ydz* zsa}DI@`TEq()JiW|AB-QzZJHX?ZttGl%dMXYK$L;uge>eKf6VA{=u>iHPh*#h$c9F zi)J$0z`7L=0q4%ov+^HJuIdud*u0b6bt9oj98k7bI|2Ok7?Sxazhyk5Dq)lliQB z$Yethw!OM7mwvt!3!fq7O-^#n@({;ZQsvA{su)xbr%74Ed{WFE4%-p5%W)IE*;A=wi>LJ(<^PVW)7VG!n@*sURzu==SRQ!=-5QB zbCv3@RfXls?%IWg!T=LYNTw7lK#3hdSnVTU{n&q_FJN4LgWvE#*wX#Ch3Oco7-zVTnKD1jrbwJ(H$wM%zeJswH z=Siq$c4t6->ItYJa6nbd41K6Xl#M*D(jRBt3%(mxCV$#4^8KFOZn*raGN8l{8=gN% zM1))&Vo8>~E%yi1pX>wN5)nuxs@24C;Fu#WVx@xju;>+`~7_19;@%gHJkLPr=@ofv*fo&32-{(H(NnDM_ctkIh8 zG~DYgMV0E2`EBP_2z_nEj78Y+`T%9T7v&=U7S*)Cc8xFv7t z%#uViE#iB@)w*nyj6+A%y6J+XUC2$0&1`o9V=6|Yfc2~5Voe3{QkO#3tDUlYW1#5xu;PTX$uWR0PAhW- z@WsomY~tiE$5`9n=Hm@zdf#z2AW4SX#S&0hv+q4>=#FYqNAUG!M#mOc#UM*p`<~Z? zc;WSWfh*qh&}tmHuEn|YhzhCj4;9jjY?%q)%1kw-nYHyz^L=_{<#k&=ugsJgvOq!V zy3+u`T5CoAz~qK7Q*;oqR2oHaieC$>&c zNy62fz>)xJ(p*u?`2DeoK2T&H<>O`B?$eJ$EN8_Kz)&MvsxF^a+ZXQ5a)j_t48>23 z9>jaFn2%|aMsZby&XxB?sr*P2rj0UlC}qIitwp8yP^hA}>q49ga#U^yd}ir<=-8v? z>E4gkLUkw29+>{H+9r$_X2t8l@8Ea?Kw5LdSqaA+RvUHzucLqlMBc{7 zUaYao>6Xj9Fq4v|`H0&H)^d^j&s$`HHmEGcL8>wEhW4{*W#~lR*IVrQ)K@OlpIx3t zs8ctm1cc36e!d1maTTN5t+%%?NtJ$(z{iPcI_i5qzzeCc;{5<5>&dt6^r||3@nR1h z;%f?&e#g!(WV=E|$@}Z$(6c=GFx0^{^K!ALR*hxWEPb!Ejd z#W+m_quc6U3Wfh%KB-yQ;g@+^1r^PKh^qAX;F1NXn7Q-#*e)5__bFoLOI*g)B=LF< z)~xMc?N&Rsx>V31hnF0OSq;fri$_`f$iLi4bQ_W|Y#g)0_+>p0$&t6Y(DDtSn3SF)db#K{Neo~4O&V)vK7d)8{HQL@i| z+R_*sUu8IRmb+IIrF7s}v(**;$(J?!?5ZR6}g zUS?$>9NtB3c_O5#-H|q*RYbfNHK9xY+y2CI3|zHWd4zv0A2uz8lBfvjAGt?DP_)WJd(loU00q;M!6QgW)gE7T8|0+Zg%(siQdt98Y8D6~b0DaNTRoOUo)c*m~!L zB2N9^ehf#R6F3{qf!!;N?;|!0#{TPPvSH79HeOf+r8~C@7 z2D#Fo1oc|^zd{-hNFSDftm#1E=Z*_qHN@!Qyz#U^4_2(Nh5`<&&?rXVkE1FteDYJu z&WgKD{_*VHIl_&l#E7>hbcUy~VsXt(q(j@^JT#~h`G3U*jVsZ-$=uTjn4laFebeo* zrg=z?m8d{dRd~fgSH@+mNRcL2r9Ul&WB1KAb1~Q5ClPIf4T${S9qSY>;adHnw2XNF z7$AOfai7*uY&c{>xnU0bM^vklw!WEO&wTT9DcbJ{*FQ~j6*WOOh@tS^K+rzPA~Cvb{_37ju9ObCU*qRsxsD7KkF}>I*jKR;JCW2pz z+c*~@2cE(fWwcYj3P0aiR3Cl?vkC+y@nHIfOD6eU%-`-F9ESO zO;cjyg5n6r0Jf|7AfW+5ha!c~FgnlaR8^G>vs7K{fTxc+&l0gR_)R!2CqCKK^12Ap ze}e8HEBbW6&D5Zv+xCi2W*oM&u#y-DGw&HsMZ?Nr`jSi@QEsa@QW|d=&po05 zS*zNruAVL?mOMY{p#bj8@W0=B&0Ujo3}RhR^NE!IfqyLpIeh`c*VKBpN3Nza$wRiWo~Ce<zD1XB8&E$k0PuE2czPWFX>C+{lZw+d#datUi z#+WPTON>Lgl?;>w`<=DQBT_XL4k!RnK4ON(gCJ+huzODP+1FduEa)zWX);H{v#VZr z2J>rF#D~kdvf9xq)(a-`KKQrY9PMqTPW!xR5o?enUHFagm-%mmf8i@{va6u#ycrj3 zV$tLGwBzm;npoDyQ2Ty*9lmK-?-9Llv+A?;-#=1E~(LB&{X z7?2mhDF=uJ!p-h>mMQBJCfoB4Y>Jei!23sHOVQB7t2g+=uU#3lcX9BE-sb-c56?rS zs20VY26*DnBS->GPV|Py$r0F}j+0|JNREU5l^iXXF*x0t83{M@*#9O+-;rbHvD5R+ zXgT*ZhDEZv-`!2w9*@;QQ{40;hHkv|mSt*s%IGs&{G;T!8Rf~&Lj)t2kZbFG4!njx zHqTl50swH^kLOrM|b4{r)@ia@+l&YWV_@$!GHRnoQec;xIKZ^Q2AE% zXx`S)ZtwR)o^cG*SpOIq2{|h0vi#9#Ry=YK<2-%76fVV8a1BkI$MyBu!j6%=#*<1s zYdoC&>75tgL)s9loF}7}&Tac2KIFvkA@lPw$)+T+$8=v^w1kK@n-H9dE~#oe779ED z<;&&Z#@su#jO{OPb2V}N)lHpBN!MS);URJe_CD9EQ>ROT)DX4#D0!C!>he{)o@RHu zzf^pvw$4L#PXFQGdR46Y9>Jpcb zkALx15pfRKyE`T~#W24GsWHSz%!CnY4fBjZM=n%Jk!rk~5ySuH9z8AK-4ru0^cNm< z#mFTjHRnrGPRnF@EvV>RiyOYr+-i`)O zK0Ue>e=DDka^tn7rb&X?g7ZLr zlxqI}rBq9s>jX+QLp;~dmZ7Kh+?T|iHk2_%Cn#~<6&}8OGrv*de=F6zXK>?~7SLiG zxk78yT}rf;^8nUZ9_`#yzvC?U3HD5y)$8uxrckn`N?;0gduykBVha6Fh2ik88XeL+ zhQ7Vve^j9z;MxN&GaCK>lNsmO|2s2^_j}+I0*PVua-zlhsK1Memk2NtkIDHu*)SS5 zAU`cN*@QVQx@X#Ue7J(4K1K<(Gv1;%xo^0fZ%a{jGWfMW zX>;-sYaFxgIx@YS+cOP+dINW1?9z65x|sKJ&Ti5W+!%MDh;Xt-RW#)o9TIKn&{gC1 z$7hE@iR8*G?4!`;ht_Hl967*4nZ#*+|y0)vwuoLPcwIJrnjc%=cpZW#-I<3rJTfL09xJBLUHfbWnETR^bF^yCK2zaL92~Hdt&cmNL1Ge~eR)3(Tk{r+% zRr-y=F41lc{$(QflNLx|ylNC-C{Bz5)wIax;7zoefP$AY<9p&XX({SEq;>A*yE)mS1uDQM%5dTs%nt7*T$aJI+HnWi16O=;q-B8qWL8~e$L zqncB(7D%QsQ{$3pPk+{&z#g$lUJ$gU}B z!|490UG?*PZ{rW9kE&2Bkh>0Zz~!!OlA3WbP*sdCYQF9J$Lfd%7pQC`v0ujTwd)Iq zbs4fCUtH}P)MXw>7&HH@%Ya9(wI$WqeIK$Bbuw@rWYBOP5!{AVrL8)r?cule_1%=o zmufIES-11#_!r4s=6W7|M^OJW1quonzo$UyH!D*VUo{;N(#A#F9_~6`k5Hek+yyPC zfF!hW)4p#YEW4y)$jB6I>W`#w!K23Yru)M>MO<1&3R^gCgu4kY+TsRFIuxEvR8|58 zi`z8vlQI8c0i!k53t0RrF}X6ti^x;NaSs#Xt_$HT{$sCGtKHV&>6jQ4T=i@RfjvG* z=sA2f(DL_O+Ab&yaymx_c=!}cRWVFW}c#?@YxGkI~H$S~5Y1akoKBuN$BhP}rJp zIAtA7P#Sqze%z}`l3<&y-l`#xBO8BgMcGrysK?+j{>7X{YZ=GsHC62fO}VC6pR>i7 zVEdgfN|p}tD#Ec(#9TxrrQhWo+%&|vE@&ry<1KJaC?zkaV@lDp_rsD{BkhAJt7(Qw zqRFmIv-^nb?{7}1Va-vlaR}q{U0I_`%FkZ&%|F$jXJ(dk1U_$89qVNy6d{xhq=35F zq7K>-E`EA;>#L8XJ1izp22*NIoz3@Vf-fE|4i z-O`R8*A^GpNJ%jnW0Z_5(IiQ9y16NA`usCC6E)TvbDIjF$%S$VFZ0&3R=$RskhzGBlD);rza`z7`g4)UaPfUr{uAqdgPjJBQmtK& zG0>0q*>_u%;%uMM_vY&%BYxS*HKdGx(kiyu;t4E5B`6OOJ4Rk8m5)1J`ic2$M5iD3 zifLZ1R7SjN@HB~fQ_1+A5vQ^WO{(^V0ux8_x^ospDLZo6b=Do=Kir@Xm9DiqIJKr! zcu{N3JoQA1wnw>7X{ODqphXD7WiCLAFy5n9mw=xa*n`RSd3Q|!Ylhsc5D zYTwq31;x*MEDIu{jqUb&*?$t8h9@|oFRJ!4;ogH4;@^X1{<;>bo{FS~99L#;Wxf~H z(!X>p^THnb)~_5PO{a0v50YikHkW5**YjZ|4i6{wlm%d;T>FdDPGFaDK);y(wEmJX zIU)I8(P4^^c5QX5_q1gL0W4@s^nR2etYUm5ox(QQ$<&RO6O!q7pAiOpwQ!;&eDQG|UW@IGcjjR$Lu~BMmS-~x zk0R1#FR@R*YwFh9DBFoaCKY`v)0T2X)8D+C*YS111pB2|McEu488pLdRl*iOK$@re zcu{wFCz@fg-6(K&FKw<()1Z7eIfXYZghSo$dRhp<&%bW01&k=4brN@L<(9>w7{a4a+8|ExTjE5`93y~wlrf{(QZI5d%j%i1tuv2 zQ`Fo*R4Z+dynfHaZ-02GKkbvjAMsNo_9Dx#AqC(S3Sf(DC3sA7rWO%p3DJy(ofCzv zUtgXrCV2zCo^_heRG5Y8x5TBK6rk(&5byV73g(7Om$iNT13osCOS4qf%N$bdkPDf9 zfRf1`d!H;R!m}1@^PHormk-Nr4C#wV9>}YyD|-ejvM^0(&|kMD8>keg3jRE4Y^`N5 z5^Cw9EWYO?6xSin)`y~c>1F6W^Fv8HM3qA&M9uWe9#NR-LIXw2%#U+z9?8YIIvBm1 z-tH%^y1uZ`nVjvR2|yBcZ7d`oRGvIwLJNo4*77?&e*8FBIeVRhy&^c{*6&2*@N_6M zT5xhI(9$)I#HwF@{PZ5p3+54ww{#}N04mH5mD1a1(m14zJ961fS9x3n*1Izk>ZWC^ z&p-8{N1K<~0zBpok;RiPn9k%HiS)r^d z)7^)63or@t=rC={K2`4bE8`~!a7N^F@WK}*nr9?9>?K!Vb>GEM`T@{_j>RG=!-H8! zkMwX|oE~nbnXBl>@lY))EW1Z*0bilTDyQ1<3Ubn~HIt-rM!mV0qUIqPOpYv$9pjsIh#`sj$h>5a-60eUg9E)v4 zP=y(ebsDxnL49TJDFi3ulU{|gN^Rj_I8;6s6nd!gA!3cSvxQyRhM*g0GG-BD%e zL<$+4BFhJvA2Vb#lg+a*6T$&~{M9#umo3 z>(F2IiFr2zUK=#)!nY-*o5?7;C+n)Jp6VS@kz%X#GhWRs58p%L+JvTPt3G`AFqAd8 z8xsxSn9Iyeo_4O=OrA8W552^z(N>uFrRBS2HA=4lZ};15X>%xdTIvHTGAf^DF#9eU zJ3CwY?)s&{2L92S$t|sl9%)jHeyc}s*h<;-H6U-_G~{ z3CFbni+u6XaYddn`|`yHa`_nWTO}{`u|@~nXi-l5((UNuGm$^;w#2t(G^-5?vevwL z&LKe@fp_`AD1{|KH(-H!nE*Jx!>yuP9Vaam>!t{=P=8>=5kXi^5k|F{G}A_l*{EkFZpKwgHzyv8ip=&^%tR<#w25h@ z=UfXl^LDr#1|l+Gu2iJH?M2RM&AE#Jg$uUDo2fjId3M_ZH&cQPOf9i>-#PT>Zv!nz zb#`2tOdez|4CV2e3yOrCeU}3l_10u+bW&mUz6#X#tns->7TLiyvL4~%{EfSS3L^14 zxLS|)j%g9I9j%Y}szh5I?c#Ddps{gg2A&o5xdkETcKaME-gDW z5gemYBXmmUC9A*D5D9*VMYSX&Ta#^7Tv9k}xjLzF2!_83f!Rxk1~xBq$im{Mm1N9A zL=^}qSrgDKQIQ^6I}SBU-aNMF93h=cywPQVUhRo4mX*zmvPm1K`EGpO-F@iQH)Po6}gh?9`Xe&W)IfgnE8AgL$mB+Gy8)SEE(&~u*wTws3Y{ivbXw@JdYGi~ z{9%wtuWwDt28Xhm-9xSA^7_CogoyR^=2`&@}{s@+@o59gI+N>oE6O!bV_SbZox zm7Z$~PYmC=@W^Cw-m{R)+l%Xf;u^$JTx3B-R|i=ha`HxTq`NN3sz_47#6PM-`XFxV z<%5?il||?H40xs4MF`7%Yo;kwo8o)J1d>#KIO~fq2fGpqkDmWDuFyWobQ7DGvCeiW zE_rO9ek-@yIn@ZS8k?t^9e<=+ph%|@_;f^=($g=tKcIsi?Hr%A5BHas&;M2 z+8Y!D+ZbukNwF2z;tIy^GHgt^U!k3S=HpO#Atn0z%=fd*Mudy2& zg~q-0sPkafN6Nj#Dj~j~Glv(ZbjMz}dVF*yasYVYc;c??zkA_1*#AT5!Ws~Ff5VNZ zdbr9e26nJEPrssLW@(-99IKh9aE5y|cbJYON0RbCEP+m#CAX;b)5juS;>a zL2zP`LU1P*mvl1;L-z#bJR+6<^wd3?Nzf2II(*ct|&GP(( z$hrz~@bZI_e=H5-=7wxROAf;WtzGdX>u+b4losCPH@?fJ#hTc#crwU*i4otZQMgD&T933|C9?1N}IbBTgE;nY(UZ`ten7)(zPK9@o*N8I}6 zT?*cBon{IF`%!Qkgn`>2&5N5Sq`6hu2sVe}Um;JfhZRB}r|2t?erb=ZO^jI$3rTgy z+r}zz_^k49Pa-}h)B5rl;`#VA99#zRt&0VxryGx!*@6-?g<$sYvMHzDR2argTMXF; zV8zjd4^UaDc~4_QJ#l=bFyJF)RrudB5rmnfvb|XkKA?s0x7J@qGpu+#zJ(ZYD$EPrzJa{)8n5>+?o2*5LCTnb3JXg}zfcvBF9Sv^RV&?Z>x3-Yb4pCf4 z221MUJSp}7s^&O7*}xxWlhSJD?cyz<*fUaN(kF4~hBE>;yfV5ilsTr0K;bLl7pBfU z&}d2)C>xm@a7hrEtyA#3CHc`TD$$gpquuA0#8$VAwR_Pdr0Ksg#}d}w$UnBf6bW8G zx)F}!ZiEVW<@gQGkSy5C%4Iv6usZIw;qSB!Fy4|zKP-~st(8C*H zlXP1;!D8<5_ezo=U3j6qG87sQ@gMFiHA}gj|Z=Xi2I0@gpcH}i>x3uE}2YeW?siIv0ovXy1$2HTJVS@u}6DwSqfFFgYC(d>Q|*UI)4=} zG-^$9F;O~0`rlQRht!t9!xm2D_ollfqo~3+FwLRkVj=5yqhAGg9|R9txceafwXH+e(t?V{DJr3!Cyg|S=VKl_g52B8Yv4xcD~?knb#aO$EZ?hJq_)d{|*qp^e>r)$QA3MaIr(4$Z`hUGOclO-f5_ zjd2OA-mD_9R>oi1 zD&P8a@6-ubW|1DU9Ewx#*n$Mfs7F;vQ(ShwWna8k2(p5w&1_r{#RpD$QUbN;`?OeX zH}t37DSW0WDq;)NsUi|5w>AZ$uNV&JP5cNypuiiF9;5DDQ#eBs1oNl@R%evWQ3-)T z^69R!H&dE&r!YM2#h8mKXp)I?6Q$Z| zp<}1k!(C`M1&6WxbkTI_HI(mj31#6IJQBAm?nsK7U3n?Q=i#>ek?Ds=Hmdof6gxUF zn5Ur3(_d$Gc9Yf7;Y}~&WDWg%=~mGNNTZh^mw!@3rbBjm%s;-??pYmcOQ9rD;nf+m>dtHHP0W!0j zdUV=(F!qOlKG&(qZ?v$KNY1T4xQC1soOWC+?Cu3#CUE4BYM<4UzEsOm1Tor9AF?}B z7i52!S%ePh)OP*t$qbXKrT2?$Ji|hi=iTao6e;aaS!*mV)p3HAT$YZS@z>u`$`Y zhD#Mfd}BtpO2;}V8lyf32WSSI5xh$xJ$dGdw<;s*OV$7MrvVWD$BVbHAdDjJ5L}Q3i8N)9z9N*s*{b}+az$l$UAHeF3gLgVLP%x7l zYX+;n>yWs$i54FBB$PpnE|xgS!wGS-as6ETp6mYMSdmTz&~lcVy1?m-W9L zSdn@cpUvqxdDV6%g7}%mKjLTowA17gG)Q~0FXKs8b1k6Nc}oStyj4(BM1sLUa661j zyE5w;{0@V!l9)!Jm+0B7wDST{NMyUzWwcLPaaI+0=!!86862<9B@7Dym8MrA6&5^U zM9noEvK5tqipt&O%CC=^a{{7Y0J?%42ajC#ZLL)jW{|eTuXWSz?eC1b7a8s91ie>t zEj~&Sq3u!;B&uLR$fFu?zv1voxTsrCf|?E!JZ#9I|7%0WnEJ1V%#@Z1_#fBvFz?l> z@exdM@-S6%O%bSd78aI?D;?E3Bj5Z%F6kRMxUW8ES*6V31>53tF%fhA_IQq!1w@*V z@ow{;_(;=U^LvbOt4Dj7%~n6LgB2IgggL3nBgj#tsR8sZDiGb8AkqZBtix5BZk7<` zemXI9Vd;N%kCjc1+~Zv82G*x54P$L}z*a663QpZ7rt9z-OQmCuD?7jN3@c4ezl z_BYJ*@ef<)`d*D}BeOAv;xXzft1nKOIh%Q#(9QHC}}sXNeQD-yI$Bw~7Lk_#U1Tw_fPi z}kiYMxrr4gBdLJHWqU|Nypw|tEXZE}M}BSnh&vt-1Wo?iVZCAe*>(p=@nJzJ?6 z?CdjU2_`S5$C|5l+uw_*bqwUPrs(FX$?p|}6_oINrj9t>NVw;zl^t#`p~+aoFrP^r z={aB2m6GBh!r*Ynjy_+-KJJ}*7`P0s3o1y)366VJ|Ms}`3ba+f(>Xy6Dr0r-1)Z~a zDXrL5g_@3RK%5%b2JIm_DDBqyzePKHCq)~P>FC}diN`qwmW7sM1!me$1a{W)Zq5ER zTXO$CTQmQs*<$#|Y&B3M{QkIwUl9Iv9sG?HpZcpM6R`0wEg2t9)r*FPPhBf49pO;= z@Us8k!^OTw^D6rH;UfLl;bPCnE#JMs^8FAM|E+(a)CN9J6%1EsDBGG;;LgCI;%|c4 z{;z?i8~8xezole0AQxMOn8-L`)_Z=g{5)$fpB)97X218+OzJgDmA_>uj^z2w#_DNu zHD?Nw-zJ=V5msI~=;D-p<1o+^c3AGL8H%iYYs}L!Ch>poZzwx^9wtKt@fo&G%_ zg==(p8JtqNc~rmH`IkUbwLZodH(cW~KosAmdk2QAnC8)$qv6U0A2O0adIk-m6yaR| zFjrBoKhPn}&?v5i49VdtgeU{;Wx-PW7S{YF;2Alm78v?ydO zyN2j2o8NPf5oso0>e<9C-;LJe^aV>cRJDulY9rOw6dw%$AeJH9ue5kb>LziBe8n0Tq2`{U+uOHK& z1UlK)!t9y$aWhZ8g73eHB{DL-nHtip4t8Se*0#Xy{n?@v6WaNJEug7i!^+W=IwttW z7lfnu!mF@|4D)kMwOR^G$gk2)Pm;^IgZmqvrjq-;^ z@7qCt#GeRPUE{iqMihLrSdFCV)W!|VCZ z;AP9qb1_gi`IF#>Oale>No zzwNn;XHK0`W$>=+r63F2F1lb{9i@~vx^!yE;;a|u9Zm32vr|)rYpkmeTNHA$_SR;u z9O0@|;aEvomC;B;^?vK##@A^sTH5=9hPWz9V1N%TQU6gJqq4SI;yCiS9KY zlWa5%|6EAt__k1Jb)_)?e1H59GGc^IMBTM0TpUaEF|cChYZ@1N^CsYXhSQhf1R4o* zDMmeg$y&6fQeB#^<9iT4L(j)lT^?8J+>zFw--lnl>6hu8BFrOJT~ngHJXrV{Hp6rr zQ}htmJ!|EO%l^0*WwJd(3>vr`jRy>9*HR?OT}4zgYxh?nsPkh>uhOeLBmv*6I&K}i z%rGg-KE;G)3WL^)x|n2xq1pkfL3m$TP{v>3GwDDlOw9qgXF}51fkkek(e&5;msdH@ zFg7$VYX3~&I#vJLT!^dSHy6nj-V_D5@%O-npZCDOA631%e_cc!CbS8aZNpj!ZH?XmQO#F!BRVuGQEF~NU1t0cizP=XCf!aPG2lr=P| z#&zeMENrwXJnAKeajt=Ow$|5eRy;w64L+d4d`g-ZzaIRCl?H=vC4C&LXTJhFMp8@3 z^mzK5t&4lxYGC>!+a58uB5{5@h)d^N1Jr7Rgd1=B9T7WYdr?K(rrr6{NU8n`O;gy2 z+|b^5ixQvJTNX?wD#MKtmZT?j^{w2{grYx<>|pYb&3(9wcP6kWenhsHihDaki|j1w z5i*ywvQIyhxkT{uFU>l}g%!P|I{2}TL}AGrnKqbf`cEY^v%4W7D3+QeooCNTr46*A z9h@46BCefXBT?{xDx)gRLW<6k8syn>?9{*x`(zJuE?q0ih?~o&L)!bkVr$o#iY~i7uM75KlV7{8G;?kc4LUJg)pNRoN zxeeFfh4LHHfzuZ)PaEPpr0w{3$;@9(A~4O=i2#=3rwFOBZoMWonGEIYDlxJ zev|AR+oph=W+5vJV0OJl%}l)zx1H~MMnW4ANw%!LE0!E%?^<*r;*uG)ib(qabfa<6 z^T7B;*GcUQmzG41fbtQz)=JE3>7WU1bGy@1Mqp_svjF0zPyW=IJOEreduifaw6a4N zt${4K;42c?nN{Xmt@txiv-ea#i!fsx)$wwJh7u3An(lzqr6h z={PQMd|S9h5#}+B(*noe{bp k6-b8kSJEv=v-^6Mi}9DiVhU!c;@mtb9(Cpcd9- z>OSlVy?ASV7dai~B?=uI%L>nGHZ8t&;U!t^t!3TCB8--?f3>oIkAHT3-BSkr2fS?Y zCR1&KlVQ&opakiI60goqZK12k<02SP}gl#p|&#l7EfsgN}m^G;ApId zzXFox%l)ri{C+*8!_>VvNz)rGe^Hi3>8()I5mEjNnPpdNmc29<6*a7@=LQJo zpUSKPx?pGe{MM>Zf8^NvN`Bd#)KGf*u=9?mSs3|WwUG&C&Nk2)8$mJ!S7oO=9j?D# zGaw#LA;N%#l3Zl!(6xcpZ)(Lo_f*G<1M8<7@(Ro^_>9^d8lhNX?j!X@gO}{;`{cL>J zOS=kOVZ0HQ@d8S(zRxkwcdKEHXA>p~+bTSg{|FWQyu+s-jpzHNrk#CUN@vI@Am$^8 z`I>ZVF-h2V_Z%E!nndV#>(cXMv+KuwU~EmkG!W0`{rPnFT+7!+W&P1%^2gfgnHIG6 zo^0V^v;`3UIMOs#GGo`LDgY(2SR9!JSzB&S7L7EFrHFX;J?b;PdC36_W&)F~9)B<| z-+X`6sqbum1zOUNiQKu{Vnt||^21bq*NODGo5}Pp^s6k9&&0O!rP$%MY;0j_n+pA$ z0;>`|g|@2*ok0Q=?|)hWsXzE=$c9^B(e|L1Z!N5pZ{|%Oy3%RMDy~jw zDi%x3=AolAm^GA`oUf#^?7appFUn30r3$lM;TqlB==)7;Lo3T-6td4IBIwn!Wp*P+D6Ag;5T449D8V567vXd}jXc*JudlDp@ z0HPKKW$3~>5Va6*PQG9IMgP>(%*P$XEiae`Yn!`4@+F@u$0d4Ymt~#nvS!7&G>^Yl{&@JQ>OMljG~C@@i~b>cu3? zmZOaTE$fI5jGhbnNa3h@;Y(ytwRu4-TChxbk+b;x*)silmxW311`bsOT%Oeh!&A`^R;hp}F%z*?}Bt1k(Y8rt7@5q3v3}q|3CDWtAt=zJ)}; zRVa4QSeK9G!U^NaRqDf*g(|LP@#9kkzGa~&O^LNYOxg|f3wZOGi6f zhu}^Ml@zD}xxqOlty-;W=BNwZp?F%Yay2F~5>iAhuni&2* zq6&I1|IxCr|7Xhr^Z(kiQ2ZZT77b({JJXy$^!w4`&xuU6&_X9@4D z<=D3+2IEs)ou@aHV#GscTuvM(D;9*#PSY7#F|sMUsa0$wbdw9sH4Pn5j$j2ris{^9 z*|<~oov+Z691ViRS;CMav{Q?RQAI(oOU5{BhRSF-^Q?UqyCoa-xC*#NIi}MNPu^Sj zjg|e9f;4WWsWm34s{D0}QY}I6Bb2V@cj@0#vQV)Qe`lsFx(yZ=Q57SBqb?Ldt+%NB!_#oE87EO1c&-%}RJ-E`y5YqJThlDSg&$aHEN&N?qx2(zYKgH!~LdY+sA15v! zG5u74=`Um8z%l(*e`ors*_it(+waC(PbJtZ`7pgm9Lx*|y9^GAyw1VuX=HVIsCGZD zNQHsVlLd*{HJDu1&*Ap^dYt$B{+a=k=BHkp1(+p3Wk=!zLoON)L4OvIayqn0zV zGu{hQTiL9gL-s{J_4>YAjI_})I*O$sb9$`yj=Q@_Uq>c=gPKt(t?tggr;H(XS58M9 z;hCVpy0qS0FHk$|{0*n{o0hXzIGkSbOLYC7p5ifrVhX~tf-i`nZ2EmG+jJf4662P3 z%w%6lo_oFDlBk%s^7Tu;fhvEIyCh5to-EwvaZLZMGwsy-z?D6;$aQ4P@fLaAs@Y$S z7r^v0N`v)jM3eypF8;g~=$XARGq1boC`_qV?3(#quI9~%ugQs8St&@RbN0a=cF-Mb zOB-YjnZQL0lUA%!yO#w+$tg(w7`z4{jZsF_3_5#?lW-cir_<#IrbaI46-Z`i2+dm>b!UI7TQ>@}omWQ7AxZO*rsb6lWjEa)=5d3}idf zQOe0Na}u#axj~)Tj2OwK-Zmymh?{Y}fj1}qj^tn;Y)c$OXhjMvtR+kCOlQ9<(nkWy7 zC)qD$Nu^*lr8(<^C|pwSrprwl8QM;E#mpiqYt?ts>ui}&H+vOKDWvBfdOoRWO#W)} z)V^pRdmECDRb=_in~1$uORrn#y7_#h0FLax{*JJG?qjZmWIjf#9eGK3!!mX`yC5Nc zO5kik)nY488`*`Y)on$BJ>gcd&u)HxnrOSPvB<51yG=>TE~#necV@V+qFD-{_D)ZSL5#ymWr)p-gR(>OnMN7`M49(FO> zT~B+Y$d{`j{}f~Nj{@NJJ05!dJ0;fe5e%Ls*NKuv+3p5jJ?~d(KLwt^3)aE&cMW*{ zF5EW6J%9fP*DrkmqeylP$MvUgj#^>mptV9HKQMk%rYsK z&r;zcFQ8fMO8bBt($!o&_fN4ONcnp9{$sK!E~%D(U9GTfHw#xR z4%b%?m2g)ppL*FCi-#JSDv_KvMdmTNOWXbHIDq*LRs>|E7mY~aWpw8r3s8+*(@j#x z>*W4&AU$bwKr##?3T9RSnXsl?{I9lgp_g6|dI4DH{mOxv*aJjK>6=b(j>FIk8}0-F zp%<%Pp%?#-znvf+ix?VZF`cJPBnll%1yFJ5VMdQJff+P+pr4t}J5Tzw-KuzIu=nZ2 z<6W1D8r3`y`f(a7!+Or@kAq){X4T~C?Wr5>cW8}BeATPdU;?gG_i=P!d3Km zasILv@RyZ=znp#OFWdHKc-d~Xa>4o*L z(#wX`fg<=k&mX}PvT;Z--?_lh?6Z5>uG<33i|(EdthIH^TP!XZ;s4TMUuq{WYsT^? z!E6Kg@h};lC#Qq~o}3~%-Oa&$e(Y!L<-{{bAomLcxgTS4Yk2!ylIo${|8qZ8+4{W# zSDNe#w?eDrhlaYr-nwu?z0J(}Iq} zhe;3Ds$1JiZbx0ceO?BqFslpthHOq_XuF#2z@~Qzzv&gl-UdIQ#Xo*H!iNRCh5mZ{ z=sA4+7*k1cdB4~T9zRHOs4sTkTsNUzYrAz;ZnoE8AVe!FW_rm|%Y{PG`P)W5$7tqL ztHS}Ah(xrvkjN>bTw$p?`e#z>tN89C4t;VB+!af8X43eslcimdMv7g z;5^X>Box%-m_Y3XOb7S{?csC;-+Oz$#!;U}!eI-_VBc0xm4axEcw>>-OtEt7ot<=W zZ&ju!w^q8h=k~_<{s+`hMqZO9zAxz+*HF8Dt$rCR%j9>!(Up$j``+wu`kosJ9_~*- zHMeUUF`%JS`Ps6i2C62k<=r(w+GZ@X2ZSS2Ff0*L`poSa25SZQmbj$s1`a64+5LpT z?w2Iv+DidzXtt1AuJ=~e;ceNO`jf#|ZZ;LXKLLPp4%u0JB#elYS^vU`!|kn6W=v55 zbky25If1&`IMN*avNmFNgf&?0NGPwrb|jSlN+Fpcl}<~sT2>d0LNiN4RwVkAk|L?l zJPhbW*H1LLwTAf^6=Nz^_?xsZi({TDxc!ud0pUlGVV%QeSf{27+r9+q)#-f*m(RgU ztXi9oR71I3a4n>`dNx4kV;|bvJNcTLM4Wy}Hn|E`RJveARrI33OETyLWfy26T`Tf3 zL>+4nRj0! zB&#MAc^9XlM&N6fa61>Ki-lD==N6NtLk?`Yzbv9Z>92fyq4E8Z z_sP4U!V+&@RM_R2KGtqc^Rv9#m|Jp~LD~_TPof?MOR9wf)0i^riBhj#>n$U*qTq&0 zbggiB{*61y_pSI5`cyH8(`D~J(QV)7nhp9mT^MAQvOL8@gJQ-e&t}~*b$H9?pzT8r ziE9#LJ;;`VW;VLu9zEng;$CW${f~XgFYUOQh`Wn_)54brTM z3Y)qa0rs~x&ff`n?XR8IBrsT@C(FF2fqOjPtynIubJxmOD=<;JAx$Pe)t%jyQSVkV z4my+TL9`Vi(A71bf>BE9mpp4bVP`|tF);4T86{~_bEZ;#TtW|&!s>ZZ^A*7DAH%!- zH0qcj2CIVP>!{X|rX(swPzpmA=mdhS$A#mV$&J@4@~n5FB4#TT$+hgj%4$X|DkpCc z6!h4^sj+6YT^&e9+@_Wnk`|dFb7UQ4^c5Nb5qs?*s&3K05FPy=5+Yw=|4TQxoE` z##E4?k+Mit{1(H zIvbXe?oy^bS~{=lTDV%cQ?=m3T&a|#ka35s>s6#de0N&NKIZnF8yu;75gZpdl`XYm zH{8x%Ps{oE^J{+G-#LsM%i$G1*9T|nY|B@9`547WJ$H~L9NJAX#A@0c01?XIcs-hz^aNs$$!Mw%vx?gy$V4SRmCN$0dp zD(o94X$as5G!BIFG?VbOzQ(}h#_nds^4%i-yHqTt;%6|c{%&l*mkXx1zME2L28*Rl z*I?fi7S#n7cpf?iSvP6FqZQgg<#h}%7E8eZg^bg{o4QTj_3IvL;I|k=c10^tzV}hb zt@JVuE>FC8%wb1S;xt5@;-qw_fu95#IG)E^c`-fj`<{ALM~VO?AjN^!%FeipWKJ&= zQg)#)c@K$bd(e5Prw;8jF4g2p>ElVqWckOu2g8E~Bk*o^nXyF~yggUvRx+vs(bm8u zWQ{F-EqpyFlJpw!(#FouS@fHy#*}cs#2FLh_A8kP*#YbvV89(U=mF-)esB`weyVi# zQ<*i?`=QB%X{F6oVFQmhdw&x6YoL4mRxc@W*y*|HY)qZ^%sbB2C#cV-1at`E9D3&4ua%_s zc^%_vvgLUYOQm`tl`t+h-;--3%%2 zr1w^(P;WjsK4^}Svq!qSRL;Na2pW&QvT=r_-R8U;0yEU)TN4%OtK?yAvQX(3f-+DI z*>QMf)UC^2Hc_}$qo|zUz*1K8r2;jgiaNn~Zg>qQ^f>R+=ySsMKMC^3KGZW>7?6GPM%k ziv!dMK_~Mj;`!wzQJO<0Yk{ZdhqD;RU)IRnlu(p1m#dObwVj>UL%fs4aTB4H{EMKQ zDTdn0DWgaNn@J=rOG>R09Qc^3iGI1M98VGda8t#9xv4VMVFj_arwmyRo#HlL4+|Dr z+MjOf`Dos#j1ODupUW&W<_ZckAyBa`J)Wx|Z9#|tv62_t`Q4t~hI$-X`v2*s%AqbU zivixzgjNnfS)$@qI2GLYxfK1VF@);j$QmrC|6d5YBDI0bxUhwc>Bz&b8-YQ7zktX6 zN0XBZV?Uj&YyZZk23z95eGgOGLvTODiD>%t$HKLA0`fDGw@yS@tp|Z<$@N+{isXcO zlFL1Oz5JqMr0yMp>Pk zS{;1{vtE&2h8r4nUz+#^>l<7_-sXEJPRbI(Lffq~=6tk@eAefx`n=3wC>!BWTSV@; zvFL|YD0wMZMS*1s@z%PZ*rNf~Nhk%Q<5z5bS`|-l3JD9U?1LTJKrBs}5%uQo%Xi;0 zE6&T$CX&6+74-END+j8nbc-6~?M0GKlTX)aHpG&tA9*@$=OkS(8xe%&Pj%TZ=kBdD zJX^D9u_sX{VRGe&aZ;2RaGTDYjGBTQWlp~u^L=65JoW=#J!QBdO8M9~bk3-1bwvbO zQcGqs6Mh#-ypzmckyJLi%6b-j_|2}MP3-^2`OaEC^iavGb{UjhbIgbrS-y22B*Su3 z$B;VyOuF`_Y@g4A(~>mqEL+SBOZI*Zq_b$D8cz~<75zE;bL4BTr`jc)QdG7}%Pc-8 z*9nh|s4w%?NWYMAVMj}85?G@&vJb|1H`ElH25!DKu_2U952x3m-(*sbQ;8Lw|> zH73J~4o*#CIa$5Yg!~Hpyb~S>g^!FM9rX6Q7oH<9*4g8hvEN-Zji<|H#hwwY>P%DB z{(qF+c|6o>ANYUTR79ISOA#St&t3^h$ToHovW$J57+bdNA!M&ClWf_u%Njz~k$qpo zjCC-a-!(&>&bjaV`}=|uGl$6 zyw^H+tE5ERxgO*B4ldR!b}3gMfsG-=Utmw;NxGa;~pcUfT7oz6yB& zoUG-ia^iPdwk7At8R`rO7Y0`YoJLf(wa>f1xR);lp15R>GrT4cx9f0)czTPSGoMVM zF<2nZqr1xVDQ1G@DYXzA!7)Ts(vK$Dhx1YPDV!S%KXw;gg*}+aRJr{{UQ2N53@Xnm z4(G+LRp)tp*R7vO=zKY7EY#mF@oM|MaGkJ>W&-=S({nQd zugqC&`ItMVKL{UO1N6QRmXJPu3d65cZ>Rfe#imM)BdLG zB%MfSVS&8NK{#*E0hxKex!6*IC!80y*={d+@qnh(&)DaHeZWa`_K@2*w#BbB*5eW{ z5a7wCK)5&m>iHC^#v4g@V%l0yJqk+`Tp^^IBBIa8aD3mR+h39cwN62*uCLsl814+D zr-8xt^0zhkG@`8b+82JTLb-J)CC+QZs9+8a8X{A?V{u9YeM$^Yu6w2evE!VQU$j#i zh=V;Zf8j8<*M8tq`-PfWTS2uq?N zGSO$J&!?JGiyf2OL!b&#Q4^arFDn(CY~1pg&z!g)>lv*X=23}mf@+v`#)-Q=-(7T9 zR1L^c;z)myLoub;s#0#QCAzkk^K-Mnb#s|4ph)RN%FB{2J?rp?VO9-s)M4V!CE^fp zLjw|NFv*VHEV28{bLNyoxb{2ui5&52M)TcUy(}*{vZjmq8tTvLz3>;U@x92m+$qim zH$@#NP&Q0S$2OoB8NY&N6T#hHhc=-qQ(6J)4ud3+xNsBDoe=q~D~|Ub1-GqO;`O&$ zY>-kelL(Nw7)Z~;7<4$p>J_^cr-{UE`MiKkm-)ebl<<$lMZk);ngj=oSOL}Umu8Cx zv(6C9O#ftd%r?fryRo-=#I(qQ)!fs>>@`~mcsWuF^1mATU58P1h^~9_FS0pQ=%9wI zWDq3RAIg&{CB&Ka$hB$dJw$68=m$$r2iK4lkp;vaoatZLoM2z<(z{itIqOJLp*HjB z`J9)ChpC{%d2{+>?l@1Cx%sl)g;S)8&;Jfw97@H1_ANBQZwMJ>P^HcXGZZFxkM4aT z^vz84@y4}JBx%MM6(_>n-EaNQTi{5#|3VeJ$6JZ9xu97e`KX1NcGEAlz4@};V0m_> zLx!M3ZjpdlJ>`m-1W_^CReS!P(tl{GG>Z~qrCnSC<3#aNy5rZT#`5UgdH^|QpoH2g z*n;c^e|z=$6pWTR_jwbn{a#FjuL;7la#YPmCHGn}c_(zO!ZPs>sMx-zb}NSB6U^jW z#18T7O7m#*?d&)F+yN@^8$ALyCPCa{2p6{~yPF?$jDV5E?_5ufM=?V~o__&MJ!gIL zaJ8ug(WM^(`%Q|c+)n~bRrpi4$8SuPiw49ku>WA`$Zw08Sg2+xjXdnKFSK`YR_q#* z?PhOzeoZOBRmqDHMT&57=Lppsy2bS~yjj2-H719W$(hQ+h-qfW!}6aS!P1N!ct4%x zO|z9Mk^Quh`o(}W4eM4&3ImakH0IB#wJ?R>WkjzmMe1-eKr%^^+Prnpe_q8 zd7MR%@765$$n^pw_1*b)`rsF>l?H%Irr znv*{EN=51OkY+l*7O^9bE)IBf@xMK~t<8^~sL%zZhASLMt*s1!7utfeA`NJ*Z$;X)daZaIn z3P`?GmaOYq9Wy8GocX^c)!rjXH8Q6|=9CPN4=7oD?*abz7FKZRvF|&dr0f0&4}8VK z#0eA&k?*^nQ&cm|OOkP8FXW6u>(u++mmB_Pk!k+mn7a)QDFy+bmp)MAmAT`ri{^h3 zkR4nZ7=ux&fE{9ytiMzN5u9)CJBf2P11O&bH+tOcb%eq1J38YV7HVV{25NaD4$Ei% zs>T@Zr~bPdvnjWwbXE`hu!phlTHHoJ`P$qqcQoy>ioyslzDQTEGvr21Aj!5|`6Q;C z;SGQNA4u^BG464mOxV`g{m;l+dh>I3he+|f`4~Bt8-a1tcH?lDo_(NuT>~Sy9#c0(i z5uzqSS)VC!+1&NDZO4BFz=J0>>b1l;m;G1U7(wcTzA7wCo)XTdsE zO3}vlIf#LHO=JIOAv-|;*8jq|%9@AT{@HmFE*fQkdX|$XHTijC!qD;ie!N*js8DP6 z+40dS?pIbrg$zdH-qvwQ@lzmtDr{7 z;k@`Wp<=8^;{129OF|81S9|HkyQf~2tn$2>LbGIHHGS$KgL~($N_3f!w0=GF#p%Qq z(=l>whOg?+&nREb;9@+VQS+jL4rJ5Wgcv+Mfbab z0RHZDmFrsjsw%BE-|HIDU02$E2T&V)Cv9*P8-x~YR3{|VT!sswRv%GhO+e!HzI$^h zh}L|Q6}xC*1+CRTUVwR?Vc}fsZ!cRW;R9l=%! z2`^39Ds&-kihM{)bPTrdTi`Ow;#eFk34~hFg&)Hh)oRCj3A7X^RAedW(}K#44cm!~ zUgpGU`l*PX+tahzSlaLK3qmism0nt>g^g0#Q8V-L5!kvHCfliC#V}T+nd9wB`sMvo zN{r~^65VtAuY@<2;+rs@UR@-KY>NlLN z>euldw7i|Om)V}ovsbsXv6?>1JID3feN?YPZ)A0lV^4`h9!>e^#Tp;W>+Lp@Mh2tP zi9b0bMx;!^hOzg64~2ZO0iJdx=us>#PAR(Ov~FKqVUO$RbfVvpNb8lLM={3-gfAD# z6>kj986tjsGD2idW?%{@bjV1TxQ$Mw_1xsbg<}|TD^EVYE5wLXG%q>e{)hGctd}{` z4%+x^jG~5I)_hD}Rm}E$HK!){utK5Gr(Pva`lD+Tlv$P02zi-Dd zXz=88BO$?g;j^>|k9`ZtK*@6^sJtI-m;$i+rq)l`Nfl+dvVkC)Xd+mBedV}h6BZuz{6%2++{o{%NZeDe@vR}V zf=lNbTpz70>C(BQ8FyOU`O5zDjm|lB)I%)N%Kf1HjnHO1efxhS!g=0du2%yh+`U|! zUD(AGpBt0|`hIx5@)Azp=lr+6F9`Jgr1vdZ;vtkSPjN)J%D-}ha`@aJ_(1F*xxuER z+@NcRU6L;6S@vbiL^T)4(bb2`Feo*32GCeK`_%bQtY6&8Ib>GpIdoKdu!M%FW<@<- z87o!%ZR1A<3OG>)>}ki~4FOPSdVnu9MT$V~*N|Pt@^x3LTTR`Vrc{oOY0p_(xc0|j z>;6rIPuzGiCuf*B_V;$tX}(Bbx`x0E47N(L9KEGB_C@s3ZZTbL#>@JU2ygzf&sxig zBf@>(OdSnuz0D;nm>|Nl+k%7(Ycmt13%b&8udAP9bZ<;I6eb| z?P-kK#rw{`_lruFw7;$wABltgqLVuAda-{txERSXQ!|Ur9L+D$BT|o z&8#)LeFhQ%!^<+&OJOVIQ<(pkuJSl!JCqbA_1y^GIzTBsF;Fma0REP}K}(yzgW z%b{893%GBrc475PQR2l(+4NM`C(qxAIyA!T-@}DtCuCwj$l8d&{7SF4x@WeY3weB= zkihtFd|!ehhVUS~8Tb4sd5$>V>e(fF{Y{LL#EDl-O zAAnwzm_}T5v z>D^~3Xg@d~eIfh&>4G0k;|;h>Dw22C7DdKfVB)t{1a*rBrGO>_e;U)^t7wbxqJS`YYQ|I2j?NHE ze<~FX?~tjQ+b4e)2YV-cGvy2y)*XH~ndEUX&j`1P10U4dUj$!7Mn)^I<1QB|pjSG) zV=WR($i$|N5VHUm;V&13aeGG#CGb#-)RMdMTqYE$-OW@t-F%cB z#2?AXg0MOt=Ksf$?2jdei!y=R#qwV{&zWC2&z}E>1C$m&S17g#-HjL?Gtb%Vtg`qwTWSJ|nZq@svXu=Y*Fa zf32|L`2(&&7=3qBKN(3`q~z8675TX689N>EL~qJj{;G$!5lZI;r^~{Zxj$Jx_3}D> z{Hm1W>R65}nqwk6nH&lSTStg6u6g!Ph9BukYRRAC?@aS;ciP28h}a)&9X$!V6FfS2 zm0dy3vl-h62!8E<5&RoL1^N#_^(<=qv>0LL$k@Xv4d-thxa!#xxL`N@LKbZHfQ*78 zBV`L8j*(f9_EL^!dO=qp9+1xZqMA-_l8ne=@TUYvxFU^voAlOECzs<_CwHz+DIjL_ zT7O>ms=kg{&fDQfzBin&pvQ1ZxWS1$w-VgyQgl8jysPTCW8S1)k@d&6vDk)q-s6nt z%M!E!Ww3mh-VpBIK5lw51CE`4#k1oeG#EtS^D8tcEWcj!u1l+f54Ua9%ZUmKTkJMZ&jptqihDJeD}_*V3i66;cf6&fy7O}D!IQe z?eDt$kJ#Br4#uh^)%Tt6e?OC9+;B-Ir;2@-4!x(M?_Ex?1Zit?!9jnWoi5o*qL7)*_xV&` zZ$BR65;jWet+{wWE9qzAt%QqE#|eFGB<()B#K&DN7U$t!y#{5H{ip8sq7@0gM-l4R zLr0rJ*Gp#&^s*j0neSzSo}ds*g89SNt*(uSEe83l^~(&kx3H4EdE5xQtcuyo9WvtU zy5P6EiuMZ)GFSl0eObJ*xNt!1m9CC_ez*GV$D#~1$@UV;ugu|>P%C<#U*bzDD1)YY zno=CUC;WSHjnx?hlpHQDz5lkjN-?`{N{@Dhlv(9Pj)jj4Y7#&<#%=K4PYYseVMnVZAv zgtm;y14TiH$pBnYFry21?ZFlbN5)JHtgQBhT3`^5P^1Z{J^65{*Hzom2d{Fz)3jqs z!F_Dq_b((O1^S|OS1Ro<6-9IxN>1ogVC>Q{pJ1)jlND5MSFP`VXm$R4Q`7UjCA>Px z^>xpOwAn4JxWJX`N@rAF+u|RLrMH(`xCA*b^_WaM84x>m`a^&=vKid|ROVnLBGB93 zT|(E*Gr9O1mc0lS+Sw2n5O}N^u^&C=8lK?#>N44*72(~pQS}UGS2hg@^)X=#7t`Oq zFxcevnn5NLP%)JXi!TP$GaS=_r8EqNMcGaIq_>@nQo5Y&l~sVU7hTf`txeoqRX+=j ztA>^?jb-i#s@DnU>Ls=Do)b*5Lm7)42)-CfmnFSMb(qViy*FSjNw+h`@66la? za|%xD^^TGt?CspxyR0!PF;)c3Mm4gjQ+ZD#QijFvVEcRG0W4Fc$OwM{(lfCCOfB&v z=)R|wEjv+~zAqlK;B>GocHa;>;M9T9AaTdAn|dA{@2v**2Ik0%$1!kjhM&mH7KF^x zDl_k)7hOdN#OtLG0=1)wL{=52IB6<6(CQ z_8_L-HmgrDY-kzbwDofz7w(cN(oFwF@NnkaE$oKy)4rXB?e6uU@2GY7(BfjK#jD7$ z7@O#_8=VQG1yx1P5RHNbqc*G@$$5(~&fc4rLMM-V4~4fDTF3{cC95*$#7L&g8W<^Z z-I7arJ;h#Ea?Ob`JHd+aeGq%cllMV42!8#^VIXOAlc+K!P5fw`tdQ@2n@)J2PpdC| zA|WAI!J}icTQJh;)#*OPGpylDT73$257}3~{cKBw@J1z=JIE~Cln-_0Z!k2Zkibf% zFmmrSF}}62-HS*Ub_$5ybP>f{`#W=tXe|bmH!Pzbh*~-B!eLEM;BNzFI#qGtz7<@y z3N1ZXr$9QV9i|Kukgp29x>Ff(GFMU;$>1`XM>Prq(khPK|0UMp*nLm!9rm-TA-#~q z&eE6z*`LDj1;dXW>S@DeX(>%T+Hk==9h)Bu1E^+yxO*l>R=sb->|J>e_&PB&+8Qr} zbKfH~KnA5u)V!$F$b$+sKXO`U^xbKvy|TRc{PvVzYVCG4Z*aXxbOw&CYdd7?4gsLN z35JW9Qkh=vR9p(@(_cI^$nZAob5#X~W)Bc-&$r*(w z&Wp7!S1?6B{?yD`W8ob85f%YAH*z;MftA1bHmb=JZF2nqv(MKh4Xj=!EKW@7(2`oTXJM5%~FG6(3xOt)A?X*-aHHR&3Sq8Ud9X-fkRbH0HywnsR<+mTPF}%#y z9u<5kW?%UwMw*e~wfo9`?ZQTu&G;&V`6xlp=DRBw&5*uSajZ;){*yC0SB#V6#BXl| zHy=nM#qNq|L5c0TCPFn@VgxnRha%P@Qp)e{I;bve>)(g?0z zu;Kh|giy=5r;!T>mgoX5y0(JdWs~I*M91XxMom3!`b>4XMA{g5EHT-xdZ*7R!D!}3 zgPkZ7{hbbwF;5;@4Db~bpWHWS5Zcx7e>gnaXt~XDi8aPpdg7B3!Sq{doLj)>RC5TH*5sUNRi?HBi+aJ2+EJGBQ zXnI@RGg=1|`xcsfrB9o7DR1MeuFX0vqidp-`e6d4kuXNTfEPS${W;(|@wha0X z7GnTl$U*)EmQ;tUK>`u2GhWPVgg?(cMoR`@p%ev*kTH6@Ks59Z5v71*ZNn`o8|vpl#(K*{b!}5ZvJC1Xss)m;4V`L*TC|#J_Wz=rAaO}Z4Cw8@KVNmH9aHI!Q`~^5we#G(5 z>&88#KQnGTx1a{6oEW28+#N+2PQ-*wu8a;3^RpbKEN+X+-e$PfLe3o^raZ;LKs-D! zu(10&9v*T(^aSTMV^7esIJn(uk%a=TQll~~er5H3ae3HGjy4->e7)($XHg?Z{1nDbzyyWhB13X2E$?LhH%T-)eDZ zc#(o<{qDev*#*d!@I4`LCn(2gT>6BqBz`Wi$c9?l0eWK1f>h@T&Z%SeB4Qq=Cz?So^ghYJT87yNX>*%#LXZ+o+D4Dcq)Lpq z$WIfzQd>td8i@-xYN2NlQ?zZGTuz_UTi-`(of$qUor}GLrfc@&Z|8U%v?eNiY5%kw z?a3(bZ8Dj?wnWGF3)aw)pi+ezhHvP?T)I~DTE@B%>x~~J!!e;%OsPv|KXz(f27ehP zMYsP&;IpaVCcAetMzElK`0Z!*AulRAo=DLvPDEm8p?ZUpn8F5q#wrCtX)>ELyp=Y6 zt`SioM#tCFP~xj08uc{M)d?r-%)7rCze)6aR!ekyVcV_G^E7l6sF3Gm#A!Nq&5r?s z|8W^8#ss%4ENmiJ+i?aza);iZj98w?FV*xq74{517$fiQ)W?tgpzPC`~*DFDxf>`!pz|F4;DooBzD#yi>8gzU@u-vV+fO@uXCG z&C6nL>VY;J#0V{BcymXjOctqPP z1sw4COr#?MorJL!)V-FEM|j0~-Db;bXn=^>n8TgMFwS?H zvY|162_of_dm!#y0;jk)TzKqxC7$qn-$g64s|#Dv+RQkN-(KhIFk+Yd!DX?K*?JaY zB~G4byj+v@y%2@`GRlT@)O)(BltKZqzhw6*`8HLD+tjDd{*N%Bx&zMsN)4w}j5RE+ zLi5qjf(NSG7Pifd^uBp?>&uT}lDcS*@U%sqg?NvTTd|h#tpIF6jLxpa1C~g zR(#iJv?#!T((y39E*lcu5LQ`sOF0)o*y3dAg4A!w$H#(&gru@=7)Pz;kZbzM? z<}#*rwGL8JxDa2~qfQvuUijvd4D5;EHoh72Aq@!Od}iffVnsi1Re?fw4kuR0fvd9^ zC(c_k#{pIa z3AvD{L~PnP+rlr(*bq?0zOJ0n8*4i_%9xif`@wu=a&n@}$Eew;Ao)%!_dmha_|Pa! zPF{+%aplS<3=Ujf0VZUw`hS3{nRsxu?GRiI+p!jlpw+d;r(@Pq@ZxGN_O8M!86}|5wR^ffW`xf=lpl`9xZs&i!FKHIf z@7w$`A@4)svM7T6 zq~id7k6!?Pql1f$wKWaJ8<{o6j-RF>b7phLXQ{8nf*&n(XsQ27_RX6DY}rE5Z~mjn zbO`V-{Q~$!|L&dr|2CQEi0TfG{C%TfWpkyk->#${Z&u_>q_1hs!ODLZs5!Tob8Z>A zYfLJ%6Z%SA@ea#d1%rlNrQpfrLE>NS7*IPqT3kH6m2%k@ocoB3ML8!X0?47iPha#t zot4_$COTWBF!dg}8A6D4L_Q%w{%DR_z*g&O&hyKuj5WlVlh}YF)0i1)!7;*G1{l5F zS30s1r?FZOwojPnCRt|)}!GnGvch_p7Iz~<1Yq|TT=h~xP^ED?%^2D>u0=K z1pK~<D{f(irtK8JFz5su$~B||c1d~Xi$ z``oMu1l{8FDl1j`T=Ceu&WH3JuQ}B4{QeXzD_Tc?^?iZ9i@YbG!l#;@%ekWL^F9n$ z{7r>#bm~W|HjaXLOmZ1ZbhggD*fzWAmxJzKcACazU=kRKy0=9Y$Q7)ip&dm64B6($ z9H>RDWo+<<=gNf_L~C0)O4OsUkDRU?RWj7{+Z_h6k`j})B2)d5N1(C8-=Oizj#Hry zH}j_JhD>Qg$|+cEeLuK;8PedKlRqCpc-XhV3Qu*7TX7hyO_X=#z4lEOjczcprQ(fB zrnQ}7odKZndo=Q;n862MT;9USg+roXjA2_T0$gx4KGjvoYM#i6y!!k=EQM zeHk-Q%6gQysQ#6=NZ4@hEgY9Tjsf4AeA$i3zmg0|A}MnZe+6q&^oULvuOY=WYxO&U z;2Af0dmk=%_OHAJ!c2l0os{Q?C@APDmgAp&c9H*lQD6kpPInn=m)u8IpH)MS2;^D; zRCq%<6cQ$LR%80v37;{{-M-luEiE~$r(6MwO9>AC&>j&A zuTQ2%J7-OC$e%XS6kxFzeC{1b#+3gB`xikS0u%8bnoQd_DBAXJ>+=<&^)t1?OA%4c z-+LcJC0M$!hUAUelouB-@>x=h<7$HV^);IbYgR$i=VuCSB`17H?+rPA6UEB|wD21M z3pZW{>r36@^#@f@JhRq^4-XG&&F4TpxWD&w2AY36kbnu45m* zcy{wV8Of>9{m@@nxI&aaX#xJUrIUGRg~wFA86$ytPM&%uxD^wIA7-A!mIz} z!l8f*cT%|PsKc?4J^MU_Ej}Kj6xSrEG+8ja zvJ0wb5%cs+vCYo$T+z4P@6AF2kMl6xQgIDOXlG6_oWu0@=p{Vpw_*y~e75#lpw{pz zh@SDn*b0vH@86DO!VbBbo!67OI*y96Tle zigeB(gDD%38rpQ}gSy38vP_mtU}1$DOl%yy-qE&JeK^MHPLibAkt9O(Tux4$p$3+b zw3FOEy80f7#`E+Pfb*Q96~85QMLYPRhs={1DtZyS#PQ7o5Sr8X&Vkven{itQ3|+OW z{QBc~FW3;C=&J-wZZ+HT+t0C&ovnhciG>*{Zqv!tik(fLItLba_4|6&9sy?1WWrYj zZ_f{G{yKbpfjFAo%Q-PSz4zx0M)*tm3+NS}>y`A^{7-7-^s7a131#AQXRE+5&f@lh zDnPZZ@R>#z4VX?hcTSLUvr)dZYrLAX(^E9{*$+_a1FseI@yL~{xVe3YYpvZ zA07K&ijht8N&6gp|4KB3=l3(OuZ?}14`(6$=rqSBm!mUlj&NtPE-k14J$G<{0b*y8 zM2qDep;ssmFEIWQJJZA!V=iNY4XX46%^F_adz2mG5Qc~fyRGfwozfIIp(n#B0XAPh zShKc36x1S9UX$n>U^l*&je-23;<6fL;QOR9Wv-W5akL9geb}`*@ z7hSZ3E1;BK!iCJO%iEXu*X}VZSKv-s@uTO_-;xRP(Hz4A5)qD{0~_lveYUMPJ3(@b zDbIR@JvL-Bg=&!`0;>Hii}vF(#z6P(gtWHzFq5`NU$Y($I%SmQ>!Keg}ueS zdSv~h!ZHzK*6o7hYc5M6Q&g*J*fUO(S(22)e-S+WB5ELB7C6Y%)FjN*yZ=Q|a4squ z5Fb-2oomB-4@@v3+gX&xvAnNUl;Y$os)hzf93S!5oQ1{zMbIo5|G>?;iqGgq!+7{3 z?+&}pDex|#5~{y=B1t)CHBYkVs^RAf@Im$!KpAHv^*MUrh9_dS)>=NaTvgLdm>qfH zHq~8-HO$1sLTYT5^@LQyW(JOx-r~2EVsPtJn};_`7NG#}Vr=&6%Y~DTiw?F`G@1HkiDK z3JFITG;G*bgIsM^IsbC9 zehNvPCnrYCh*k38Hxy{q0dZJ6CS@WZXcl)%SoG_b@F;kz0%8WEJSC{Uc0WJ=bitI$ z?2JK{2tum8A&1frdjp*o!4o56!I%CRR96RNzkb6L;eXf7sQxy>f7i`GOBz1$U5tCO z%BV@u)uR4rP|XVdeb*lScF6;G*FN-a>nqp*9^SP}(dSLNGc}@>j_PJQwpuN}%ABAc zs1NFaEWhf3U{Zz1{W+-`)ssN)7TmQc))74?z40pN$!|G>_P5dCZyU>sj zE$QM9j<&itGl=h5q)jm`AeWHo>S!f@xFK}%RJYUTYv7yOo$K)NJ%77Oqx>sgw(fo! zpHdoxMsF2-4p69o&gVij`+8HeGEWGSlAZI>_TZ~PtBGJWTtj%pQE^8l>2Ph3lEzIc zKDm2T0gzM&T${5Gx2{Izb*fxJh6zhOsYE(>M<5|%efs5txA>b2uJw8kaeDASu?}*k z0&A~ushF3!$4{v^d>OvovZH7V`%r0@i>X)Ppa&VI2++R$N8;>zpqL3!{g9|!&a4mc zR?a>cVYhaQp{YY2n5D(vaGzcREU%K(LXnVir?Wo0Y;VXi@3v8GTE^Y7;v^?$^TG#bhaYY z8aI9_*DTYVb3rBHu+C}TRbQ8LVtQuwA9YUm2?K`t(la)b^7jL2u1B(Y{Hk+`;U8r! zj)Gc@wuaYDCr%kd^7OiAx+CJWU*o~z8;7!E13S$r*r{``%sT(xX9UJ60XguL}K67h<%X;H(lM^mtLobujJZOF~mx2+DvG?fXh#MUeJ>^6?0yfCFH%pa+>Y| zE5dN;fb|6z*3@)@PKNe0Yp_DH{raU>*#lrl$e!YD4S%}3KU3`uwO{}F&7bi>GlC9= z5SAU4;{efRujiX+wSr-Oo;QmfJT>Jr9-8yZ?S(dN3O9LI@ARuSZNA7Q-^(a*y#No8e=aHI3q7$Yw;PT?F8f6r8>wxFe zt1ld5>D?{oL$G!CMFR|+at!E(F}dQ(PUrMl_8!w5CD@cl{|TecRvZ zTnfl!dwj6uTE(?FUs|%8wP0j0$?yU$_s$#=xun5aJ$ZroNeM`tW$B+r(G7bRf~uHX z+Y1yd(DIw2kJ+iwInq>#kO!S`4}ou(PTc8=(Vr8l*!TF_PZ<#9w7os?@(cY`&@hT2 z*feFFEHpdWbj{JP;6f^TCN8(da0f{*LT=>0Et#BRGZ*$30bjUio_C%~RKt%!WQ~Y| z1IJp%_Dol)M}@f3>E55ypDNwVPd`QY(>3QnvdY^BDy#Uo9~nsi;yOnquOMT3ysT96 zMw85IyGv>w#1*b5FDpYFz<=)i{$qi8xX)j6;fFy>=%?zb6?jlHOu8zgCnY=H$i+$=+X_3p5;t2oRzHCIY-m{@CET#jqND!HjNgQ*b4sg z7VK7!(dN(hQR?YzMP(-9FB<-iNkt!5Mk}NjA!8&|0A|+UCe!t(29v+F8qn`SqvrjjbVln= zi-61IT!@%Zj*fOlF!1&x?p%l_8fA3KUeCoSE=@d(LyVbe!v{BxNyi*KP);}7&X*nu z^M0`J&?3O|u-m?7XL*G35HhpJLuOiSI!*d+9IMk1jMdb#>H}1NRq7A!K~8})>PaW= z>{y>VGlFEcqFOE;?#7B@V!3^svUXC#uG-o9oqk2)1zXigK8E)6bL=Es6mja0B^mVl z!XiBM(Vc^AqV%PhkkRD6jKKwSiul|(JL47{-1NPb?jg@taS5BXliC)l61^Vv5Bs?CJcAZEDRL|~1{!^uE_v4BIc45qJg2-KJBa7SPcS@%YBY}uRrbOa z<5$vcW`yFIEpsU{P$gv`0MLv!XiFdRG)?n6`1X>Vtc2*h8Uv-6Y&z8S+qQ_pNA3H| zZ>GXStKVdHgCj1EQ^u*WGb&u^)y#Og$z{F!Ys#c)BQ^Y=oO0oBPC4eEoN_5$epsKw zB>0S&He12UCDjawm^axY+kT6fQ{m}mPzhdCcFMVIe&{*&)7*>(ql!eFiuU15%2i`i zGyBdIG||%9z*BzxOKyVf<*st8UaIpXpYFnv190D$mi4!YDU2&p*a+xJT>q~kChQ>@ z!IHLO>3gk3p{P-6yr&%br>Bgl8ze;lPdOfV%8{3@u&d!g%#10bmC?TlV#gio{`(3^ zgKZg*!Pdm>HI-TMDn z+4YX*U`%WnrbE=2q<56756j9O9JBNQm`%o1q4)JHDDDKB=zHe8XSszxs~pS0Mu z7?-5LJdX!U#7SFwsXEZS%yTlJ;ha*V;MTTKzYMcKqt69En(=7>(hT8!vr_csNqmwb zN~4+!(_9}vOwpEV{^Xti|ns6yJmtOZkc7vs{ehb4NN3G&47BuM&FyT^WD3ZidXQP-JmJeS46r%- zWr?haSWn4C#* zZU{2HvTNC>IOHq+jlR2Q?|vQMJX#-lM$nEB3uN^DIcy7u8M5rz>RftkoatnE!yMYn zUoP@8&wZxHUW8t3{Rd*bxf0~&)if8X+S8NQqO4kkpE}Qd)?KEr%f_lA#V%wjoIGUB zvd=&7Bw^2EVyJBJj#LsBK;*$X>w2&vpSmp_zZzEgUgE6X>u{e>jE)c8#KKDsvZ*Xo z)vvO5a71fe2cF&YQOI5%nkxA+CU;l%g$-Qb;+L6@u`1?swf&xTtF-zswXN!c-D-ikJ`&JS;clRrFQ0Ye zP1J?y^X?VvK98}cXqoU_Or+aBX@}@->UwFK5948&1ua$QL=EoEVeD!kW{KLn!@^`^ zg1Y|xjOn+@pM#L@mi<))Ax^kFCg206yrX||_S?(%fy!rPz0^o+lw4!hCyQKCNSDR< zUkzp7vZqtCW?j;#zJV#MD^CtKw0Uoyul45188-dgfh8@wrE0Rz7}bmgr0b~^mI|9$ zjxn*b#yqP}gA*Ok%C4`fMOr9=AcZ8S@~(-T8hGt2mc5`V9^#jS?Q~67dBII_$%!FXj8ot+MAoC!Jk>4W>t@Km}^A zvHDUE_@^;2YHp|GX{!{==M=u6nL;WiHBrGpWpN1>AY0Vu*zz;(Tvfxvc@vU!suzGA zz1!X&keyh_oCCPH^k}{5Wo> zB&iX$c>2VJ;Y)+X9*nTjZ51@{QP;@1b;3gF95k7#r_%G>M!epqo^DVAdKP-@9sL`I zyUJL7G)q*@5})n@MW*?s5~DB)!F?RZpN_CW=HmuP@uA0W@~o;&$lYc69XB9jRWQ|~ z14`53*RIl7f~t{<7HnH1Wdf2ik$S1q)XbQtttj&D(>pDT1dL>ljEZ%@I+Q%M#BJr2 zYDV!dQW-ZuERy+9g;@SiT{nw9Fjn|_tT|mN7H$>Gk=fl`ohjXXQm-1Hbw=GzH}eMv zATg`55z=o0Glk{5Y{V33u?np_lL&Tu%u=( z#V~|=V`If&>n4tjwQkezR0y$>Y<9qSHrqj??niW7DL+GSi1M@IQU10glph6)ZyKAF zNys8T1Y^yZ_d+j7-Wm^|XrUjsbyW|if=XOUXv_kCQ86@DK991kmfxxAk|q+Wo}_Bx zM0kv4mRwWM>d!je8x%I&4mGuL(pt*R16!;rw9w?KoXG?o^VRIQi>GnuU+DYyeG+(* zzwSX4?{2>d6 zP?4l}oqetL9M?43vCz}%#g!_4ll&5$_w#DL{Zos5`)@6_6Q{+(A_eduzc8-a0zWq; z2{=l^UjDWut}}Tnv~0px5Z(D6l$exz-Ia!!!%$a~>Quyt`P#iF@wdL}z9JN+_iGZl z(xbmIt|C3S{=ho>rE$_~W>}Ivkc~OZ{0f4n}EO3%2#oPqXNFZzt|`!>)kEN%8tr3!OakDKq)_6@DNX_AN{8`ejPT9$pSf}nJGwI!Q5N& zRDi`2dj@LbHGZpW|I+v^Y$%rKFU2;txTKkth&U(rWF@%4)G6^Xqkx-66g|~j`_6(5 zB7GnGLM)_Zt)CSaLPsDm<*V8h%Zch8IfHZJK>WJOM&kG9a$sO{IM z$0b~JS-$fDXB-2Z@t=bAvOR_c4<^*ueOAwl^qoRe`g3_uEl_C0U-ymQ|6scte9!-x z5>JScGhbZ(J1l>P+Ek0uKM zUs#e`M8SL>6!bZ^B~XM64L9T_n>pPWU@C1txbqS6dMLWvAYj}?`C$wN|H4|Uifcyn zVG?ghqsJ;D0s-q@9GfIf$kY5vu}GXEOb{Y*P!VgssT;D@;RZ(*C zO@ck8ix$Hlnu<-8h5sVpeK;rpM9iHH9SVu-*vAP?JUaWSt>2VSe`lm4$g~o3%27h) zDWcl$GWW+M3<{r(d{{_vob}TQ!U4iYZ6NU*5G^?jjm+ zY-&MUq&ZAXK(gMAj;2Tc1;^LByt-tSe-WtOADpoeLe>~?FMUE4O&?jxGNY3&+et$j z8#N7v82QPDav`6*N+HTfrX!0Vykc-5T!GpKF+4p%0Z=xg1~I&rv!HB*b=k}@AjHJh z*}{mmyPc{?+mtJk*V{`XCwW+Zms~b+DVM@}dIp>{F8@zyeC?Mst`5bm4$jejx!!`} z&FEO^JkyLO!IY`84KljMT!o9Wx9#VduUrC4^%C6vpD8>%#{Y8H`WMEZGmV=Yw|~tI zwS!wnEj(FJ`#NmleaD|X{wu~W@JGxAhw;Cp$qTZw%BU{jNy8_O@F$Nv(BAa6tQ1_j zc-Q*vTjCe?d?^hyRcMDMeL5s(j)qLn)dJ18r(1EWq~8_hQ&)iH>UP{qB2sjB{Vr1S z_K6aIb5#hmf|`JhAza+yA)7Y9_%qYN@L*F-ZOsN0|GO-tEbjCHIf_QYM76(XUK~s}Bp?N7OhaGr?grk{^jH zer@)kct8A~r$=ITEaczQqaQsNnwM9p7{8Tn{nUp4!B8x5d`jIY$bKbE&2!K8aCW2+ zN0zj{Q#~<9bw%AX*yDPSK>IVd9QGfaOwQlT|2;jj7g+`WK9;vVH3*cv%!&@WV@;wJ z1X_{6ixsa4b4m#Ji?{LrrmAFOM*Tke^|b%fTH{TeG)`_aSsI9C%GQ+vr*eokJmYfM z^J_1OVhPCNyjsRV2M>_?nAQ4NPqLzY`ZoC&#BV6U&DFZ_HornH)k%fVJoUSxH_a4o8{F*uatORNV~;H2g=&rzR{*^h7zbQt0trgdARn{gcx z)42TRWC!^VMNf2VKgM%1h2#fT47`DBBwJGbxvG4OxWl{d#@Rar=xuLY_RA)`sD^lP zFuJ`d#m2d(N%@4=`7%0bog%$dx9y+yJ*qh;**my|YB(bu%(a(Gx)-X;t@1-nrsVgJ zH=&mz?-opGmapiBgegs*@;uvtiJmG&LsA9bxm=?J=`Y5!H3&>{i^p~I_=b{_!ohlH z=6GuF8(oS1S6l`aMNO$Eb1_2(sFCduj}gRzbBVLc$n!O+%Z7KEr=!Bsb~iI$JXW^m z+OJWySj&8w3AvR;PFEJM(LcIasAoMI(`BKJi9;XPK;L&py7XHIpRmY!xrJf}ID}S; z0V>BooJo3mP`2dOTS!V{CpFAP7o?6D{zx6EJwY@0(@uCq8wv(KaoSUlpjBQ|?cj;E z3jRzo&USpgles%cx4^z)ZxeSgFFHJ!TX6qaNq{)_iAQhKjfaQ0=+mP(!S9n*|5#g@ z(JUWXk{p#lC$Lyvj9x;wE%h&-NgS$VXCU%toZHB)_)?DW0#8f!#G$e;wpAjwYu7#) zQqR32^H7@81bcu=sflIE#@&$krf8^VdMBdAX3N~@q|n7<=rC`25=Y^!kBFbW337-X z=)8xE-}q^ho$xJRi_B4t5N%A^>x4bXOlA3x)eK}~ubAbwgm6#s=0MMv4^sBQKaz|| zPKmB@Xfz)PSM`ZKh~G-Jerm)RQOa_X+kZ2KL=(14`-8vDsV7opc98$9uW1I+ch%}! zuqc^+r@&lCH?>0VFr)i;RM{S1RNbZf|0sL!aH{`5{$Hu6j8gV2N)fWxK?@-}dsQ|e zgkx8-R|wfZ}FZ2sW_oHm}wA6N?HZzma#_fRWXL|mY{{nJ-bI6o$cE=ePQC}hCQManw?+N+E> z@Ms|REv(RZkDxq?mDQ%o|EUA>)Dzw`+8N7ceO`wr@{9aQqVh}V(({+lWgKr)-S@fh{N;1W{<&f~-w^)KA(Axt z0VgwAQTicWcb3BFh~G0?Nt9)TYDnqj^^ZE}W|+OK)jAe4KDT}&MuPNYw;93!H>s*XqUFKs8HF6h_V;EDW8p9acY zH?>l$=GT;zJHW)M@y*3%4-b1TTns-KbbfEeYM4vP1l7D931*1c0>gFtC$CQih|_nY z$W5@7lYA5laT|FVbD+agJ7Ru)Gl59LV!FH zjFG>NknuCpmpUd%@7czX{&;Y@pn-_!MB+%B$ESaYPOPnvL#ULkEo(DgHsDQIM1&r;`?2e8?^RHrkoMdu^9!>LBtt6hwn;B#r+yWgVnvB z?qmq=^UVdqeXbFmcYNUAN61-h5jaAs$H`@+?^dsi zxI#>tYus8LN7yW~F>=L7QA~)jwf=>GG+07^XKf8v@DnKA;cQ4zm=Ru?*FS30pWAXb zB;Z>o_fW}}R$Ae$(0_=|LcH^^iHx4`8=V=trdlR3ARTqJm~1oc^4=v^g|RRg=rTzl}Cl)sd07Fs(~yb10~%@Y_@q* zta|lLz9nQmO188zwA>@s@;Zv)T4J*uN9A6M9rQmr*$oh-p z%gl{U{geTCUY_1u-uDM1(ALSlGfSd|r3rEKV;Fli`DnwOZ#u+p+1Yl^=0@{9R$+Cru~w~{ zG;zlFBh*fs(LOllIl)}96sENjvUeV6Bpvb3J!nLz@(H2*){YOtnIe@U z0~3AX?`O-BFLLk9wdqK&5llxWZQwX>49F1H213(HO$CnHj`17NzjmFEMDn$`p+$1u8XDYm;3$uxK5vZZyPJA=(2JSm>3S%+8)8Eu;tfx) zR7%Syt|fbaopS1ww01E;>!B;OODT@p@s3-vXo|TQv3rb zc@%gt1mlm3-;}$$Twzy1bRtH%e~p|SC7ts2dX~Y5>=w5w1FdG8FHwHU6poE;-s$<+ zO+9qMn@PbO>qOa<@S5JOh!?GAQ=OdT4O6XQN9l%u{`n5pE$~7Va{m5ht%&VTnBBul z(-o6Jm83qgC~1y=b|V(I%+A;7!#H zIdGQrgu8*_#0cqapz=QSR_}x2Qw^uVa~Vcc_@g@V(~*9xG|f=p%%X}&t+x^1wPh$+ zOY&Up9o$3Rnx54Cq4tKfnj@_`Yap`N)@VFu`mDOFx8v3;b=k8-fBtCK`@!J_ICa>_ zn8=9hD_Y27rp=`mGws6X`34%83;zcNLXPua3WUP2GUGGvvG-q(K<#hxM2_%=`9A?1 znyC@{He|@8-5M*PqjG{5cS9ayi0zev_Ih@RzFB*UiOjcD^7z$l~*Rk@nr%ofR zl3ks%P>{g9vRp_ox)1{I)}W1qEKXZYEtkY*ltrd%D}DAw)N(eQf}Yf@u1{z!Sb9b4 zDnFUnfVIoSa%yAxaV*?qiN0Trb%!t0GkwfI9G1g$YVr04%S$LHvM==1Q1P zOCjI2h%EjuBo7%t=>sIs=dt+6-$?La=c+FY$};pKFsUT#YoiCbS0G4I+6M5Ep)>v7bXC5RNp5M?^1;P7fg=8(H}>o z2ykEjlcPW17BbK$G*0vt(5_mOxJ3Z%>fBDQ6jxwN&eUd*v0P6DvEiy&FBmDI1T7%)M%%8@X!L*)y7ja z_%9AvS2MLU1$orHJc(_Bug!;HJbvBagW0X*ZnU2~nkjMl4POvl3!XmQ8-2U$*gj7V z&q-y}7%ccj(%*YU%$#=;2@ZS|#w65*nT7SVuW1RM*$8|Ub#jMZhCNgG#^0T@nuCG5KGWita!f|hH9*!RFaOtn7T8i2IKktR-WI}aZ~@v zNo`{QoK!F4xGLI&-NXYZ&-GbH=~xqlG%-VDq}`fQIP}mAvViDxfrOLzWTD4T*p=}g zuq(jQr_a&oxf)iovblGxC&MGQi27}Tr%CLH87iqZu`aHEv)4HTTWLArDaoh{5j+aN> z4-MNV25RuEMlZp41D4=3zRC)dL;`_Wb#>rhz$@+lH{jJ70`Q7DKpCQ2Q&giNAey`% zuBE6&sY_@bL?z_<#FB|oXp7?IvJz zV4Q=;tD(1D8n~73kF}k{=8;zFfG3B_s47Xcwta7~-dnfQ!bc7``Wj!n0E>s1YO8P` z)yM!ub}K{xVo6ql%vS8oec0UY^PM?Q2G#atZJbPRM3w^1yzqhaMTtX7W<+d^D5AlK ze$E)YGZ&_Dvf|?hi_hjgvKI`J!^px+NwS@;XW}8mOAZLTQl<-JOmkO+C0Bo;D zLfgwH$VmvAiqgDJw@*gK++}!8g{;}nbhTA>rafm6eUdpKe7WY@497mLk!-?jS6N|# zFHpjJ_Ng%IDZ>S;LbB(X6kjd259zW})|>`xZ@nDr)6mczrWS&wf+TG5m!%^0tEiiX zc3s>S-Y7!nbn|$i7PD}trwF{0*0w;W!>-yyr*{2zTpe{4*hjDD$_vg>8M$k|BG4K~ z<%rrjHi)8n@}VQw@ysiY-dh6XLS3&R(ZwmRXH%ND@3PRK>H2V<4(W!r4U|Fw6%Dd& z^~MsLS=d5kxC~;ucgSF#Pv9mSp6>k?G6}JyKA|snIxb~z)m@`jaoFk*CZ#iB3^ z0C)gO?th6_&LJNoZ(!Xyo5Hy@LN523JeqT%uXOS=J$r=c8a;u7YMlmnR|-hId)gQ? ziA?8<>$-1-HKop$O-6%gb-xBK5@btUB)V6%e->n`qCz#14Qt-^Zf?(`*I}qtkBzNEJ|DH0~PelEi@S`Md6D5GLtRER`Bumwn@WH zL<(c0M0d!#E#=wTmeRZfmCoiN~Q0aqm!{S_TnA7p~P6ZfNU6?PZ%$T*L|7cWo6pEH?=ytot%~Ku` z5@s$7S~#PLa3w{I;P=7ArIeu^^$>A*BNt{iV0O8Px$d5n@+E~IIpTAx^+v~ACLXOe zE1qs@)jFT3FPoKb$6b=Lp&+t7=Q-|+st=H6wO%#&27R!+EbIB`V)%@-?u+C&;hLw(u2{I3D z$|qiw0PSexn}I;_E#m2^riuIXRMK{i6a>?DnyFz|W~Bpcb|ELQ2=+XEL5$aSX!xVL ztKB8fvZ1x=>i%)7Wq6ISGlua_z>iT_PwM)Ev<|2Ia}Kdd>^pBleVFC-%O~LgpIXPO zWOqbiH_>7rLPwZ)wEkYl$^RjWTv{_2bysxHlxl^Pwy7j=_N}jFpt=LrI#23He;ib^ z&Iq_hhCZcWxEh8@^glp@1Ge(V@OiD~0RYDG(XrJN%N{8<94o9#*_H{_PCZuA3ui-j zB%E2Czc3nE8{w#@y-kZq0Ce!GkedXEYLj=?2GR4^;M#9j^Ke@kNXN#YzhVs*m+%l( z{e0)P8B&y=btFh8>Nu0xgym;#1P;>kc*TFiqpu2OWYk4!b<*pj48<=HosZ=1RIgvF zR+dD`Zr{&TGVXKt&y7v;5j+@I)uRU}+w62+31UY5V1_CHJIS|%p` z3CEWjH6cAORhD$JXEM@shbb~r^=jwYEi%MAK=>#U|5z&Rpu@^SrGTS4S6PeEM2u5B z)b7Xe%t}J;XImz;k9ka35_wW^YpM|-#Rye~hhZ*86$z@N#654lbkH;j$RtMHzx+(P z9cXL^8li+Sljc$1c!Bv~%0bj#5b?3|1>%Gvnm^fXmIzNNb}dJi4MzwDP-R^RgmwNl zH1QS6rvH!~58S3ifCBHxf}00A*2Svem0rHH#4)2>r>~IJsED+L&PaUJ(hU17Fvt1Z zm~LG!nIaJQ_bICR2Ncy|cEmXlwN)8BfuApMk0h|ghX+sKm)(u{qF4IK>Elz>mhLf) zeHb{bjC`~Y=wooK1u&W7fHRa!M#7!mcJ@})Mox7GcEj7XE4kLC=&bSP6ajLL%W3kS zg}lJgbow24wKyHIIOkiUC~b(t8z{p_%be|-;9s~$LefYAAjhgABYD7P>2+x4#ULGN z#pXhraX<>jv}xNduoU*bywBLozd^8J=)(0``bn{$n`M$>_`G(rHo+Y8H-W$Oe+m3| zeiHb@{tpCxOJKGrMCz22w7i>->ck71{^AttuOd4GV$j{H1DyMNW$M1!g7G&1{OklK zHb(_6|kfa=dJ>oH{@yLz%2~scOTw{}Vgl^R4jn|kx@4Qs3Ll%@>3)A(6 z1TR6`IoZJ|%PzO)^tan$yqN`{E*2BYE#V$_s7AXg=epz>_CCRQ)(! zZc#i#BQ|9jZJkEPj_&jLl=p_K!;rDX)@6_Ldb;J09$Iec4^A! zYFCB8oi5jBlmGypja6#Y_wJ5_3&Ayw&Qre#w!cbkQ0Dl7$rC)A;%g;8Dcd7#4Hrs6 zIFhM|DAN;4SBWBFr*sXUv32N%jZ4{x~I3`QClBq=$JtL(D2WTLMy*d?>j9eG`@ zF0$yo=p52g^0|(szR6BhjsG@8uJgPhS2tT2mn7Gz>Z0h}%+#qE1&kyz7piUG%iR*1 zgAn3E35VI=(0TK4Vs)>5Z4(|W%`zw9&@{sQzz%R!KRl(Rc+|1=ID5P}?4@z7T`y*Q z<$Q{07+g^+XD3IP_F|e~^?TRwrP_k@{P<{A^r|Y>*I`0gdw%zoEmht3YY^Y<+PpM8 z?vqsu(}|Pjk!SGznhFXL2GL)TV#x`QyFR379#~Kff1$~BRQKXSEw9zRLeUp6d zqr%L>>V`it;Iv;Lr^Z3N>c&}O@$nL5auWO?y*3_p9QpQN1FX$KAMSwk24Cf(q|@Gr z6z--S?QHZf@M`#1z9dwG>x(X61m-2Pbz45EJvX#WJ?^l&fG9%bQSj{!46kOo0zIRM?u;$b z-Y#(~RNa6pCs@nIa=cP7*nBbs-I@|VfzL6cP@X;Fs8Je93K{(WUoUFCD;}{ zhB;nT{+MvxO8b6HikqZCn$(Xl!h&jKcf$xHtol z?T|ido2&DQi=aRw(Dp$+LS{Y2I$+#7qQ1W@GDTO?w?ez5Z0_b~0FdgQN7Bbgp?TB+ z4*VCjn3=X^!Gsu)JsOb#e6%mpl?f2l7gel4Btva25q4FTHHc2Yh;umk_16|+qMtNy zK_HURLFd1_jCqL1?f=gSr->|04F$hu`)3CxYbq)uXTnX$>YvQr{7nP@@SH^eez_mE zoZ07|Xs>F(X|+^af*)h$$WECCk@1r=74D=1V>fP4R)@gRqKa5IXB4^iYRhs^&gmT) z&J|x3*g_%#ZHXvGu^yTCm@>Yi44K;`KVzUw>MVLF;M3IxqRnpUSJU+rKJ??*a*g`3 zqQU6)k()Igml)|HYk#2Km%3+fW)|ApnH1E)IvjmS=u@Vt5ce}aW^jzy8OY|Fn&sE) zSbQ9G-J`F-#=_?iQlg%1=^w@a@8=UEG7oWu_~ zy=n`8x=SsqR#gkwGmTqv_hZc0uTp1piu$@G@^EZvICO#6Sqp}T>}{|M@>nk+Wp*_* z?#xYRH_Nk|>a`seAv$WGGG1Ig-gZswJGYzGmm1=1pz#?|N^*U>u(Q@i93fqrhPjEH zPV+D6;NLBXf8Tky(kuo9ZO5Vrh4qHila&C0N?~X^w@a;b6Q~qxZ-l7_pWCLr!cg_^%nCRMk zHh%EM&b%Q?ggAhVv{iSF2rUj=dL)nej;Nwe4q&K11s_pEoxg2yl5Wvm#cG$fF8rZ5SXd=l0sI@`q={v(zxS{ND;0;ZO5Q zaoavVRj;^&&@a7<18Y4cg`r?+9241z=?DIp1rsu5;ExH|VCRhn{+Q{%{4xD$Oi<58 zn$)X1(t#W+*`-af0-sE5!W_HR8zHkfOHaz`KPxDu@Gzh=i(@D$4p3E z400?My*J*VpVCiI$29$=j&Yd4{9n{DY0WH@{p;;sIxNXTJ8}DqJv83@03BW86#l!>n4`l)vrH4`tEGBR&j~da;kG^&U>X5W1n_?3c{s zN^qiCmjfr-5{mK8ZIO}Df_GEzcm2`qrBBS+ z*`nRZoaa69+T0)Gs*T(8_ZN}R5j*nA&L##1iM)e`g>fUUb%mbuF^l{17%7@M59~2-yztqIf7?bj zhdTBxo_{y%f9)~8Cq58K^8{)|SZzKJVa|rEX^aGMIL16pyKX?6cA&Os-d9_!HZ%Tf zm^CG{2$bT7S(a6$UZrF;r`6c7G@*?2lJ3DBqI}|_)UiePOC94pPQF%n#HLQHj}7yn z>X(+uSNyk{S{-ze4k*fF^TUhAKyE=p%R@Vq9dx^wJh!3X#8T_+S@Dg$wByn&`hc)n zZ}96u+MBP=Q3rC1f|L;x-vXGVuYShjv})WhbqxL}vtL>muJ;#`IU>_+09_{sZNH+y zLAYcw-VjliQm*f}-w(C1Sv^mlA|`|@540W&DBhHGg*>U}2VSN>uxKe6m!dic(fm zOaqtekh8(p1XR>#YNr~e2wd#sBTgC3KQR0kHJkJZ82*OD z0p+&H(6k^AyPEdG%(^#BnoKWl@s1ciBW3e{aDDNbuuS+GE3rPdmgn&~w%$AQ#0tPt zO$u4&?8(7;Hq;OMh?jky9i%Q6A#Xj*dx-gZcfCgus6gUa7{T($tdOmXmk?G&r2-Y2 zMwV48X#f8qf)#D|<%nw$WN3QAGy@+$lx^wH%;l}T`HVAukCsXS9zq7^D?T^2lAhoh z{2>rY^qy}318*T&`8(TOj)>*2h8CAaqC=WZ*^q8t71I%J8aM^4%^r=d_ZSa&z6Skw z=JYrJrIQIf(82d)9|%6JD}_cBwRP}Mt`&FB_&yO*B|@M#HR@_BT>6Jr zPgt@=I@u;+yv6odv6;zs2x*PFY>{tuFBpP zr;e^ij9wX5McP&m#V_Vwh|ufcOz3;prQ+$*R_auDJm@A`2i0feM6w|#!?~gkej>f1PJH^s|TA$5=?KTHvyi5bK z}$!9%Cy`?Ba|=nr)r-h`!Fc>+!L4HyJ*ZQt7}qcxhE6UdVOarEGiS^R^%= z(tmxI1S#!rp5N8{=e=4t$!F=Mh3mQyf7dwLsBoLI=o)RmG(uo2TY3SElPZ z9WWm2G%2la*kxfPjmP8{zEXH;c|<**s-1HdTjkD!Q*W>Jk9+g#p-GAXg(ohpYT>P2iejRhVXt z49bLV80$3O)P>Y^c-=FHz!7|_l-f^==%}aR3|=k(tjCf{JnM1z7wLx^ z7MndS1phJkdCtXD;_>(U(*Q=|nt}pIa8FUsx{!f$pKA_CKUR1YN&K=P$t48rUl`S+ zc#JCVzcH#6WzSGX*N4h@Dy~dD(VcMNBtmngg}LxiEii=oTF+HQ8{KZ8PCXVL%*o97 zo1?0w_vOur63wKTdi44p!V>%y zg}!1Dt>(L*BmKKI+Xf;14yX<*5w|cYtWIR5Q=~4bQr908rKZ4Nx8Nsv3gF zM|;$Iup6M{{UFN79Y$wBdQ8;46?D8C@aSS)koBy-P2^b%dv`@8gukET1Sz98JVur| z>sR5JR^{y1BG@MVC!IKCpHBQtj&zfR+NsNgj`9HXc=`W@P8>;uWyRBpg{6!yLu#ez z59q|HIBf?%FVRVIOM^ae@RC7vL|r##rr%gUcQ{YB+zMUzll167ZltRVNRQS#A3xcp zTc7$vR*{Z%b3wIWg!=~qtzF}JY`(PrlvQl|Dtf_1FK0Q#)di^JTdJgxK>$KEa=b=U z1=nq{;`Rkk+Gjn9E!4$?rzW0@;E~OeVZZ9k_#b@Y&pT!m#6S7OkvbUZC=?d<@?BK1(&_jRe)=>$V>@wyhVzn)rKL*=RxXpbOVC)76XzR}O0uCMm7q#Ke6 z=5ehzxAhw6MeLog#EcdMXBy_&(DHt1We(~%%1O_vQg2+#l@?kfJjt!>q|B{T=Fb;5 z`QdcQj^Ao{Lm1i{?VT&dt9oi)n*V(wv-HB!7sKP}IvQaG&jrdP&|m){5{I)gj6&1N zeYoLrmszlP>Un*07eV)aM5j>o( zwZ*x{;ygcWUtvKYX!S4E%iAfj5Tivy`EblRw)`K@_r7@&&N7zL-}|SMhz3s2Z@DWyvCEft!HjbaT~4zH)gchHy}lbL#^q^zRXMKinP zKJxxaAzhgzvalT&5HChqj(QWxq!xJ+EtQ(-%ffkX)-C0k?jDN;E5*#n$dlL=O>`VQ z?|amR{(uyjSPAz=Iy8(O!a^4lEyld9l@?%3f>8}}S@;4|Wl#X>iYorDu}m`%u33v zAD5d+Ab^+E1xj6#c>KmVKMO?6BExKtqjY#THhQ&+k`f!>%dBrzbql4mlfb}1@pbE2 zOdtNigoG*`RHh}-wN5D9M(Mh%8R?CWU57X<-z_D=vP6SQS!sv9U56R%meDu2GoKKs zO8MwGSRm77GaDhydM3r1SNMoqt-#apaS_xb60yvr$SYcvb;hQ--#-c$Q5*JC!)vF9 zS4@iQx4u74I}16P54CR^+0j&AHA_5w{t(;4!x9Y5flaAmX~^}oV6PpKF9o6;D&~(` zUdB3>J6MnjraC5?Ft$wkE-tvQ?-&H#iaHiBVU2>Z$nhu>b_193Mv=! zxxaPY$#AWmsc17NG$ebtcu+Yd;?6PWXWjgl@8zxjDD*}onCO_r%lE8!O4{gQoxv|$ zn>vR6(jeyZB~R-;+P}SH7L4llk=mUPe1_vkbvn0*dWZ(V{FkGNA9Y*_O9)q?nIgWxh4lWd(EsxysM$zTxX|)TRKaK3%b|W{UsTZ-_InW& z&H;VegWceMX5i>d-^9{G474*0L?Ik-@m8Y0R5ui_yHv zFih^_)sG#6lI48#(<+W?*x6>5t9{yd-nX_uUXi}1+lgzFKi5E2!26EVhC4V?yi7{u zNMbwuNq3`7!`fh|aTG79pxPSaJ58;k(IdSRDNvi#Bf8M*6EPg;b#%gk#)gHmuQX`- zv^BZ|Kc>RWX6vaFCdSFJ2>pRlK+&fp->2y7J2JNWNfxCFreq{jzA_6jB5tlDP*lVH z17IR)wQ-sbXKp_U^IobP>GNK+ER{vi&$jqAySeEzr=X040q*-K*WurT>X)S=vh?{} z@0-AvFJr#!Y=&5mCoGN<2<=ekrm-viUUud%+3B{og1Ce6eixKVQj zsy`ht0G9~}#Vdhj`ekp#BD!3pHQJhHb0z^tzrI;Al3vMJO1EfG&^U z{4z`KCV09Mpqg1{x4vLZ8@KEIg%yN$<)+OlgTi-`xc$c2EQ;5BPeFmCN5~^KHuViP z+O*`#9gZVpsbHuDqY@^iY?~7|(tB;nJf2o1Jdv>qj(QbMwDWa6=Q&qSOSPT{YaB*J zH0VN#qS#T*`K9dGEX(xT6~>jB{Ct-&aWr3WiTAOt9sMeYwYN3xm3u7Tv<-czFwJ8` zC78>poh9xa9QJ<-C0~aT~QolP_Ib;6Pl!@yVWE z&*t}2M0%mDZ2(N{=%(~>Lq<5F79hkrLnz7aQKBOgrDnANH#CrYO;xq`WGMS+e*BhBeHt zM%>x-{{0-~`}%;R)+QZaMioF^X;=(4TEVJF)NSJ-; zeK@Qb3Il~R9K5|`o2j0%i+-X_Rb_s}RW(0$v8Tp}sqBTJvM>8p+47^wFHSO1WD@jc zUYhPGBNKIpB_2L?gLoHh1r&d~f^=kvdRXQpCs_O*_k-hV4s!Lf6>WPE%uSVC#FRM%PKWpq7NK91HEK;ugQX zo+--_xJv06bp^iYon?HWZhtJn?|oi9%0_c6Mk$M>i)%}q0T7C5?l-qY_4L=xg z0e&>71C&ZePJ6S`kuQ3Dl2K5+Sm{Ua%^prF8(IM&h1#Okqo(_tUk+-84BORh7^67A z^LoFxaIBCK`$pPLGEVaKE{&V?xoV96bBuL)z%G7VozwmUqp#WO=ED_e9I~PwAYXTe zuOltZQH^#V8vs z`V3;?iDZ`73&+7lE>rA=zfd9S7F(MO$(RV|Y#rPl%YZ?(`8}P zCP}N|Et`&MPTpMQk$g3l?xqfo@U~0M*IF+CYuQMtMimfk7T_+}+WvbL^wn2cCyZ!4Q z%{oQa1?jryF3N{*7i!aswOt>MZz%T>j6`^(lqEReJ)6d^-R%ZMuH8Tfs7kt!dbOui zN>&K0g46q}pxrNLnf(vP5MxiHZ92`s;;a+>oIJZD1RJ1&?d%sl-uS8(@b%Vd)yZlj zM#Y~<{oDJ+MP0%IcmmXh@DVN@uKayFF?A|g!;J`D+^ZaK)Q@Z7rx^4FWrCY zU-nBuXHW`K5?gyj`%Y4mbe-w2_%2sX#}7W+tjN4u=L`0~jI-%Rl8T|1V`3qzYq&k^0|C za2B?fJ8fO5%|?(h$sBEX_`X?Cs6U;A(RWdrOl$95 zz~Yar+9sl>e{8*pkNg| zIf6i4x_1|^1N?gxG(*#dfLHheRTT8iOXnPEpP+>8A?eq56w%9xnx?Hk0v{VDp4a8=PYw zsxJVedtjtDW)tnnYdiX5!J^DqVSfF4xI?h?Neo|LzFk-8M<2U1(SuEIRvb{1%uf+41M$hGz+8Vb*&Z?`{~p^R38RPjEGmAcl#ka zlgu}p0CDACQ2mniMH`o&m3uVo`F`a-fE$K+pX(Ud(BJUBg|3UioB$6lb;^f%{EV$d zVuVEh1=Yvq_|QW|TYNYM9gZahO+O>=d0#I!-;uo0u%6>Z?l^hdi#_K$tkIDr>B@}4 zDn4bmMXCl{V*`RU{;{U z=t$hCp3ADT*9X=LQ5Hz)m&Zvj?QYD-Mewtqjys_uAWbkV-NnQQdRbc+Dree?6t#K8 zxGPmn2(jJ_K-@D5MX+TpE`n3A*Ox>BD zR5+JD?RK&PMTVZUuSu}hWyGo6zL~@<@7U#y>f*szcb>8A!e)mf*cimNOMYVih#KQ~tV44lO)5kI%RwzXU4atAXuXV0=!ld4vr6vhm2Oj6+OcG;Bxy|aX z8HU$BRH^MMA@kk#(?j7wiNk2QMCrtq!6qlx*nrATa zAL4a5S8AJaQeisbH1wh9XqV!l=tHA@58|(5D8t}2k}l@=Ve`&k9k>MzZuO)`Mb?%} zdPLTSZDe8{_(GGK<8}0@Q&5IU77_9%ywjk?J;UTcp1F zfwO|ER8b77{W>|h=Ff)Epv?!bgn>N5Mt@-oM&gw)=LTfim=0|Q8ak2OTuM$OrdMs0 z36=9*Ps3d5lJIRCDu_oN8564PeVt^e$3Go;<+h6AWSB)|A@Rpvud~=v_RAW+@5R`U z_+~}v4MfM1Qz@m!?T16rFvg@n7b+3-u!+W(d2rIx$)RX9i1;JTbj{r z>Hu(&Dp4Dkr|nITF>Te443Va>(l1@gkq_0VF4a0-KBa4STMVb{%n;a8>B4$w2!GwSLkIo68nU{+F**KtKIPIN`~&(p*<#vlMJ9EawP0daUF-4pAFaJH#R_lr3O(jF z9Av$B^>mQsk)=|cO~W(c_rj&h-iT~nyQW2ViG+my!z5cOg2*`zCyh;z@pB2kar*%8 zdh8Kk=Z_u5r1`IPAF`3K>xw@zxJhz=ccp{w<6R8_-nA?PW;pjRyzAhN&Fqn$@xTdJ zWeG8>rX&p~k38-hWL)>9icjnNrseL-Jcrg&#ij`9$2{K3b^+ zk5=lmwEm4&YB+M}`>~@20AZ<0Vyih~L_k<}0EA^5)gK5;hVk$kei=j(IZL9s z>~T_)wzWFS;TDxZFX5f!bVKkm=RZWuyS6$FsT}C6`X|CEoQ9tl*BPrr5yHRp67nP$ zsyq_YkgOp%e&nu>dPQGJo@WuqK3}P!tp{H56Ji-|gHg%D3nrpn@a$vrFSbB15uT0x z;Y*2~=W()%7DvQiXPZdu!X{1nq2P+%H>NWvFL#&{X@{o;Kjhitn5!xuf@hV4EJ8jj zr9{$V_?R)tuI=RTvH2O^>zS9U{>jw?T+8eKkk0t9=E+wE`pRy#65Oj#rhpB!fx8^@*yFDZ_H+^1M-Lw+%k?F7Efp)0u`=28=J ziZ!6}ybLfG;|pvBN3FF#9KgZ1AH+pFhL->sTsap%+^CPhSo%`v)H&X*#1p*tACT7? zxBPB&p)$G`0U)oQzaX#C01keS=obRn_74QI+K*G!P6qT4$2B;!bL$vg8u(T+(mV@6 zKE;+`Pcr5UKNDT7URO)V2h>JmpPz3POMoodne>3m*bnItdd8aNL=C!6?ljZV&bO!4 z!Z(p_;SM!2lZ>M#cLKW-ZD~vI7rXYmYNk0<>en5`u==xMee>rS#_#~-ZV!vnIMmg> z+h0jKqS_?u1-0wWK-&<;%$0qq{}3sbSFJwaZ_2NcZ#{JQS2ju}wQDr@F2^;Ea>(u!dP6{aZe1^ndhoz6-E)zqdzg1S8t9Bthrk>`7-bjM2T|iuS-0Ec@iX zgn1A8j2E=7k1F=t6xvdg1At}eV0C?xr@@WQ7CuJXx(m<7ycJub?gyPmUSpKi>X*J^ zI1Xj$MrgR(I@rHXf9lr`$YbJpX*53Ptm`-fMi%2}HXdBMScw-tObQw)AP*<%fz!9e|J7 zx;01(qX%LpjFj$F^t?{on2Iib*TLz-&4`Q-e#|V`svkR6o{a$XvAOpnTT}(#JBoRa zGgC4KN@wQ)GT-Qhg*RbaIrmLZ*bBT&&HYlcTbX|CWJ`sU#mv;AJTGzfp_0thk7#@dyEK`l1cQ!fI`}90`kyPcEG`vLEI8ll)n>Uc zzM{R^I?e($ZH^lN(xXa56;&PagUgk`>3ECysMk$PS^*Y_c+sy^aw=b{%_XpJN`J^nD)HYrNm@&*l5W@ejD% zpZELy_INz5*A3HianrQHBP_K3<+L=d^H;`FCIZMj@8hj!yNYP={TuoNeaBj&M}M?L zgqQd4OUh0i<_<`2a{c6GFH*P;QhzQ&}85SN2gp z#^4ss%|_XF6YonNE4nbW9yVq&B+8FdrDQ;2pU*&a^iFXO$(%>)Ep2T>@W2k=b@bq8 zu2;>6YB`!RvZKcG5dPlGQ49vyMv8D=i|taoX-kf?7jX{vnPyk?CCr1}jR~TG%^X%b zH(6`edyHebsdlF5l+F(0Q8_Rgtg#8qS+%14&5b;Xnp1m@l^srXG9NZ!am{fJXFS3< zHqaQ?q5PM@PVsccPOCJ=+}5`i*)?_a23d%%iN<{n=BXv@kpMmZPl1qwNe|KSTk9jl8srZKgBaojGl(JwGM_VQXmj*rdxAz}PZ2|=&{-8Fu^&2*O+^Qf%K_Jf=zHADpCs6nW1v3j7f?THUTdb3{U*taRZS@D zCrR5#bwp6K>0kjNYwJ!}l}ouufaE0QQVQLb20#9MF`vno7E8j8H=DKe{dO(QL9_F6_KaETLN9L*{iz;J_9$5Q^7j!1zw?h z`I{KN5uhkn1GtKuc8I|68DD0h3dgZqHP`q!u^ja~MaP~ABJ9=R{|9>&_Eg}XSTj4% zcC}M9(KRB|*!9JpGqMXSJIyjQm1M|xaRVxF3=FRkas*hGteUvFBTn2HWUi0fJy7`h z%_hktoOt`cJQD?!&gUPD!qo;mEo{kmBh3Uf$x~d@_!imD^|`55vT?*Hg-S-8>7E&? z>DxA@mIm7mg#jeX5P)P!qSvG%7GgJvT86%gvETX7EO{jzB@X#EI&R>zlGi6BEke-3 z9p%j=K#xTeOhnN{=-G$|_+rJ>DX0jIT+3_Yt5;7P$Kymt$4`v@I<5Wg)%{SVktQ5vO!@(gQ+|O)O=O@_E0u z5df$kkpUa_b$;dJ)L_%TrftG(si)l=0G=>Z!F@SaQ;CmB#&*yWcws_Kw+pWF4r^9wH` zTe;sPK8i*;4-V_ZFzFZY2lej%Dv|LuM93rOAmjyM(4#9+OS3|3HyNEoNf_K{S)eG+ zv)jEiW#VAV$N7DC(NWAHq|sl=o~@qZ?`=iW<8MEx3f{Q$CBJO{o&a0FG99fj38%Ov z-+O|;F^;0el;v=GEx_L~YxE{hHDQ21tOuN%=7h7qwu0YBn!cc>VELHzMA@x?zGMz^ zh^a`}G{mE>gM@GpKh7radgjnO#XaBN&`H~rBA8&y8|Y-onjw#`!_arDRu$J!u4h*> z5|NEQhr6*rvRRA|+ChA-Jr(Y1Rlvo{6xu zuS>(c+VHoR^+??lT@?K9=vgvVB<-P=Jq%+YL-x($5hCcG5tWge^wJ%aW>>@cqs#Wm z*UBp54?efOZaJqG@fbtlqp=a9iJYPY1JApJ*0#!Wn0d<(g7_LVOI=u^4{riPR4a)p zB|()PDhQpRug2?VE}?u*CGl1{aI1?XkAvDGKL7C+-O)3#nn%W&3u!O+8|>;o^K2fgv9qB+;Q#p z@Mj~=UdYBHF>FP`6!mS*s{ZK&?MjD?Ur=O=V<@syp46{WnfP5QUDO$KNRP_)+wu1O z3CLxMFq<-bSk}sLPRSTrT%E;IKFEMw ziKS}xCkdO`B<$_4>FW-0`WgbROcJNBt+hRfW?AgHfX%h%CvQe4k_gDR)?eu>BG@q; zK<-o^?dX|QHLI3%{tRETe-B^5Zkjx{&czK<%X^rXlyh+43^%!-c}K=(l+EHoiRD?D zB^?0NJY+s?lQR9l(R8(dDk^;+*86sK5g71&Q1#OIJ+v8bK(~hiufXZ)mzU4JcT)1# z?FTugwPOQDZ&nUWJKneQidubE7w3vO^OMAzb0l89W5C-KzN0Aptg`f6iX{)5DG!J8 zdS%8N{T;;CxOrO5h^2V5Im5b#$k|D}8y5>t(~r%M`yb-aoa|ut!fvgpld z)VX)+ij&?uK!QdK2d936Ik&Qym1i1Fw&q9(IWFEQn6F-+c)~2(;^*TyTW5~HKTAvf z9nzEeqFai*i4=jLAj5`kfTNdyTJIRDcz3Z zV8;yt%_QHOH0082Dgca3U+VtnT(F!D$XKW?;fWAvfk;M+{rU2Fc8Znt|mn3-EV2p7ktX> zxMd4=)MWXhLkQK~keBV9{Op!9gVjaPR%=1&G$A%1XEnaiz2jxM1d3~cknsp z2W`@TbOK4>HUl=pfQW3<#}IdDti|B+De|p*2una(B>wat8~b2&IX}SG|8gw7Q?jkD zw%f2R0q!A*HPC>NxpoMuVGmYH3m~{uF-qih@ycmK(!_A0Cxc4y;s%2p++l!sBK-`7 zj1puF3l6K5%z`U6^xO2mk3EYKs$v-yHB-oKoXs8?|5Ec`Cze%a`sWb4??Vm>n&c%R7(hI2|Sf(5iWPZUK=U4YJrGw+nFRXrM8E&{-skvJTEkqs-fjB>&=U2b{_9L^x z4RX>^vfy%@c}qRba3(NmZU33H82*XXPnN>Aq)-b=XaFdC${dPbxo}8OdFP;W5u)CF zT&ooUbK-EVi@(Rw!xEI{3(1YGi>lN1tYIvDoP9({5wX0iUWxQhf%o)-o&=bLxX zw?&Vo-r{DPB3ivp&Vs3y%*Y4Jy21dfSD}`U7qityt0i0vr{bRpYuBk9-tKZ#1y_BH zI#1pgaBJ@AnNLg4|CMRU_oG$l?6tu9k1@y2yI-CDoB@Po3MVmG-3F21KO1%trs2830 zEBCF`d&ft%Kuopfff;M0A$D>oFd&mh=lnmc6G~O)MoeZG@x@Y+M5g{7i{D}|Jw-;? z@K2H(xR~{#O!T6rPzdJZnHu|=YrUwk0`n92=;jKbgX|=68UG4>2Z*6B1<@&N5-uw= zFgVoUZzhR7dWQS}&RP0sR)%{Ms&<_&d8VKouzLMCL{Lb|3>J~E$W%@cDu~{q@p(?K8uRJ@kIW#-q~&V`AIlVPH?Y$QZkYTMGJFCwcl5K?#d zgXEP|?3QFfg4ucm6kuvS1{RQo(wPurXviTD_VOt2i)}{OhZx|CU6H^BLR}f=xHfo! z)J03h9sdHtc@gfO3f=Vz%3S(rBq)0NQ>djYS%D4^X{Dg!IL}HrUfED7jyC*w{hUwV zwb$3&bSc;@Zqdl@t31gKHgGaTBC=xmHTAN!A_N_ZY|;h=Cs1IbZQ{rp2`Ez~g+!V# zJuk9H_ldP(hPqC=m6mIn}Z8t|p8hs0|teFQW0T zo)MpZY`p6QbQ74rbQ72V(oN{qEmdrz3R9kiZv4?rq}#_C6ATUd><=7E#5^`w#zqN1 z<2YnKF@Dp1@zS}#$&r5uQ-KXcq*j+GOx@R9Jj3cX?XHX0{cqpI!#`&tJ~pTV@bQ_5 z(_wnJqSQYEUpcV?qyGqe>-pf?acyTP$DZ&%dZkiBLPEm-xYj+d7h4JhzRH5TvG(0; z`GMTxfYpn*qCd?;UIY=9cQX@PDqjR0cpk*?#LB#pfBje9>kZ_+0Mgtd!^rM$OLg1ZOPU)Q_xsFA4S$fLfz_P!pAmhP3GV_LM=n7C*ONKjd(nK^ z=aEF)O!xaJ(KAdo~*7cb&;v`NraJwPM;GieZ zf_*&WPRiA7*`Fkr29=oM#+kr{veIQa;RO^gf;-DRV3=X{3X9mk94H;AqV`(|8iYU~*> zo;ZzLc$NvH)b8i$Uz@L~atQjSGIwCW*9>&p?-1M2a@KKoP1Il+kY+h{*EU`k7c-&H zE@BOw@v|SwJeE%ch%aRNhskLj=fA)XQe#LwJsjv`ibsZIE73`G+YHSg>PbI>z2u|% zTnju%ye0o!*#UkFhsZ_FNRCKq7z7cTxU5`t9&-rxc_2APmtTNUP&L*)ufrQRD3r;v zWR~<10sz9TCI0is@M~4a1*v(p0I45hx=yxCIW>SD(&WcWsD8`?;1c=uisgxU0Hy4l zCJ4WS&vu_VG`6aQ^+p2chnDZz3}~Ov8`V?7A(4tpN1xh{PO_{i3c*U7F&Ip5`uE{j zomTsg;%U^Y6f%5;;ynT(So1jGbsI3>#q7CfAdpbmANJ7AYH36K5_EDeQjsrIA^&k- z=$K*adM5Pop;Y-$jkoHXK4pfTz{ShT7qm(L`GeG-D=)7DOa|pE45%ka*v)p5^FIXm z%R$$yFcGiv^JBf9cJYE*mu2`49+ejGvAEe`x)AMNMjUWQrp+z0`vdiP;CI_`t=)`G zQk+yCtVpVN9IfT@Rr4ZTY$k6VUsxue65HI~{a|?D{nSB`acNd7GC_Yd==F~;{CllM zCr4qH)8N4E;@pCbcYdB;)~Y@1sTC%iz->vN8Qtj>0Bm}X2sYIgzTLK~bAu}Q`)d9- zD$$H0GUj%Ki{jnTC$qZmF#SlOa>&MBO5uFD0gLn3fd#k3`~meYeOM>XY;F9gv+oHb zg7do)tq9?K!T3tE{!m)Ag-!A2@62AgT@SZOXg>|wg6RPHe%xl>-1w&vNn?}&mf@73pKjWow0={>$ms%1t0Pr9k&|Ceq`BkJV$@$FfElBtk$32sePhdCjV`jQs8y?wf-HZ_er1|O;PiT{qx7r{HND1NNfE# z7(~+7v!MK~o*}1&0g{f@1pQU7w_AN0PM0Fvv`+b*bTEg@4R}NZ_#ld;s@Uhpo8h=q zXpt#7?LQ300rM>e8IZO8Z>~qFo41!%UtO8s6#&7=gQX69dKr(*8JjF-L04FuC1F}D zDsXS0-fkdUPL>(GjB{|3_(}4ywzy13!g*1EB%NQCT;9sNaXT9(Fg*i3q8OI^M9`5~ zauA`?aOOV)n#Zutli6{?+@rr7;M}Jf(Q8U(Lp$elR#pITKKV0VlE^@$Ia(=6$E?Q? zYyc1#2itUD)%=OMm_+L*@>%Jb@xk{S5=wmP_R5tgzt^8}epP{+q=>j1Z2E1BIb4># zBLm-@%%W+d|K+}QY50x4GqOE2E`D|PbrJr8p5{SPEN7RUt*JkEvziDzy>OC`?-H(k ziai7 zAQ?c^X?W**Wg40g`NepW^-nFUkK_!P@IKsl>nvEwWNV{ehMc;kAZdo7sx_aBg+I58 zSfYEf3nc)lS|2`)9krK~vEbJ^s8h7%NjK1fbS@hP_aAISM6N8N$H}JW_nz;Jb|ZU^ zhQn7wc*1RzM~mgwxIl|VJ9$c{B~nN#YH~DZ*xHYc6tTTB%u2dCfV$2*YZAt(JL0rc zrheIdzHyDn4L(M6pQ8u?ndU4Jq4~^drO>wvkz_4iAE}NJ-AsxAH+V}fdcHp8#m?a3 zt{(R7Uq*`ZKc%%A@E?_B`EPD;H+a?$Ky*)tXqcW>lNgYD+W!Y|ngbG>k{pBs_%{>i z6s(pw1&Yg~r z!447lcc<_b>^idP#L{}xt1MLcT$Nddd7GiY7dwMi$J=JFoL`9?9~%?trgOMH`_&`0 z!It@IozH0Y?9roaiqO2fo_2@15Mcu+t@RF!bVWple$?ij2HNcglG{_%TAK$3EG-dl z^*EGz0XCRaf9;tM_;y_s&Os-{yqNiY6m$G_9)m{nIP&Lg$qnc)ySC4d*gJ}VKx8Bh zXX4}XvHG!QSzi!~bIb#VCez9>qLIP`55_KVo?C`QR*o1<2t1JH6srid7_&_F6W<>) zjxy9*D^l?D6mvTmqP1Dt90)D<4olDaAP`gIO{7$PJ0k4^odOn4a!BRoc4d&YV{3xK z#|J5QdvSHy0Zt%m>he5GtwU|JYtqxjl+L^d_`3?=8HSWVM^EREKMGYt)&xhRu3vcl znf8ABy@;GFJi1Z*@dV!y@G#0$MfZBz*lngTwO$1cJ?=!kv7aRJYy0Qo`-@(s26bTv zqu!(qhg~h~|EB1uGqJnsHOZP^&;Ir6*HM^4OJs-(?{*J=M8GP6D&^GLdWq$TMhWQ2 zNv~Xf+QC_+FiW^P-ZB@j{7`!0asbXI3zK~k7kqJH*}zbru{!-~y-mj9 zL|@+|bZ1p*dN*Q<9juHKfIVl9)~4~3?MiOl7V_yr`)360&XZ7{3GbC&^8%+@ydfqS^`b|HJnp=`pubh z8NZltIj|!Y(r3)%(Uq1d=BYJRT`>wmi?%C8JC@rFr!5{=mt<8{mD`VfaWuVpSTR~Y zKCzMtd`1A6@Vo49_VaOSQC{b3ojx_4h!WKcpQ3Hc#GwLf&(ns|ciotf*iE`s3m7V@ zdI6kpPOZ??sUf)UsX*T9s;$$pK zUx;l*Mcv>r0#m+-L~}gdYaFe_L!AN8X7PxVXU@7!;=>kBDg~^ZzLrifVz=I~&u@{J z;$(n(*3uX45DYH#$-FmovvsM#I&B2ngOjxm{w4=619-v{QsJ@oQidaiVdEQ^hL>>Zsa!Y`YMax`w`--jrNOmsGt2sFDZ1Ce zeIQd6=QE0~z>MXkGQ5oz5$Y zR$J@T7Zr83zF84cjSSfP$5HrLh1=I(5%3nL<#w2D_Hx4FL+3?$j*?#Ui4@1 zbx3^T{THXo*-s=WnGP!z{zYTD+gY#Ph-;GD`+BY#K-4%pefyzT2Vb~)!BUwyDZneC zbjU2Nx(=mMf@e@!vj5P$k1v`Ml1E>Z>O%v>s?BC@A=c=Rk^LoC@Q6)<$NSnNu6gQw+-20jW@#h`zd*!g<=rd6s%T%=I{p#Em6bd z<><=R|2|42=IKL~o80S6i-WsOg|@P8$7sffIcQ4d;TXUaBQM#_&T3M>R^cbSzT=Hy zT|rWTap&&^9Q;r8=_LDO#Z%=tH^}!Z;MIZae|NnP$(&feQGzctO|z&FL{Mn^5^R{A z+rFqnFvFHd1bP}d8m0Z3S6pLaOBq<(EL9u+Vh z=dG%?Km6{2ytoFUw#&xc1jvkh-v%{)S(qMvsb>Q$O!o$Lm$2IGlY<%RiQ!;ejXOf79~i zTwtAL*#;@qF=<4<*=iEtH#_cmDKy(ffREw?aIIn9HLu2o;n+u^$hxF>8t_pd{{hSA zdKdHbehk-h_7a7_OpY^nkE2U}1ZRD}1ZS83EjWV%f-~sfg0rW^e+$m?rsAX}e{&g) zQdg4{A+E87%Y6g-Cp*WhYk1f9*38jzoX?GCgvtyv)BDroyfy$CMb;DE1YCd;wQ_!E z_1XLi*H0{$`DB}bn)4Y_!mE_6q`ZnpygDfT+T`ga6xNyOFX)nih4GP9h)2OBfPs?U zj^i2&cRg=}_Nn`vDHlj7%xX)02iv-jp^Ue)N)v4jDQ^YW81pf(4`mE!m_|(&ChaL+ z#XC>8C9uE8=2k|FiNyDh$rFAY6wj2G3&}SUH@oR9weAm&L2MG(8*y5v0HJajsa+Iu9ziR^O(HJ znx*0|aO-lcgLH`FbS@?4&HXB@nqoPsV9A_XV&f&`VL$I=0RxBI;`%}GTs<#ABD#6t z25YO!a*%}Y(3QZG;=eaDiZ6Qc?afKXT3FtcnQI`8GXe8ra~G)g*}+tz3RMS#T5n88 zBn$E;x|~;X_cz#G)@@tB)VkE1UIH=h>h9{3h&V5>uaQq2g3d1aR5Tj$W1-?m|3J;4 z+Yn!`4_ZVGg!2cY*SH!F8p4Yl2|6qaAfwtGoIKY%{in*Ekxf+JIGWS3O6bT!JeT3f zL!8>cd~vmy#CesXg|PR8_jEoCbII-DJ0d_si^M0G*F9e}2|tPQ5Av2LvrI8r%=Y<) z5nlkCC9JIE?o^qc{nEK)A$E58;$qB9e~I_}p0l6+ctV4Y67^#Ee0jq z7fF%bNNR^VCiDg8G$WM|kb6l<(PB;8jW3Msn| z^V;qDG+Fme*!;)zm=Z`h&ls9s@xIFLgN0EM00duIIjMb6+!mM0Wm+(|IgCJ*!k z2&W2L$#Q!@eZg$H(DAcCeSz}G-%EU~nCSutr*b+(dtg${{*Q&yw4}S`D}51Cgo2`g zC24Fq0@&49IT;A-Q$i<&;?UkY<2H2t@}JiN+7&dpF(PR7`ipif{u$@n3*UbBzG`iy ztryuG(9}Wx{0SHH2OtMwx97MRe>xkdADheekt^W&l?<_-c`nyBMH9BfIjmSu_Z~Wg zoo_lTB_CX<>h12*00IP^c$$>O0@s{FO+2rpJpiHc?3UCfgj7yGnO!krW3iFfI;wA4sxi2ors)zhNJ)Hd_V4Pu;b(k zbGX72-V~gFt*GQXm1p$oR^co>(TTIg`73K=_o@LI_G8>KJ!W*=oF@-_QPFg*OstoQ z{JCGL#w;xf@)17z@S^j1;q-Up%n@hB`6i+?XpI{FQaw! zTJ}NuO2HGS`asgz5T4`$_N^`wZ>vXMV(bFs1V#TNU=$DtY|S_LeqA%Wu1{e3Qv^gWcCUeADzOiOJ1Gk*Lh%X(xai0lrU_lTdO|{aD<)HMDVm~cyHvC zrrE6dv!5gtm#eKyHZvciFYC)XW;o5g7XNa#9P5K_JZB%Dcy!4?`{SFZ0`%^KRME@G z7$a=pGms2|)f9@7>-LSb~yDMAg zb}N|9wS%52T8x0EhIo&O_&|Lz>juy~|FAS+SPE5F9@SFq8r2lZ^Vwmyvz^ui&)6h5 z=RKG3de<_~3U&B8e)_wQyAEtt87o;7Vla6#{ASj>H)Mj{mq!z~DpT%;G%KF{SdIIU z6_c~lP-S#Fc9v9cw?|f{y#cR#B>I>|DlAXaF4HXGRhnzb<4-385P|!8xpv1a{GTLb zPwwyKJ%aX`9B$S~T6YZ(FDy0q$!{YsT4IIj-`P?GxOEB*Y93F8#f}o3fkoH^%|R-+ zh;#C4ac4_Eah(nCd?~zY^&yw9in|}Kg}1L~h??xeLF`?+&sK(UvA&M^ZY%@(Nm8Pq zuwn)dj5kZbR(C;COv2YUT>}HXnEkMFy8o~TzN355W{}Abc*^2KqQUQeS(Gr#{2fmK z@kl%peTXDojx$_EKZx18MLJ73Gz4l(1FM)vtSw0B|Be}R2N@xX2-5PRg*u_AP+k1Y(FvcR#7d!F>{PkVzpXl`c< zpW8YDK7Ju<(+z9yRQy>wY@$vDSuI{-o0>%x+_asR7c!nv4tU0q1=!eo`pTOtNpI-5 zxzVyA$|f1`)E=A+ypgUmdV^1s7}w4z&*w5PhP4+Br%9FBUPGpsD$oRfNXsQoh=zUN z3XRPaw=|Ej-HfKa!PSgtU!IES=3FtGe@2c}1_iAs^dYBzh1k+zLwRG%`;<3l^Kj5+ zGv+UXj#v82B^yLel!eOWS!O=sLx1JQn`hulXfISkV^|-S_Jn=bz zj+;n}lOJ8Ehr}>a@!Zv*)mqn3sr#m23b-e-4NH!_R|^r?t^3&aSJpUkX-oa*F1z=l zuHWhGB;^#KZei#kcdfL{%}Y5gQACo2)Q)SpbR0XTOpfr4(k1ln{Mo)|&3_P{4%ySMF%a?CCt6Q1q(Wim_r%F={XET8oo@EbqQi6B{8F z1-Jq4JGUJGvX@#w_CojCF2IvC<6Yt!IfwW8C4GV<5IhpS6DH7E4kwm5QkK~4^Q6EppWUdt!<-Es}jL4p^{_f0D_0beI^30tb_gPRhaWnuXo%$D4UTS4BI z8@YxsME2 zO$Nl9Ka+H3UN$%q4!&=pCoQRbq605=}WPi5iJ_-ex#1V*Uq$Uc84cvfx!!Y_9CIu z$?R1_i*i%~>{*1Cf`B%~Iy*S$lrNZ`aJQn5Rrg|S&u0!5g#1sEXEzTdBs3L{eJ6BD#z7Eo7?N)*4nEdw~di@#LG?W$Wu1gDKVfkU5iKyYh+Qnu?Hh ziFyGTa=JC*+hlXzwLd;3ty3K1n~v}|GT;4HPH_e%+oDaSTk~eh^{ec-qQQ^Rccs)ija|4%{K=`anV0P` zo)@a-Q3UGpvBT4yGV1*Yb@EjX1L`PmPk~l5>7ms!Um8KN0UO@nI&<1dC6}Sc z!HDk~>oxsP%^&&5Z6hNRLbpOvD7I5blAyrZne4HKq9D2^(G8K6h2=zd^DZ{Zg*SK? zUX7QfjdNPt65S+`CfgI63DfkTcEAydT8k7CVI*Z ztWA0)A2xXlD~Sr}AGu}pZ#$rQ^ASbxUVFuXLix9hB3GFxqo9ftONjfAoSztZ{K@%e|MLh9Isupc*bkVo4q6VzyuGC< z1Ac??|28YNYSA+P(oWm|mGg&Vl#N8VHKsH<8^z!t;JO{3^{`d6hkCNuk*@&-T0x+( zIy=-;-ua>`|F<7uSpjM`k3Yp2lOjx9h}Gu13qDBz#hGJm3JP0ia<*~V;}S|lulqeI zqSw8Qy2U;5P`|;SlZFe&o0-eJ(}D^frf&cIF!j^ASnqU7&oA|Ka((q%>796fnq$)o z3?pZszK(J_koIl>OaR#S=jBSAs@co*tOJJnvs2hK)LTK3UlD( z05`xcqLXADCz~hS<3c4qZ^@GOnh3j4e4HuI1_$n%QwlyDNVmv)b~piRwSt>qsZsv% z@-pRjYGTq2XxUyqRa@$|Up7CpD&hPR;~gX{IagC%eZQLSE0@x3BfVUY{YldrqV5(} zwZZUE2BK$@TjieD+B_0f(;zwMQG@B+H7#3IAqIZ6h$S`P3o1<3%9-Xu4Q1;L; z`Nuao!Rn$`G8FSe8SW4PqQtG^_p2| zUM=8pvP#r*C?pi+jidY|@&So>u*f98WVvC=HX^J<+k30ep0Itmw9)FfIA$x`J~YGPZs#|{=}bOS*;kuD&|L`oLinLD8Z7-Mb7=erW6Wp9vH*m13GyW�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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 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

nIg?JoE0pHHyEV$Owh&P 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

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 0305/1242] 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!` 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 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 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

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 0306/1242] 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 0307/1242] 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 0308/1242] 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 0309/1242] 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 88755aefcadd1af3ee17e932d875e502f30b0748 Mon Sep 17 00:00:00 2001 From: mkanski Date: Mon, 25 Mar 2019 17:44:52 +0100 Subject: [PATCH 0310/1242] Added support for reax/c/omp --- src/USER-OMP/pair_reaxc_omp.cpp | 10 ++-- src/USER-OMP/reaxc_forces_omp.cpp | 12 ++-- src/USER-OMP/reaxc_init_md_omp.cpp | 73 ++++++++++------------- src/USER-OMP/reaxc_valence_angles_omp.cpp | 19 +++--- src/USER-REAXC/reaxc_allocate.cpp | 8 +-- 5 files changed, 56 insertions(+), 66 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 63beb61be6..fe158e30d4 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -113,7 +113,7 @@ PairReaxCOMP::~PairReaxCOMP() if (setup_flag) { reax_list * bonds = lists+BONDS; for (int i=0; inum_intrs; ++i) - sfree(bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); + sfree(LAMMPS_NS::Pointers::lmp->error, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); } memory->destroy(num_nbrs_offset); @@ -210,7 +210,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) setup(); - Reset( system, control, data, workspace, &lists, world ); + Reset( system, control, data, workspace, &lists ); // Why not update workspace like in MPI-only code? // Using the MPI-only way messes up the hb energy @@ -411,12 +411,12 @@ void PairReaxCOMP::setup( ) // initialize my data structures - PreAllocate_Space( system, control, workspace, world ); + PreAllocate_Space( system, control, workspace ); write_reax_atoms(); int num_nbrs = estimate_reax_lists(); if(!Make_List(system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, - lists+FAR_NBRS, world)) + lists+FAR_NBRS)) error->all(FLERR,"Pair reax/c problem in far neighbor list"); write_reax_lists(); @@ -446,7 +446,7 @@ void PairReaxCOMP::setup( ) // check if I need to shrink/extend my data-structs - ReAllocate( system, control, data, workspace, &lists, mpi_data ); + ReAllocate( system, control, data, workspace, &lists ); } } diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 80741a46a8..96b27c4c26 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -289,9 +289,10 @@ void Validate_ListsOMP( reax_system *system, storage * /*workspace */, reax_list else comp = bonds->num_intrs; if (End_Index(i, bonds) > comp) { - fprintf( stderr, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", - step, i, End_Index(i,bonds), comp ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + char errmsg[256]; + snprintf(errmsg, 256, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", + step, i, End_Index(i,bonds), comp ); + system->error_ptr->all(FLERR,errmsg); } } } @@ -315,9 +316,10 @@ void Validate_ListsOMP( reax_system *system, storage * /*workspace */, reax_list else comp = hbonds->num_intrs; if (End_Index(Hindex, hbonds) > comp) { - fprintf(stderr,"step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", + char errmsg[256]; + snprintf(errmsg, 256, "step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", step, Hindex, End_Index(Hindex,hbonds), comp ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + system->error_ptr->all(FLERR, errmsg); } } } diff --git a/src/USER-OMP/reaxc_init_md_omp.cpp b/src/USER-OMP/reaxc_init_md_omp.cpp index bd15b3b9df..fe7682d035 100644 --- a/src/USER-OMP/reaxc_init_md_omp.cpp +++ b/src/USER-OMP/reaxc_init_md_omp.cpp @@ -43,7 +43,7 @@ extern int Init_MPI_Datatypes(reax_system*, storage*, mpi_datatypes*, MPI_Comm, char*); extern int Init_System(reax_system*, control_params*, char*); extern int Init_Simulation_Data(reax_system*, control_params*, simulation_data*, char*); -extern int Init_Workspace(reax_system*, control_params*, storage*, MPI_Comm, char*); +extern int Init_Workspace(reax_system*, control_params*, storage*, char*); /* ---------------------------------------------------------------------- */ @@ -63,7 +63,7 @@ int Init_ListsOMP( reax_system *system, control_params *control, bond_top = (int*) calloc( system->total_cap, sizeof(int) ); hb_top = (int*) calloc( system->local_cap, sizeof(int) ); Estimate_Storages( system, control, lists, - &Htop, hb_top, bond_top, &num_3body, comm ); + &Htop, hb_top, bond_top, &num_3body ); if (control->hbond_cut > 0) { /* init H indexes */ @@ -75,9 +75,8 @@ int Init_ListsOMP( reax_system *system, control_params *control, total_hbonds = (int)(MAX( total_hbonds*saferzone, mincap*MIN_HBONDS )); if( !Make_List( system->Hcap, total_hbonds, TYP_HBOND, - *lists+HBONDS, comm ) ) { - fprintf( stderr, "not enough space for hbonds list. terminating!\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + *lists+HBONDS ) ) { + system->error_ptr->one( FLERR, "Not enough space for hbonds list. Terminating!" ); } } @@ -89,9 +88,8 @@ int Init_ListsOMP( reax_system *system, control_params *control, bond_cap = (int)(MAX( total_bonds*safezone, mincap*MIN_BONDS )); if( !Make_List( system->total_cap, bond_cap, TYP_BOND, - *lists+BONDS, comm ) ) { - fprintf( stderr, "not enough space for bonds list. terminating!\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + *lists+BONDS ) ) { + system->error_ptr->one( FLERR, "Not enough space for bonds list. Terminating!\n" ); } int nthreads = control->nthreads; @@ -99,15 +97,14 @@ int Init_ListsOMP( reax_system *system, control_params *control, for (i = 0; i < bonds->num_intrs; ++i) bonds->select.bond_list[i].bo_data.CdboReduction = - (double*) smalloc(sizeof(double)*nthreads, "CdboReduction", comm); + (double*) smalloc(system->error_ptr, sizeof(double)*nthreads, "CdboReduction"); /* 3bodies list */ cap_3body = (int)(MAX( num_3body*safezone, MIN_3BODIES )); if( !Make_List( bond_cap, cap_3body, TYP_THREE_BODY, - *lists+THREE_BODIES, comm ) ){ + *lists+THREE_BODIES ) ){ - fprintf( stderr, "Problem in initializing angles list. Terminating!\n" ); - MPI_Abort( comm, INSUFFICIENT_MEMORY ); + system->error_ptr->one( FLERR, "Problem in initializing angles list. Terminating!" ); } free( hb_top ); @@ -125,60 +122,50 @@ void InitializeOMP( reax_system *system, control_params *control, mpi_datatypes *mpi_data, MPI_Comm comm ) { char msg[MAX_STR]; + char errmsg[512]; if (Init_MPI_Datatypes(system, workspace, mpi_data, comm, msg) == FAILURE) { - fprintf( stderr, "p%d: init_mpi_datatypes: could not create datatypes\n", - system->my_rank ); - fprintf( stderr, "p%d: mpi_data couldn't be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + system->error_ptr->one( FLERR, "init_mpi_datatypes: could not create datatypes. " + "Mpi_data couldn't be initialized! Terminating."); } if (Init_System(system, control, msg) == FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: system could not be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf( errmsg, 512, "Error on: %s. " + "System could not be initialized! Terminating.", msg ); + system->error_ptr->one(FLERR, errmsg); } if (Init_Simulation_Data( system, control, data, msg ) == FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: sim_data couldn't be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf( errmsg, 512, "Error on: %s. " + "Sim_data couldn't be initialized! Terminating.", msg ); + system->error_ptr->one(FLERR, errmsg); } - if (Init_Workspace( system, control, workspace, mpi_data->world, msg ) == + if (Init_Workspace( system, control, workspace, msg ) == FAILURE) { - fprintf( stderr, "p%d:init_workspace: not enough memory\n", - system->my_rank ); - fprintf( stderr, "p%d:workspace couldn't be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + system->error_ptr->one(FLERR, "init_workspace: not enough memory. " + "Workspace couldn't be initialized! Terminating."); } if (Init_ListsOMP( system, control, data, workspace, lists, mpi_data, msg ) == FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: system could not be initialized! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf( errmsg, 512, "Error on: %s. " + "System could not be initialized! Terminating.", msg ); + system->error_ptr->one(FLERR, errmsg); } if (Init_Output_Files(system,control,out_control,mpi_data,msg)== FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: could not open output files! terminating...\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf( errmsg, 512, "Error on: %s" + "Could not open output files! Terminating.", msg ); + system->error_ptr->one(FLERR, errmsg); } if (control->tabulate) { if (Init_Lookup_Tables( system, control, workspace, mpi_data, msg ) == FAILURE) { - fprintf( stderr, "p%d: %s\n", system->my_rank, msg ); - fprintf( stderr, "p%d: couldn't create lookup table! terminating.\n", - system->my_rank ); - MPI_Abort( mpi_data->world, CANNOT_INITIALIZE ); + snprintf( errmsg, 512, "Error on: %s." + " Couldn't create lookup table! Terminating.", msg ); + system->error_ptr->one(FLERR, errmsg); } } diff --git a/src/USER-OMP/reaxc_valence_angles_omp.cpp b/src/USER-OMP/reaxc_valence_angles_omp.cpp index 4164d39cab..195f16a75d 100644 --- a/src/USER-OMP/reaxc_valence_angles_omp.cpp +++ b/src/USER-OMP/reaxc_valence_angles_omp.cpp @@ -237,12 +237,12 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, // Confirm that thb_intrs->num_intrs / nthreads is enough to hold all angles from a single atom if(my_offset >= (tid+1)*per_thread) { - int me; - MPI_Comm_rank(MPI_COMM_WORLD,&me); - fprintf( stderr, "step%d-ran out of space on angle_list on proc %i for atom %i:", data->step, me, j); - fprintf( stderr, " nthreads= %d, tid=%d, my_offset=%d, per_thread=%d\n", nthreads, tid, my_offset, per_thread); - fprintf( stderr, " num_intrs= %i N= %i\n",thb_intrs->num_intrs , system->N); - MPI_Abort( MPI_COMM_WORLD, INSUFFICIENT_MEMORY ); + char errmsg[512]; + snprintf( errmsg, 512, "step%d-ran out of space on angle_list for atom %i:\n" + " nthreads= %d, tid=%d, my_offset=%d, per_thread=%d\n" + " num_intrs= %i N= %i\n" + , data->step, j, nthreads, tid, my_offset, per_thread,thb_intrs->num_intrs , system->N); + control->error_ptr->one(FLERR, errmsg); } // Number of angles owned by this atom @@ -601,9 +601,10 @@ void Valence_AnglesOMP( reax_system *system, control_params *control, if (num_thb_intrs >= thb_intrs->num_intrs * DANGER_ZONE) { workspace->realloc.num_3body = num_thb_intrs * TWICE; if (num_thb_intrs > thb_intrs->num_intrs) { - fprintf( stderr, "step%d-ran out of space on angle_list: top=%d, max=%d", - data->step, num_thb_intrs, thb_intrs->num_intrs ); - MPI_Abort( MPI_COMM_WORLD, INSUFFICIENT_MEMORY ); + char errmsg[128]; + snprintf(errmsg, 128, "step%d-ran out of space on angle_list: top=%d, max=%d", + data->step, num_thb_intrs, thb_intrs->num_intrs); + control->error_ptr->one(FLERR, errmsg); } } diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index 7649c110ef..ff829db3dc 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -306,12 +306,12 @@ int Allocate_Workspace( reax_system * /*system*/, control_params * control, // storage for reductions with multiple threads #ifdef LMP_USER_OMP workspace->CdDeltaReduction = (double *) scalloc(control->error_ptr, sizeof(double), total_cap*control->nthreads, - "cddelta_reduce", comm); + "cddelta_reduce"); workspace->forceReduction = (rvec *) scalloc(control->error_ptr, sizeof(rvec), total_cap*control->nthreads, - "forceReduction", comm); + "forceReduction"); - workspace->valence_angle_atom_myoffset = (int *) scalloc(control->error_ptr, sizeof(int), total_cap, "valence_angle_atom_myoffset", comm); + workspace->valence_angle_atom_myoffset = (int *) scalloc(control->error_ptr, sizeof(int), total_cap, "valence_angle_atom_myoffset"); workspace->my_ext_pressReduction = (rvec *) calloc(sizeof(rvec), control->nthreads); #else LMP_UNUSED_PARAM(control); @@ -391,7 +391,7 @@ static int Reallocate_Bonds_List( reax_system *system, reax_list *bonds, if (system->omp_active) for (i = 0; i < bonds->num_intrs; ++i) bonds->select.bond_list[i].bo_data.CdboReduction = - (double*) smalloc(system->error_ptr, sizeof(double)*nthreads, "CdboReduction", comm); + (double*) smalloc(system->error_ptr, sizeof(double)*nthreads, "CdboReduction"); #endif return SUCCESS; From eedc88eb9b82701740e48903634395e7990b2cf3 Mon Sep 17 00:00:00 2001 From: mkanski Date: Mon, 25 Mar 2019 18:01:31 +0100 Subject: [PATCH 0311/1242] MPI_Abort removed from reax/c/kk + fixed some declarations --- src/KOKKOS/pair_reaxc_kokkos.cpp | 74 ++++++++++++++------------------ src/USER-REAXC/reaxc_lookup.h | 4 +- 2 files changed, 35 insertions(+), 43 deletions(-) diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 9930894f45..ec9ba79682 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -447,23 +447,23 @@ int PairReaxCKokkos::Init_Lookup_Tables() num_atom_types = atom->ntypes; dr = control->nonb_cut / control->tabulate; h = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:h", world ); + smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:h"); fh = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fh", world ); + smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fh"); fvdw = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fvdw", world ); + smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fvdw"); fCEvd = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fCEvd", world ); + smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEvd"); fele = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fele", world ); + smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fele"); fCEclmb = (double*) - smalloc( (control->tabulate+2) * sizeof(double), "lookup:fCEclmb", world ); + smalloc( control->error_ptr, (control->tabulate+2) * sizeof(double), "lookup:fCEclmb"); LR = (LR_lookup_table**) - scalloc( num_atom_types+1, sizeof(LR_lookup_table*), "lookup:LR", world ); + scalloc( control->error_ptr, num_atom_types+1, sizeof(LR_lookup_table*), "lookup:LR"); for( i = 0; i < num_atom_types+1; ++i ) LR[i] = (LR_lookup_table*) - scalloc( num_atom_types+1, sizeof(LR_lookup_table), "lookup:LR[i]", world ); + scalloc( control->error_ptr, num_atom_types+1, sizeof(LR_lookup_table), "lookup:LR[i]"); for( i = 1; i <= num_atom_types; ++i ) { for( j = i; j <= num_atom_types; ++j ) { @@ -473,22 +473,18 @@ int PairReaxCKokkos::Init_Lookup_Tables() LR[i][j].dx = dr; LR[i][j].inv_dx = control->tabulate / control->nonb_cut; LR[i][j].y = (LR_data*) - smalloc( LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y", world ); + smalloc( control->error_ptr, LR[i][j].n * sizeof(LR_data), "lookup:LR[i,j].y"); LR[i][j].H = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H" , - world ); + smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].H"); LR[i][j].vdW = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW", - world); + smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].vdW"); LR[i][j].CEvd = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd", - world); + smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].CEvd"); LR[i][j].ele = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele", - world ); + smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef),"lookup:LR[i,j].ele"); LR[i][j].CEclmb = (cubic_spline_coef*) - smalloc( LR[i][j].n*sizeof(cubic_spline_coef), - "lookup:LR[i,j].CEclmb", world ); + smalloc( control->error_ptr, LR[i][j].n*sizeof(cubic_spline_coef), + "lookup:LR[i,j].CEclmb"); for( r = 1; r <= control->tabulate; ++r ) { LR_vdW_Coulomb(i, j, r * dr, &(LR[i][j].y[r]) ); @@ -512,24 +508,20 @@ int PairReaxCKokkos::Init_Lookup_Tables() vlast_vdw = fCEvd[r-1]; vlast_ele = fele[r-1]; - Natural_Cubic_Spline( &h[1], &fh[1], - &(LR[i][j].H[1]), control->tabulate+1, world ); + Natural_Cubic_Spline( control->error_ptr, &h[1], &fh[1], + &(LR[i][j].H[1]), control->tabulate+1 ); - Complete_Cubic_Spline( &h[1], &fvdw[1], v0_vdw, vlast_vdw, - &(LR[i][j].vdW[1]), control->tabulate+1, - world ); + Complete_Cubic_Spline( control->error_ptr, &h[1], &fvdw[1], v0_vdw, vlast_vdw, + &(LR[i][j].vdW[1]), control->tabulate+1 ); - Natural_Cubic_Spline( &h[1], &fCEvd[1], - &(LR[i][j].CEvd[1]), control->tabulate+1, - world ); + Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEvd[1], + &(LR[i][j].CEvd[1]), control->tabulate+1 ); - Complete_Cubic_Spline( &h[1], &fele[1], v0_ele, vlast_ele, - &(LR[i][j].ele[1]), control->tabulate+1, - world ); + Complete_Cubic_Spline( control->error_ptr, &h[1], &fele[1], v0_ele, vlast_ele, + &(LR[i][j].ele[1]), control->tabulate+1 ); - Natural_Cubic_Spline( &h[1], &fCEclmb[1], - &(LR[i][j].CEclmb[1]), control->tabulate+1, - world ); + Natural_Cubic_Spline( control->error_ptr, &h[1], &fCEclmb[1], + &(LR[i][j].CEclmb[1]), control->tabulate+1 ); } } free(h); @@ -555,16 +547,16 @@ void PairReaxCKokkos::Deallocate_Lookup_Tables() for( i = 0; i <= ntypes; ++i ) { for( j = i; j <= ntypes; ++j ) if (LR[i][j].n) { - sfree( LR[i][j].y, "LR[i,j].y" ); - sfree( LR[i][j].H, "LR[i,j].H" ); - sfree( LR[i][j].vdW, "LR[i,j].vdW" ); - sfree( LR[i][j].CEvd, "LR[i,j].CEvd" ); - sfree( LR[i][j].ele, "LR[i,j].ele" ); - sfree( LR[i][j].CEclmb, "LR[i,j].CEclmb" ); + sfree( control->error_ptr, LR[i][j].y, "LR[i,j].y" ); + sfree( control->error_ptr, LR[i][j].H, "LR[i,j].H" ); + sfree( control->error_ptr, LR[i][j].vdW, "LR[i,j].vdW" ); + sfree( control->error_ptr, LR[i][j].CEvd, "LR[i,j].CEvd" ); + sfree( control->error_ptr, LR[i][j].ele, "LR[i,j].ele" ); + sfree( control->error_ptr, LR[i][j].CEclmb, "LR[i,j].CEclmb" ); } - sfree( LR[i], "LR[i]" ); + sfree( control->error_ptr, LR[i], "LR[i]" ); } - sfree( LR, "LR" ); + sfree( control->error_ptr, LR, "LR" ); } /* ---------------------------------------------------------------------- */ diff --git a/src/USER-REAXC/reaxc_lookup.h b/src/USER-REAXC/reaxc_lookup.h index 6d6aae2f8e..3fd0c2581a 100644 --- a/src/USER-REAXC/reaxc_lookup.h +++ b/src/USER-REAXC/reaxc_lookup.h @@ -32,10 +32,10 @@ void Tridiagonal_Solve( const double *a, const double *b, double *c, double *d, double *x, unsigned int n); -void Natural_Cubic_Spline( LAMMPS_NS::LAMMPS*, const double *h, const double *f, +void Natural_Cubic_Spline( LAMMPS_NS::Error*, const double *h, const double *f, cubic_spline_coef *coef, unsigned int n ); -void Complete_Cubic_Spline( LAMMPS_NS::LAMMPS*, const double *h, const double *f, double v0, double vlast, +void Complete_Cubic_Spline( LAMMPS_NS::Error*, const double *h, const double *f, double v0, double vlast, cubic_spline_coef *coef, unsigned int n ); int Init_Lookup_Tables( reax_system*, control_params*, storage*, From 3e8c1c801bc50822dff13447dd1b902495638510 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 25 Mar 2019 14:03:29 -0400 Subject: [PATCH 0312/1242] 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 0313/1242] 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 0314/1242] 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 0315/1242] 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 0316/1242] 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 0317/1242] 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 0318/1242] 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 0319/1242] 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 0320/1242] 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 0321/1242] 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 0322/1242] 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 0323/1242] 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 0324/1242] 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 0325/1242] 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 0326/1242] 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 8c99752cecfc1b4508ec2ff2d05f4023079bd98b Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Tue, 19 Feb 2019 10:40:24 +0200 Subject: [PATCH 0327/1242] Add fix elstop to USER-MISC Implements inelastic energy loss for fast particles in solids. --- doc/src/Commands_fix.txt | 1 + doc/src/Eqs/fix_elstop.jpg | Bin 0 -> 2262 bytes doc/src/Eqs/fix_elstop.tex | 13 + doc/src/fix.txt | 1 + doc/src/fix_elstop.txt | 163 +++++ doc/src/fixes.txt | 1 + doc/src/lammps.book | 1 + doc/utils/sphinx-config/false_positives.txt | 6 + examples/USER/misc/elstop/Si.Si.elstop | 14 + examples/USER/misc/elstop/Si.sw | 1 + examples/USER/misc/elstop/in.elstop | 38 ++ examples/USER/misc/elstop/in.elstop.only | 39 ++ .../USER/misc/elstop/log.20Mar19.elstop.g++.1 | 597 ++++++++++++++++++ .../USER/misc/elstop/log.20Mar19.elstop.g++.4 | 597 ++++++++++++++++++ .../misc/elstop/log.20Mar19.elstop.only.g++.1 | 198 ++++++ .../misc/elstop/log.20Mar19.elstop.only.g++.4 | 198 ++++++ src/USER-MISC/README | 1 + src/USER-MISC/fix_elstop.cpp | 326 ++++++++++ src/USER-MISC/fix_elstop.h | 111 ++++ 19 files changed, 2306 insertions(+) create mode 100644 doc/src/Eqs/fix_elstop.jpg create mode 100644 doc/src/Eqs/fix_elstop.tex create mode 100644 doc/src/fix_elstop.txt create mode 100644 examples/USER/misc/elstop/Si.Si.elstop create mode 120000 examples/USER/misc/elstop/Si.sw create mode 100644 examples/USER/misc/elstop/in.elstop create mode 100644 examples/USER/misc/elstop/in.elstop.only create mode 100644 examples/USER/misc/elstop/log.20Mar19.elstop.g++.1 create mode 100644 examples/USER/misc/elstop/log.20Mar19.elstop.g++.4 create mode 100644 examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.1 create mode 100644 examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.4 create mode 100644 src/USER-MISC/fix_elstop.cpp create mode 100644 src/USER-MISC/fix_elstop.h diff --git a/doc/src/Commands_fix.txt b/doc/src/Commands_fix.txt index 678cc9ba0d..ad884f7bd8 100644 --- a/doc/src/Commands_fix.txt +++ b/doc/src/Commands_fix.txt @@ -61,6 +61,7 @@ OPT. "edpd/source"_fix_dpd_source.html, "efield"_fix_efield.html, "ehex"_fix_ehex.html, +"elstop"_fix_elstop.html, "enforce2d (k)"_fix_enforce2d.html, "eos/cv"_fix_eos_cv.html, "eos/table"_fix_eos_table.html, diff --git a/doc/src/Eqs/fix_elstop.jpg b/doc/src/Eqs/fix_elstop.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e862c938f0ee1d8795bacd7c69cf029e48dc913f GIT binary patch literal 2262 zcmb7E3p7;w8sD?`o?*;j&zNDz@t8bQneiB+GLBRx-SOx}WOR^lI3pJ!49cTH-gR7c zG>9IGL@7N8cd00Gyh0T2jE86_BHtSlA_!&o^P8JsLpjz}cP5eV`MWJF$pq(C4b$_Pn` zLZwoPiYhc^3XM#mQlyt)Ak+rN;;~pfMV=r}`M*ih2#{m}F3=8PNB~H}KqQRhF`y1$ z01%S8yGk$)gs?IgS@e|huli+xq#qzcs0{)k0DxI?SvC8&7kOXCT}`%Bd0AEYOw8t2 zPiJ^U&QV|e#C*RnRIj*h3*31uRc7;z!jztL(YMm=vyz2f^6_v!(TA`;aNz)K zO;7eO-+E1S@Lo5PT}|$3Y!{{+OnSUayZ#5yeP7OsHGXH+X|_7h9!7Rvzfz>S1T4lL zlvaSW8pBE`@qc)ZmdpkN#(f0=t|BbabU)~D~dF@x>9Hf{*; ze-Itw`w(ZIslI=M!wJG2gXBX`)$lJrg==09K3_st#^%|Z2Bks;j;^(o(Tc0DrhoS7 zT{HQnq=VOzyf9odaI7X*e5QxQcdq!zoIC~oB915Oy^gVpj_`9*kEG9Xe$om1N8;$o zO}S;>0o#mjKbqB;{NAdW&)ylFrJJ2&2#!Ww&CJI#&IB24w$kv7``~Dib8oijjnU5% z;C+(U+{v4jejh^G&6_>l^T{Qwi>aHt)rii`?iY?;<~`@iH|UI8SKZUC@zhgCj+C_H zrph{_#&rHhY&C4N>QA)sus6D9@?q?F_0Y7OrU$X1;%0#%f%NTzq-mS<^zi(SZ_JCm z7OGlru|gv`v&CN8Prq2i;-)9L)(hu?YA?`5vrT=?)rDWC9>&rp-*hPMt8<_0xO#ZZ zly<1Bn}*f54`hy{MFk{1i**e+AwSK@`||GfkA<=GCG=m%^|oH>xM53Hv^&-7dhRmU z{IN&Wg>yYO9&tkU_jQSF!dZbMe$}~_rPiTg^f!V-GIpa0HEXiNPdLDFT)cP=^3VGF zPy=jPo=w@-YCNo}z$!_9l%z_!P7x|sa9;ECO?o*g>ZcN-hXRvyN?Z4_qTlCzut_>iu?U55%XJW4EBrkdPI5d3+{(v=W}yd zU$*JqW;xCr`i26OhaVrNI?P}Djnu(9^&2ZF)ZB^k(*8H@0P_)~vZvBb} zi7m`#6BpKcf2AjGUicuF(4MV@gL54-Ph3CWZ8);=cfBR!GI4H9R)g_gKYNk={;J{- z-?+OGA>|t{B}6^*Ycj^4r+bI@xGtS8$R%^4dxt*_biN#?4Xyni-WzGkVMUHCf;N`B z!|FxXGVn7$JuZl-+wG8-$-@hFe$?$hCaeUCF2&e&3l81atTZp{JKA#Rb3;>*|4Aha z=gh6IqTjnD7@Sx!uCclki5k&NjOEv26mwBrq zG-#u@uUE4Da`q-vI#pIjJKltOsc9qu&|ePA3l8{(`4b42ql$&d*NtGlsWcq*R=(RvW*irSR5CJt`Gs zIw#CG_`I)8T9>~8U^*f?&ohCl_2s3{x9pfy)}U-|v1u`p05t;9mf^!))O3#wA0047 z1S7Wkmkqk-mbz%W8WJiuSvU?m*m~mfH5vtbpn!KW5yl1PRh&_nR~yO;%u*{viZ!AL<@Bk7H3`%-p4oT1y^re0W4AuXc#t2a|5mDEpE(|dFa#uxZIc9kLiJ!I z9O)#Ow0P0(PN)e9@(%lWI>kcH$LekP(ws$VT19Tmk&$~EslMgOAE!9JZ}0 wQG=JxCk(4U>C?HF=639WS2~otK{Z~8*Zt(N&FCP~m8OC;0-27BUXs3l0^?FYX#fBK literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/fix_elstop.tex b/doc/src/Eqs/fix_elstop.tex new file mode 100644 index 0000000000..760ded00f1 --- /dev/null +++ b/doc/src/Eqs/fix_elstop.tex @@ -0,0 +1,13 @@ +\documentclass[12pt]{article} + +\begin{document} + +$$ + {\vec F}_i = {\vec F}^{0}_i - \frac{{\vec v}_i}{\|\vec{v}_i\|}\cdot S_e +$$ + +\end{document} + + + + diff --git a/doc/src/fix.txt b/doc/src/fix.txt index 395f2ad7a9..fa34dc17de 100644 --- a/doc/src/fix.txt +++ b/doc/src/fix.txt @@ -199,6 +199,7 @@ accelerated styles exist. "edpd/source"_fix_dpd_source.html - "efield"_fix_efield.html - impose electric field on system "ehex"_fix_ehex.html - enhanced heat exchange algorithm +"elstop"_fix_elstop.html - electronic stopping power as a friction force "enforce2d"_fix_enforce2d.html - zero out z-dimension velocity and force "eos/cv"_fix_eos_cv.html - "eos/table"_fix_eos_table.html - diff --git a/doc/src/fix_elstop.txt b/doc/src/fix_elstop.txt new file mode 100644 index 0000000000..75bb2ef101 --- /dev/null +++ b/doc/src/fix_elstop.txt @@ -0,0 +1,163 @@ +"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 + +fix elstop command :h3 + +[Syntax:] + +fix ID group-ID elstop Ecut file keyword value ... :pre + +ID, group-ID are documented in "fix"_fix.html command :ulb,l +elstop = style name of this fix command :l +Ecut = minimum kinetic energy for electronic stopping (energy units) :l +file = name of the file containing the electronic stopping power table :l +zero or more keyword/value pairs may be appended to args :l +keyword = {region} or {minneigh} :l + {region} value = region-ID + region-ID = region, whose atoms will be affected by this fix + {minneigh} value = minneigh + minneigh = minimum number of neighbors for atoms to have elstop applied :pre +:ule + +[Examples:] + +fix el all elstop 10.0 elstop-table.txt +fix el all elstop 10.0 elstop-table.txt minneigh 3 +fix el mygroup elstop 1.0 elstop-table.txt region bulk :pre + +[Description:] + +This fix implements inelastic energy loss for fast projectiles in solids. It +applies a friction force to fast moving atoms to slow them down due to +"electronic stopping"_#elstopping (energy lost via electronic collisions per +unit of distance). This fix should be used for simulation of irradiation +damage or ion implantation, where the ions can lose noticeable amounts of +energy from electron excitations. If the electronic stopping power is not +considered, the simulated range of the ions can be severely overestimated +("Nordlund98"_#Nordlund98, "Nordlund95"_#Nordlund95). + +The electronic stopping is implemented by applying a friction force +to each atom as: + +:c,image(Eqs/fix_elstop.jpg) + +where \(\vec\{F\}_i\) is the resulting total force on the atom. \(\vec\{F\}^0_i\) +is the original force applied to the atom, \(\vec\{v\}_i\) is its velocity and +\(S_e\) is the stopping power of the ion. + +NOTE: In addition to electronic stopping, atomic cascades and irradiation +simulations require the use of an adaptive timestep (see +"fix dt/reset"_fix_dt_reset.html) and the repulsive ZBL potential (see +"ZBL"_pair_zbl.html potential) or similar. Without these settings the +interaction between the ion and the target atoms will be faulty. It is also +common to use in such simulations a thermostat ("fix_nvt"_fix_nh.html) in +the borders of the simulation cell. + +NOTE: This fix removes energy from fast projectiles without depositing it as a +heat to the simulation cell. Such implementation might lead to the unphysical +results when the amount of energy deposited to the electronic system is large, +e.g. simulations of Swift Heavy Ions (energy per nucleon of 100 keV/amu or +higher) or multiple projectiles. You could compensate energy loss by coupling +bulk atoms with some thermostat or control heat transfer between electronic and +atomic subsystems with the two-temperature model ("fix_ttm"_fix_ttm.html). + +At low velocities the electronic stopping is negligible. The electronic +friction is not applied to atoms whose kinetic energy is smaller than {Ecut}, +or smaller than the lowest energy value given in the table in {file}. +Electronic stopping should be applied only when a projectile reaches bulk +material. This fix scans neighbor list and excludes atoms with fewer than +{minneigh} neighbors (by default one). If the pair potential cutoff is large, +minneigh should be increased, though not above the number of nearest neighbors +in bulk material. An alternative is to disable the check for neighbors by +setting {minneigh} to zero and using the {region} keyword. This is necessary +when running simulations of cluster bombardment. + +If the {region} keyword is used, the atom must also be in the specified geometric +"region"_region.html in order to have electronic stopping applied to it. This is +useful if the position of the bulk material is fixed. By default the electronic +stopping is applied everywhere in the simulation cell. + +:line + +The energy ranges and stopping powers are read from the file {file}. +Lines starting with {#} and empty lines are ignored. Otherwise each +line must contain exactly [N+1] numbers, where [N] is the number of atom +types in the simulation. + +The first column is the energy for which the stopping powers on that +line apply. The energies must be sorted from the smallest to the largest. +The other columns are the stopping powers \(S_e\) for each atom type, +in ascending order, in force "units"_units.html. The stopping powers for +intermediate energy values are calculated with linear interpolation between +2 nearest points. + +For example: + +# This is a comment +# atom-1 atom-2 +# eV eV/Ang eV/Ang # units metal + 10 0 0 +250 60 80 +750 100 150 :pre + + +If an atom which would have electronic stopping applied to it has a +kinetic energy higher than the largest energy given in {file}, LAMMPS +will exit with an error message. + +The stopping power depends on the energy of the ion and the target +material. The electronic stopping table can be obtained from +scientific publications, experimental databases or by using +"SRIM"_#SRIM software. Other programs such as "CasP"_#CasP or +"PASS"_#PASS can calculate the energy deposited as a function +of the impact parameter of the ion; these results can be used +to derive the stopping power. + +[Restart, fix_modify, output, run start/stop, minimize info:] + +No information about this fix is written to "binary restart +files"_restart.html. + +The "fix_modify"_fix_modify.html options are not supported. + +This fix computes a global scalar, which can be accessed by various +"output commands"_Howto_output.html. The scalar is the total energy +loss from electronic stopping applied by this fix since the start of +the latest run. It is considered "intensive". + +The {start/stop} keywords of the "run"_run.html command have no effect +on this fix. + +[Restrictions:] + +This pair style is part of the USER-MISC package. It is only enabled if +LAMMPS was built with that package. See the "Build package"_Build_package.html +doc page for more info. + +[Default:] + +The default is no limitation by region, and minneigh = 1. + +:line +:link(elstopping) +[(electronic stopping)] Wikipedia - Electronic Stopping Power: https://en.wikipedia.org/wiki/Stopping_power_%28particle_radiation%29 + +:link(Nordlund98) +[(Nordlund98)] Nordlund, Kai, et al. Physical Review B 57.13 (1998): 7556. + +:link(Nordlund95) +[(Nordlund95)] Nordlund, Kai. Computational materials science 3.4 (1995): 448-456. + +:link(SRIM) +[(SRIM)] SRIM webpage: http://www.srim.org/ + +:link(CasP) +[(CasP)] CasP webpage: https://www.helmholtz-berlin.de/people/gregor-schiwietz/casp_en.html + +:link(PASS) +[(PASS)] PASS webpage: https://www.sdu.dk/en/DPASS diff --git a/doc/src/fixes.txt b/doc/src/fixes.txt index 3853bb77a9..7bbf269a2c 100644 --- a/doc/src/fixes.txt +++ b/doc/src/fixes.txt @@ -40,6 +40,7 @@ Fixes :h1 fix_dt_reset fix_efield fix_ehex + fix_elstop fix_enforce2d fix_eos_cv fix_eos_table diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 6b220ed241..692ffcd712 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -264,6 +264,7 @@ fix_drude_transform.html fix_dt_reset.html fix_efield.html fix_ehex.html +fix_elstop.html fix_enforce2d.html fix_eos_cv.html fix_eos_table.html diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 6eb158396f..6d376d7b1f 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -286,6 +286,7 @@ Cao Capolungo Caro cartesian +CasP Caswell Cates Cavium @@ -647,6 +648,7 @@ ec Ec ecoul ecp +Ecut edgeIDs edihed edim @@ -690,6 +692,7 @@ elong Elsevier Elsner Elstner +elstop elt emacs emax @@ -1272,6 +1275,7 @@ Keir Kelchner Kelkar Kemper +keV Keyes Khersonskii Khrapak @@ -1608,6 +1612,7 @@ minima minimizations minimizer minimizers +minneigh minorder minSteps mintcream @@ -2919,6 +2924,7 @@ Wi Wicaksono wih Wijk +Wikipedia wildcard Wildcard Wirnsberger diff --git a/examples/USER/misc/elstop/Si.Si.elstop b/examples/USER/misc/elstop/Si.Si.elstop new file mode 100644 index 0000000000..51618149ff --- /dev/null +++ b/examples/USER/misc/elstop/Si.Si.elstop @@ -0,0 +1,14 @@ +# Electronic stopping for Si in Si +# Uses metal units +# Kinetic energy in eV, stopping power in eV/A +# For other atom types, add columns. + +# energy Si in Si + 3918.2 6.541 + 15672.9 13.091 + 35263.9 19.660 + 62691.5 26.257 + 97955.4 32.889 +141055.9 39.566 +191992.0 46.292 +250766.1 53.074 diff --git a/examples/USER/misc/elstop/Si.sw b/examples/USER/misc/elstop/Si.sw new file mode 120000 index 0000000000..e575921334 --- /dev/null +++ b/examples/USER/misc/elstop/Si.sw @@ -0,0 +1 @@ +../../../../potentials/Si.sw \ No newline at end of file diff --git a/examples/USER/misc/elstop/in.elstop b/examples/USER/misc/elstop/in.elstop new file mode 100644 index 0000000000..e31e6d8a65 --- /dev/null +++ b/examples/USER/misc/elstop/in.elstop @@ -0,0 +1,38 @@ +# Test case / example for the electronic stopping fix elstop +# Perfect Si lattice with one primary knock-on atom. +# +# Also uses fix dt/reset, as one should when energies are high +# enough to require electronic stopping. + +units metal +boundary p p p +timestep 0.0001 + +lattice fcc 5.431 + +region rbox block -10 10 -10 10 -10 10 +create_box 1 rbox + +mass 1 28.0855 + +create_atoms 1 box + +velocity all create 300 42534 mom yes rot yes + +group gPKA id 1 +velocity gPKA set 1120 1620 389 + +pair_style sw +pair_coeff * * Si.sw Si + +fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 +fix fel all elstop 1.0 Si.Si.elstop +fix fnve all nve + +thermo 10 +thermo_style custom step time dt f_fel + +#compute ek all ke/atom +#dump mydump all custom 200 elstop.dump id x y z vx vy vz fx fy fz c_ek + +run 5000 diff --git a/examples/USER/misc/elstop/in.elstop.only b/examples/USER/misc/elstop/in.elstop.only new file mode 100644 index 0000000000..1d09fa11f9 --- /dev/null +++ b/examples/USER/misc/elstop/in.elstop.only @@ -0,0 +1,39 @@ +# Test case / example for the electronic stopping fix elstop +# One fast atom, no other interactions. +# Elstop only applied in a smaller box in the middle. +# +# Also uses fix dt/reset, as one should when energies are high +# enough to require electronic stopping. + +units metal +boundary p p p +timestep 0.0001 + +lattice fcc 1 + +region rbox block -100 100 -100 100 -100 100 +region rsmallbox block -90 90 -90 90 -90 90 + +create_box 1 rbox + +mass 1 28.0855 + +create_atoms 1 single 0 0 0 +velocity all set 1120 1620 389 + +pair_style zero 1 +pair_coeff * * 1 + +fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 +fix fel all elstop 1.0 Si.Si.elstop minneigh 0 region rsmallbox +fix fnve all nve + +compute ek all ke/atom +compute ektot all reduce sum c_ek + +thermo 100 +thermo_style custom step time dt f_fel c_ektot + +#dump mydump all custom 200 elstop.only.dump id x y z vx vy vz fx fy fz c_ek + +run 10000 diff --git a/examples/USER/misc/elstop/log.20Mar19.elstop.g++.1 b/examples/USER/misc/elstop/log.20Mar19.elstop.g++.1 new file mode 100644 index 0000000000..3547ced959 --- /dev/null +++ b/examples/USER/misc/elstop/log.20Mar19.elstop.g++.1 @@ -0,0 +1,597 @@ +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 +# Test case / example for the electronic stopping fix elstop +# Perfect Si lattice with one primary knock-on atom. +# +# Also uses fix dt/reset, as one should when energies are high +# enough to require electronic stopping. + +units metal +boundary p p p +timestep 0.0001 + +lattice fcc 5.431 +Lattice spacing in x,y,z = 5.431 5.431 5.431 + +region rbox block -10 10 -10 10 -10 10 +create_box 1 rbox +Created orthogonal box = (-54.31 -54.31 -54.31) to (54.31 54.31 54.31) + 1 by 1 by 1 MPI processor grid + +mass 1 28.0855 + +create_atoms 1 box +Created 32000 atoms + Time spent = 0.00365901 secs + +velocity all create 300 42534 mom yes rot yes + +group gPKA id 1 +1 atoms in group gPKA +velocity gPKA set 1120 1620 389 + +pair_style sw +pair_coeff * * Si.sw Si +Reading potential file Si.sw with DATE: 2007-06-11 + +fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 +fix fel all elstop 1.0 Si.Si.elstop +fix fnve all nve + +thermo 10 +thermo_style custom step time dt f_fel + +#compute ek all ke/atom +#dump mydump all custom 200 elstop.dump id x y z vx vy vz fx fy fz c_ek + +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.77118 + ghost atom cutoff = 5.77118 + binsize = 2.88559, bins = 38 38 38 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair sw, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard + (2) fix elstop, occasional, copy from (1) + attributes: full, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 10.89 | 10.89 | 10.89 Mbytes +Step Time Dt f_fel + 0 0 4.98128e-05 0 + 10 0.00030141297 7.4132113e-06 143.83504 + 20 0.00035951427 6.0316944e-06 171.53673 + 30 0.00057458971 3.5117251e-05 274.07596 + 40 0.00086591312 5.8243334e-06 412.87446 + 50 0.00090045701 2.1026443e-06 429.31458 + 60 0.00091828462 1.5368285e-06 437.79421 + 70 0.00093305888 1.4643253e-06 444.81982 + 80 0.00094860749 1.7487528e-06 452.21378 + 90 0.00097032161 3.0786693e-06 462.54244 + 100 0.0010787914 4.9354535e-05 514.16832 + 110 0.0012080771 2.321306e-06 575.68374 + 120 0.0012239682 1.0510328e-06 583.23471 + 130 0.0012325497 6.8272619e-07 587.30872 + 140 0.0012385196 5.1205819e-07 590.14077 + 150 0.001243165 4.1524338e-07 592.34294 + 160 0.0012470201 3.5380824e-07 594.1694 + 170 0.0012503578 3.1203776e-07 595.74992 + 180 0.0012533367 2.8236408e-07 597.15986 + 190 0.0012560575 2.6071908e-07 598.44711 + 200 0.0012585888 2.4474123e-07 599.64431 + 210 0.0012609803 2.3298466e-07 600.77504 + 220 0.0012632696 2.2453464e-07 601.85726 + 230 0.0012654871 2.1880713e-07 602.90531 + 240 0.0012676582 2.1543942e-07 603.93128 + 250 0.0012698054 2.1422997e-07 604.94591 + 260 0.0012719499 2.1510772e-07 605.95925 + 270 0.0012741128 2.1812163e-07 606.98126 + 280 0.0012763159 2.2344765e-07 608.02243 + 290 0.0012785839 2.3141489e-07 609.09436 + 300 0.0012809453 2.425587e-07 610.21066 + 310 0.0012834353 2.577174e-07 611.38806 + 320 0.0012860996 2.7820843e-07 612.64822 + 330 0.0012890001 3.0616141e-07 614.02061 + 340 0.0012922261 3.4518994e-07 615.54764 + 350 0.0012959145 4.0187423e-07 617.29438 + 360 0.0013002933 4.894618e-07 619.36917 + 370 0.0013057872 6.3886828e-07 621.97388 + 380 0.0013133355 9.4153332e-07 625.55502 + 390 0.0013257779 1.8246429e-06 631.46263 + 400 0.0013651328 1.4820738e-05 650.16503 + 410 0.0016916358 4.5528312e-05 805.3327 + 420 0.0020836696 2.6189823e-05 991.45963 + 430 0.002192113 5.1312984e-06 1042.8979 + 440 0.0022530638 1.1643276e-05 1071.7967 + 450 0.0025312898 1.5833134e-05 1203.6961 + 460 0.0028677695 3.9078523e-05 1363.0792 + 470 0.0032653301 3.9299497e-05 1551.2027 + 480 0.0036647478 4.1100578e-05 1739.9906 + 490 0.0040772194 3.6017871e-05 1934.7262 + 500 0.004246426 1.1620229e-05 2014.5366 + 510 0.0045410379 2.1151987e-05 2153.4172 + 520 0.0048951987 4.2067206e-05 2320.2216 + 530 0.0051251181 5.9152255e-06 2428.4156 + 540 0.0051740847 5.0188036e-06 2451.4388 + 550 0.0053207575 4.1618335e-05 2520.4067 + 560 0.0054412772 2.3641932e-06 2577.0541 + 570 0.005457552 1.0847369e-06 2584.6937 + 580 0.0054664476 7.1198746e-07 2588.8658 + 590 0.0054726999 5.3933302e-07 2591.796 + 600 0.0054776139 4.4178461e-07 2594.0976 + 610 0.0054817341 3.8039473e-07 2596.0263 + 620 0.0054853401 3.3924667e-07 2597.7135 + 630 0.0054885957 3.1069211e-07 2599.2361 + 640 0.0054916066 2.9064829e-07 2600.6439 + 650 0.0054944462 2.7678405e-07 2601.9712 + 660 0.0054971697 2.6772348e-07 2603.244 + 670 0.0054998211 2.6266505e-07 2604.4829 + 680 0.0055024383 2.6119265e-07 2605.7058 + 690 0.0055050563 2.6318733e-07 2606.929 + 700 0.0055077103 2.6880326e-07 2608.1691 + 710 0.0055104383 2.7849814e-07 2609.4439 + 720 0.0055132846 2.9313007e-07 2610.7742 + 730 0.0055163044 3.141612e-07 2612.186 + 740 0.0055195719 3.4406726e-07 2613.714 + 750 0.0055231932 3.8719688e-07 2615.4081 + 760 0.0055273329 4.5174267e-07 2617.3455 + 770 0.0055322712 5.5490406e-07 2619.6579 + 780 0.0055385515 7.3934538e-07 2622.6004 + 790 0.0055474645 1.1452909e-06 2626.7792 + 800 0.0055635927 2.6160295e-06 2634.3465 + 810 0.0057044835 3.9642931e-05 2700.5132 + 820 0.0060307501 2.9394558e-05 2853.6539 + 830 0.0063374404 8.5188148e-06 2997.4768 + 840 0.0063740052 1.4828325e-06 3014.6052 + 850 0.0063848364 7.5985425e-07 3019.6727 + 860 0.0063911095 5.0258852e-07 3022.6045 + 870 0.0063954921 3.7335256e-07 3024.6508 + 880 0.0063988506 2.9643864e-07 3026.2175 + 890 0.0064015712 2.4575869e-07 3027.4855 + 900 0.0064038584 2.1001191e-07 3028.5506 + 910 0.0064058333 1.8353805e-07 3029.4694 + 920 0.006407573 1.6320008e-07 3030.2782 + 930 0.0064091297 1.4712417e-07 3031.0014 + 940 0.0064105403 1.3412445e-07 3031.6562 + 950 0.0064118317 1.2341509e-07 3032.2552 + 960 0.0064130243 1.1445544e-07 3032.808 + 970 0.0064141337 1.0686175e-07 3033.3219 + 980 0.0064151722 1.0035437e-07 3033.8027 + 990 0.0064161498 9.4724852e-08 3034.2549 + 1000 0.0064170744 8.9814769e-08 3034.6824 + 1010 0.0064179527 8.5501639e-08 3035.0882 + 1020 0.0064187902 8.1689338e-08 3035.475 + 1030 0.0064195915 7.8301418e-08 3035.8449 + 1040 0.0064203606 7.5276356e-08 3036.1997 + 1050 0.0064211009 7.2564109e-08 3036.541 + 1060 0.0064218154 7.0123584e-08 3036.8703 + 1070 0.0064225065 6.7920744e-08 3037.1886 + 1080 0.0064231766 6.5927178e-08 3037.4971 + 1090 0.0064238276 6.4119002e-08 3037.7967 + 1100 0.0064244613 6.2476011e-08 3038.0882 + 1110 0.0064250792 6.0981016e-08 3038.3724 + 1120 0.0064256828 5.9619315e-08 3038.6498 + 1130 0.0064262733 5.8378279e-08 3038.9212 + 1140 0.0064268519 5.7247013e-08 3039.1869 + 1150 0.0064274196 5.6216088e-08 3039.4476 + 1160 0.0064279775 5.5277318e-08 3039.7037 + 1170 0.0064285264 5.4423582e-08 3039.9556 + 1180 0.006429067 5.3648672e-08 3040.2036 + 1190 0.0064296003 5.294717e-08 3040.4482 + 1200 0.0064301269 5.2314351e-08 3040.6897 + 1210 0.0064306474 5.1746091e-08 3040.9283 + 1220 0.0064311625 5.1238802e-08 3041.1644 + 1230 0.0064316729 5.0789368e-08 3041.3983 + 1240 0.0064321789 5.0395101e-08 3041.6301 + 1250 0.0064326813 5.0053692e-08 3041.8603 + 1260 0.0064331805 4.9763183e-08 3042.0889 + 1270 0.006433677 4.9521937e-08 3042.3163 + 1280 0.0064341713 4.9328614e-08 3042.5427 + 1290 0.0064346639 4.9182151e-08 3042.7682 + 1300 0.0064351552 4.9081752e-08 3042.9931 + 1310 0.0064356458 4.9026872e-08 3043.2177 + 1320 0.006436136 4.9017214e-08 3043.4421 + 1330 0.0064366262 4.9052721e-08 3043.6666 + 1340 0.0064371171 4.9133581e-08 3043.8912 + 1350 0.006437609 4.9260223e-08 3044.1164 + 1360 0.0064381023 4.9433327e-08 3044.3422 + 1370 0.0064385976 4.9653831e-08 3044.569 + 1380 0.0064390953 4.9922944e-08 3044.7968 + 1390 0.0064395959 5.0242164e-08 3045.0261 + 1400 0.0064401 5.0613297e-08 3045.2568 + 1410 0.006440608 5.1038483e-08 3045.4895 + 1420 0.0064411205 5.1520228e-08 3045.7242 + 1430 0.0064416381 5.2061443e-08 3045.9613 + 1440 0.0064421614 5.2665486e-08 3046.201 + 1450 0.006442691 5.3336219e-08 3046.4437 + 1460 0.0064432276 5.4078074e-08 3046.6896 + 1470 0.006443772 5.4896126e-08 3046.9392 + 1480 0.0064443249 5.5796191e-08 3047.1927 + 1490 0.0064448873 5.6784937e-08 3047.4506 + 1500 0.0064454599 5.7870017e-08 3047.7132 + 1510 0.0064460439 5.9060235e-08 3047.9812 + 1520 0.0064466403 6.0365742e-08 3048.2549 + 1530 0.0064472503 6.1798287e-08 3048.5349 + 1540 0.0064478752 6.337151e-08 3048.822 + 1550 0.0064485166 6.5101323e-08 3049.1166 + 1560 0.006449176 6.7006371e-08 3049.4197 + 1570 0.0064498554 6.9108623e-08 3049.732 + 1580 0.0064505567 7.1434118e-08 3050.0546 + 1590 0.0064512824 7.4013931e-08 3050.3885 + 1600 0.0064520352 7.6885409e-08 3050.7351 + 1610 0.0064528182 8.0093813e-08 3051.0957 + 1620 0.006453635 8.3694486e-08 3051.472 + 1630 0.0064544898 8.7755778e-08 3051.8661 + 1640 0.0064553876 9.2363047e-08 3052.2802 + 1650 0.0064563343 9.7624226e-08 3052.7171 + 1660 0.0064573371 1.0367771e-07 3053.1801 + 1670 0.0064584046 1.1070379e-07 3053.6733 + 1680 0.0064595476 1.1894157e-07 3054.2017 + 1690 0.0064607796 1.2871484e-07 3054.7716 + 1700 0.0064621178 1.4047265e-07 3055.391 + 1710 0.0064635847 1.5485559e-07 3056.0705 + 1720 0.0064652106 1.7280864e-07 3056.8241 + 1730 0.0064670371 1.9578361e-07 3057.6713 + 1740 0.0064691241 2.261258e-07 3058.6401 + 1750 0.0064715615 2.6787347e-07 3059.7724 + 1760 0.0064744931 3.2858822e-07 3061.1353 + 1770 0.0064781697 4.2416554e-07 3062.8461 + 1780 0.0064830857 5.9426003e-07 3065.1356 + 1790 0.0064904338 9.7042692e-07 3068.5608 + 1800 0.006504521 2.3570057e-06 3075.1339 + 1810 0.0066489551 2.5350137e-05 3142.596 + 1820 0.0067263358 2.0982567e-06 3178.7218 + 1830 0.0067413263 1.0389873e-06 3185.7117 + 1840 0.0067499639 7.021379e-07 3189.736 + 1850 0.0067561793 5.4125252e-07 3192.6298 + 1860 0.00676114 4.4920623e-07 3194.938 + 1870 0.0067653505 3.911598e-07 3196.8961 + 1880 0.0067690759 3.5254253e-07 3198.6279 + 1890 0.0067724748 3.2626983e-07 3200.2074 + 1900 0.0067756518 3.0855768e-07 3201.6834 + 1910 0.0067786819 2.9728199e-07 3203.0908 + 1920 0.0067816236 2.9125633e-07 3204.457 + 1930 0.0067845263 2.8989566e-07 3205.8049 + 1940 0.0067874357 2.9306921e-07 3207.156 + 1950 0.0067903982 3.0106889e-07 3208.5318 + 1960 0.006793465 3.1467844e-07 3209.9563 + 1970 0.0067966982 3.3537556e-07 3211.4583 + 1980 0.0068001793 3.6577201e-07 3213.0759 + 1990 0.0068040239 4.1056728e-07 3214.863 + 2000 0.0068084116 4.7878365e-07 3216.9034 + 2010 0.0068136505 5.897605e-07 3219.3409 + 2020 0.0068203489 7.9292336e-07 3222.4591 + 2030 0.0068300039 1.259738e-06 3226.9568 + 2040 0.0068484332 3.1869606e-06 3235.5484 + 2050 0.00704302 3.1308435e-05 3326.3332 + 2060 0.0073582601 1.9393034e-05 3473.3099 + 2070 0.0076291992 6.1118973e-06 3599.5265 + 2080 0.0076591273 1.397136e-06 3613.4525 + 2090 0.0076695786 7.5324795e-07 3618.31 + 2100 0.0076758692 5.1095756e-07 3621.2308 + 2110 0.0076803593 3.8613872e-07 3623.3137 + 2120 0.0076838539 3.1077232e-07 3624.9334 + 2130 0.0076867208 2.6065521e-07 3626.2611 + 2140 0.0076891581 2.2509342e-07 3627.3889 + 2150 0.007691284 1.9865679e-07 3628.372 + 2160 0.0076931748 1.7830513e-07 3629.2457 + 2170 0.0076948825 1.6220815e-07 3630.0343 + 2180 0.0076964439 1.4920028e-07 3630.7548 + 2190 0.0076978861 1.3850522e-07 3631.42 + 2200 0.0076992297 1.2958672e-07 3632.0393 + 2210 0.0077004907 1.2206289e-07 3632.6203 + 2220 0.0077016817 1.1565477e-07 3633.1687 + 2230 0.0077028128 1.1015407e-07 3633.6892 + 2240 0.0077038924 1.0540234e-07 3634.1859 + 2250 0.0077049274 1.0127711e-07 3634.6618 + 2260 0.0077059236 9.7682361e-08 3635.1197 + 2270 0.0077068859 9.454193e-08 3635.5619 + 2280 0.0077078187 9.1794781e-08 3635.9903 + 2290 0.0077087255 8.9391579e-08 3636.4067 + 2300 0.0077096098 8.7292175e-08 3636.8125 + 2310 0.0077104742 8.5463727e-08 3637.2092 + 2320 0.0077113216 8.3879281e-08 3637.598 + 2330 0.007712154 8.2516693e-08 3637.9798 + 2340 0.0077129738 8.1357804e-08 3638.3557 + 2350 0.0077137829 8.0387796e-08 3638.7267 + 2360 0.0077145831 7.9594705e-08 3639.0935 + 2370 0.0077153761 7.8969036e-08 3639.457 + 2380 0.0077161635 7.8503481e-08 3639.8178 + 2390 0.007716947 7.8192701e-08 3640.1769 + 2400 0.0077177281 7.8033171e-08 3640.5348 + 2410 0.0077185083 7.8023089e-08 3640.8923 + 2420 0.007719289 7.8162318e-08 3641.25 + 2430 0.0077200718 7.8452384e-08 3641.6087 + 2440 0.0077208582 7.8896522e-08 3641.9691 + 2450 0.0077216498 7.9499759e-08 3642.3318 + 2460 0.0077224481 8.026906e-08 3642.6977 + 2470 0.0077232549 8.1213529e-08 3643.0675 + 2480 0.0077240719 8.2344683e-08 3643.442 + 2490 0.0077249012 8.3676812e-08 3643.8222 + 2500 0.0077257448 8.5227445e-08 3644.209 + 2510 0.0077266049 8.7017961e-08 3644.6035 + 2520 0.0077274841 8.9074372e-08 3645.0068 + 2530 0.0077283852 9.1428349e-08 3645.4203 + 2540 0.0077293113 9.4118559e-08 3645.8454 + 2550 0.0077302659 9.7192441e-08 3646.2837 + 2560 0.0077312533 1.0070857e-07 3646.7372 + 2570 0.0077322781 1.0473987e-07 3647.208 + 2580 0.0077333458 1.0937801e-07 3647.6987 + 2590 0.007734463 1.1473957e-07 3648.2124 + 2600 0.0077356377 1.2097481e-07 3648.7528 + 2610 0.0077368793 1.2828037e-07 3649.3242 + 2620 0.0077381998 1.3691837e-07 3649.9322 + 2630 0.0077396139 1.4724543e-07 3650.5836 + 2640 0.0077411406 1.5975888e-07 3651.2873 + 2650 0.0077428048 1.7517253e-07 3652.0548 + 2660 0.0077446398 1.9454711e-07 3652.9016 + 2670 0.0077466922 2.1952673e-07 3653.8493 + 2680 0.0077490288 2.5279733e-07 3654.929 + 2690 0.0077517515 2.9905194e-07 3656.188 + 2700 0.0077550252 3.6725589e-07 3657.7029 + 2710 0.0077591434 4.7681009e-07 3659.6101 + 2720 0.0077647038 6.7839241e-07 3662.1874 + 2730 0.007773234 1.1552111e-06 3666.1446 + 2740 0.0077911374 3.3406902e-06 3674.458 + 2750 0.0079702 8.4184292e-06 3757.6696 + 2760 0.008006114 1.4496754e-06 3774.3449 + 2770 0.0080166835 7.3926386e-07 3779.2462 + 2780 0.0080227734 4.8640717e-07 3782.0672 + 2790 0.0080270055 3.5945058e-07 3784.0255 + 2800 0.0080302318 2.8394384e-07 3785.517 + 2810 0.008032832 2.3422206e-07 3786.7179 + 2820 0.0080350072 1.9916814e-07 3787.7215 + 2830 0.0080368761 1.7321525e-07 3788.5831 + 2840 0.0080385144 1.5327931e-07 3789.3377 + 2850 0.0080399734 1.3751893e-07 3790.0091 + 2860 0.0080412891 1.2476931e-07 3790.6141 + 2870 0.0080424879 1.1425897e-07 3791.1649 + 2880 0.0080435897 1.0545738e-07 3791.6707 + 2890 0.0080446097 9.7988142e-08 3792.1386 + 2900 0.0080455599 9.1577084e-08 3792.5741 + 2910 0.00804645 8.6019912e-08 3792.9818 + 2920 0.0080472879 8.1161402e-08 3793.3653 + 2930 0.0080480798 7.6881575e-08 3793.7275 + 2940 0.0080488311 7.3086284e-08 3794.0709 + 2950 0.0080495465 6.9700651e-08 3794.3977 + 2960 0.0080502295 6.666441e-08 3794.7094 + 2970 0.0080508836 6.3928523e-08 3795.0078 + 2980 0.0080515116 6.1452701e-08 3795.2941 + 2990 0.0080521158 5.9203545e-08 3795.5694 + 3000 0.0080526985 5.7153146e-08 3795.8346 + 3010 0.0080532614 5.5278009e-08 3796.0908 + 3020 0.0080538063 5.3558217e-08 3796.3386 + 3030 0.0080543347 5.1976785e-08 3796.5788 + 3040 0.0080548478 5.051914e-08 3796.8119 + 3050 0.0080553469 4.9172716e-08 3797.0385 + 3060 0.0080558329 4.7926619e-08 3797.2591 + 3070 0.0080563069 4.6771366e-08 3797.4741 + 3080 0.0080567697 4.5698662e-08 3797.6839 + 3090 0.0080572222 4.4701228e-08 3797.8889 + 3100 0.0080576649 4.3772647e-08 3798.0895 + 3110 0.0080580987 4.2907247e-08 3798.2858 + 3120 0.0080585241 4.2099999e-08 3798.4784 + 3130 0.0080589417 4.1346425e-08 3798.6672 + 3140 0.0080593519 4.0642535e-08 3798.8527 + 3150 0.0080597554 3.9984758e-08 3799.0351 + 3160 0.0080601524 3.9369895e-08 3799.2145 + 3170 0.0080605435 3.8795073e-08 3799.3911 + 3180 0.008060929 3.8257705e-08 3799.5651 + 3190 0.0080613093 3.7755461e-08 3799.7368 + 3200 0.0080616847 3.7286239e-08 3799.9062 + 3210 0.0080620556 3.6848135e-08 3800.0734 + 3220 0.0080624222 3.6439432e-08 3800.2387 + 3230 0.0080627848 3.6058573e-08 3800.4022 + 3240 0.0080631438 3.5704146e-08 3800.564 + 3250 0.0080634994 3.5374876e-08 3800.7241 + 3260 0.0080638517 3.5069606e-08 3800.8828 + 3270 0.0080642011 3.4787289e-08 3801.0402 + 3280 0.0080645478 3.4526978e-08 3801.1962 + 3290 0.008064892 3.4287819e-08 3801.3511 + 3300 0.0080652339 3.4069042e-08 3801.505 + 3310 0.0080655736 3.3869955e-08 3801.6578 + 3320 0.0080659115 3.368994e-08 3801.8098 + 3330 0.0080662477 3.3528444e-08 3801.961 + 3340 0.0080665823 3.3384981e-08 3802.1115 + 3350 0.0080669156 3.3259123e-08 3802.2613 + 3360 0.0080672476 3.3150499e-08 3802.4106 + 3370 0.0080675787 3.305879e-08 3802.5594 + 3380 0.008067909 3.2983732e-08 3802.7078 + 3390 0.0080682385 3.2925108e-08 3802.8559 + 3400 0.0080685676 3.288275e-08 3803.0038 + 3410 0.0080688963 3.2856537e-08 3803.1515 + 3420 0.0080692248 3.2846395e-08 3803.2991 + 3430 0.0080695532 3.2852293e-08 3803.4466 + 3440 0.0080698819 3.2874247e-08 3803.5943 + 3450 0.0080702108 3.2912319e-08 3803.742 + 3460 0.0080705401 3.2966617e-08 3803.89 + 3470 0.0080708701 3.3037293e-08 3804.0382 + 3480 0.0080712008 3.312455e-08 3804.1868 + 3490 0.0080715325 3.3228638e-08 3804.3358 + 3500 0.0080718653 3.3349858e-08 3804.4853 + 3510 0.0080721995 3.3488567e-08 3804.6355 + 3520 0.008072535 3.3645172e-08 3804.7862 + 3530 0.0080728723 3.3820145e-08 3804.9378 + 3540 0.0080732113 3.4014016e-08 3805.0901 + 3550 0.0080735524 3.4227383e-08 3805.2434 + 3560 0.0080738957 3.4460914e-08 3805.3977 + 3570 0.0080742414 3.4715354e-08 3805.5532 + 3580 0.0080745898 3.4991532e-08 3805.7098 + 3590 0.0080749411 3.5290364e-08 3805.8677 + 3600 0.0080752954 3.5612865e-08 3806.0271 + 3610 0.0080756531 3.5960156e-08 3806.188 + 3620 0.0080760143 3.6333475e-08 3806.3505 + 3630 0.0080763794 3.6734187e-08 3806.5148 + 3640 0.0080767487 3.7163802e-08 3806.681 + 3650 0.0080771224 3.7623985e-08 3806.8492 + 3660 0.0080775008 3.8116577e-08 3807.0196 + 3670 0.0080778843 3.8643614e-08 3807.1924 + 3680 0.0080782733 3.9207349e-08 3807.3676 + 3690 0.008078668 3.9810283e-08 3807.5455 + 3700 0.008079069 4.0455191e-08 3807.7262 + 3710 0.0080794766 4.114516e-08 3807.91 + 3720 0.0080798913 4.1883634e-08 3808.0971 + 3730 0.0080803137 4.2674459e-08 3808.2877 + 3740 0.0080807442 4.3521941e-08 3808.482 + 3750 0.0080811834 4.4430917e-08 3808.6803 + 3760 0.0080816321 4.5406834e-08 3808.883 + 3770 0.0080820908 4.6455843e-08 3809.0902 + 3780 0.0080825604 4.7584918e-08 3809.3025 + 3790 0.0080830416 4.8801987e-08 3809.5201 + 3800 0.0080835355 5.0116105e-08 3809.7436 + 3810 0.0080840429 5.1537653e-08 3809.9733 + 3820 0.0080845652 5.3078583e-08 3810.2097 + 3830 0.0080851034 5.4752728e-08 3810.4535 + 3840 0.008085659 5.6576175e-08 3810.7054 + 3850 0.0080862335 5.8567743e-08 3810.9659 + 3860 0.0080868289 6.0749572e-08 3811.236 + 3870 0.008087447 6.3147889e-08 3811.5166 + 3880 0.0080880901 6.5793981e-08 3811.8087 + 3890 0.008088761 6.8725458e-08 3812.1136 + 3900 0.0080894626 7.1987928e-08 3812.4327 + 3910 0.0080901986 7.5637206e-08 3812.7675 + 3920 0.008090973 7.9742316e-08 3813.1201 + 3930 0.0080917909 8.4389592e-08 3813.4926 + 3940 0.008092658 8.9688414e-08 3813.8879 + 3950 0.0080935816 9.5779352e-08 3814.3091 + 3960 0.0080945703 1.0284601e-07 3814.7604 + 3970 0.0080956349 1.1113264e-07 3815.2467 + 3980 0.0080967891 1.2097115e-07 3815.7742 + 3990 0.0080980502 1.3282379e-07 3816.3511 + 4000 0.0080994413 1.4735308e-07 3816.9878 + 4010 0.0081009931 1.6554202e-07 3817.6987 + 4020 0.0081027486 1.8891116e-07 3818.5035 + 4030 0.0081047696 2.1993774e-07 3819.4308 + 4040 0.0081071501 2.6293325e-07 3820.524 + 4050 0.0081100418 3.2608623e-07 3821.8531 + 4060 0.0081137136 4.2695471e-07 3823.5422 + 4070 0.0081187073 6.1068659e-07 3825.8415 + 4080 0.0081263808 1.0353843e-06 3829.3781 + 4090 0.0081421033 2.8175459e-06 3836.6316 + 4100 0.0083319479 3.0660994e-05 3924.296 + 4110 0.0086521081 2.4031675e-05 4072.0381 + 4120 0.0089367803 5.8263834e-06 4203.2922 + 4130 0.0089679114 1.6262217e-06 4217.6293 + 4140 0.0089805825 9.6546502e-07 4223.4594 + 4150 0.0089889356 7.1159925e-07 4227.3001 + 4160 0.0089954101 5.8311893e-07 4230.2754 + 4170 0.0090008803 5.1000973e-07 4232.7881 + 4180 0.0090057682 4.6713078e-07 4235.0326 + 4190 0.0090103206 4.4370361e-07 4237.1225 + 4200 0.0090147071 4.3491502e-07 4239.1361 + 4210 0.0090190645 4.3912951e-07 4241.1362 + 4220 0.0090235243 4.570826e-07 4243.1834 + 4230 0.0090282367 4.9222468e-07 4245.3469 + 4240 0.0090334045 5.5254852e-07 4247.72 + 4250 0.0090393478 6.5600428e-07 4250.4502 + 4260 0.0090466656 8.4827393e-07 4253.8133 + 4270 0.0090567641 1.2818738e-06 4258.457 + 4280 0.0090746835 2.9033891e-06 4266.7027 + 4290 0.0092346752 2.9451638e-05 4340.3839 + 4300 0.0093466586 4.9023913e-06 4391.9319 + 4310 0.0093992941 7.8400922e-06 4416.149 + 4320 0.0097053159 4.3362296e-05 4556.9393 + 4330 0.010037349 4.9648086e-05 4709.5604 + 4340 0.010297354 8.8232096e-06 4828.9697 + 4350 0.010503113 4.4016316e-05 4923.4016 + 4360 0.010926633 4.2142313e-05 5117.622 + 4370 0.011318805 4.0285407e-05 5297.2575 + 4380 0.011746199 4.3755472e-05 5492.8047 + 4390 0.012044606 2.1150168e-05 5629.1924 + 4400 0.01231664 7.0784321e-06 5753.4243 + 4410 0.01236554 3.954763e-06 5775.7358 + 4420 0.012415 8.8450437e-06 5798.2999 + 4430 0.012723996 3.6113036e-05 5939.2622 + 4440 0.013109261 4.5827638e-05 6114.8493 + 4450 0.013251276 2.6649019e-06 6179.5172 + 4460 0.013269544 1.2200106e-06 6187.8251 + 4470 0.013279619 8.155501e-07 6192.4028 + 4480 0.013286853 6.3300974e-07 6195.6879 + 4490 0.01329269 5.3347649e-07 6198.3373 + 4500 0.013297735 4.7451627e-07 6200.6261 + 4510 0.013302306 4.392029e-07 6202.6992 + 4520 0.013306599 4.1982963e-07 6204.6461 + 4530 0.013310757 4.1285331e-07 6206.5311 + 4540 0.013314895 4.1710029e-07 6208.4074 + 4550 0.013319128 4.3324769e-07 6210.3267 + 4560 0.013323586 4.6410935e-07 6212.348 + 4570 0.013328439 5.1597347e-07 6214.5493 + 4580 0.01333395 6.0235495e-07 6217.0498 + 4590 0.013340584 7.5537668e-07 6220.0613 + 4600 0.013349342 1.0699582e-06 6224.0388 + 4610 0.013363183 1.98365e-06 6230.3293 + 4620 0.013404081 1.4367775e-05 6248.9319 + 4630 0.013593325 3.787203e-06 6335.0239 + 4640 0.01361833 1.6441528e-06 6346.3866 + 4650 0.013632159 1.1592769e-06 6352.6667 + 4660 0.013642828 9.8623051e-07 6357.5101 + 4670 0.013652418 9.4451692e-07 6361.8626 + 4680 0.013662041 1.0034733e-06 6366.2295 + 4690 0.013672824 1.2061779e-06 6371.1243 + 4700 0.013686941 1.780995e-06 6377.5343 + 4710 0.013713088 4.7634009e-06 6389.4131 + 4720 0.013968014 3.9765415e-05 6505.2802 + 4730 0.014228787 6.2632217e-06 6623.7185 + 4740 0.014278333 4.7934169e-06 6646.2018 + 4750 0.014382212 5.1069055e-05 6693.3424 + 4760 0.014525205 2.0381123e-06 6758.2178 + 4770 0.014538504 8.2250651e-07 6764.2412 + 4780 0.014544984 4.9114353e-07 6767.1723 + 4790 0.014549144 3.4212232e-07 6769.0518 + 4800 0.014552156 2.589287e-07 6770.4109 + 4810 0.014554491 2.0641662e-07 6771.4633 + 4820 0.014556384 1.7052382e-07 6772.315 + 4830 0.014557966 1.4457875e-07 6773.0262 + 4840 0.014559319 1.250293e-07 6773.6339 + 4850 0.014560498 1.09819e-07 6774.1626 + 4860 0.014561539 9.7678962e-08 6774.629 + 4870 0.01456247 8.7785899e-08 6775.0453 + 4880 0.01456331 7.9583482e-08 6775.4205 + 4890 0.014564074 7.2682934e-08 6775.7613 + 4900 0.014564773 6.6804784e-08 6776.0732 + 4910 0.014565418 6.1743238e-08 6776.3601 + 4920 0.014566015 5.7343571e-08 6776.6256 + 4930 0.014566571 5.3487327e-08 6776.8723 + 4940 0.01456709 5.0082359e-08 6777.1026 + 4950 0.014567577 4.7055963e-08 6777.3183 + 4960 0.014568035 4.4350048e-08 6777.521 + 4970 0.014568467 4.1917669e-08 6777.712 + 4980 0.014568876 3.9720495e-08 6777.8926 + 4990 0.014569265 3.7726941e-08 6778.0636 + 5000 0.014569634 3.5910753e-08 6778.2261 +Loop time of 27.2739 on 1 procs for 5000 steps with 32000 atoms + +Performance: 0.001 ns/day, 42193.880 hours/ns, 183.326 timesteps/s +96.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 | 17.626 | 17.626 | 17.626 | 0.0 | 64.62 +Neigh | 1.5828 | 1.5828 | 1.5828 | 0.0 | 5.80 +Comm | 0.78596 | 0.78596 | 0.78596 | 0.0 | 2.88 +Output | 0.0082562 | 0.0082562 | 0.0082562 | 0.0 | 0.03 +Modify | 6.414 | 6.414 | 6.414 | 0.0 | 23.52 +Other | | 0.8573 | | | 3.14 + +Nlocal: 32000 ave 32000 max 32000 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 13556 ave 13556 max 13556 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 576016 ave 576016 max 576016 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 576016 +Ave neighs/atom = 18.0005 +Neighbor list builds = 68 +Dangerous builds = 42 +Total wall time: 0:00:27 diff --git a/examples/USER/misc/elstop/log.20Mar19.elstop.g++.4 b/examples/USER/misc/elstop/log.20Mar19.elstop.g++.4 new file mode 100644 index 0000000000..4b06000522 --- /dev/null +++ b/examples/USER/misc/elstop/log.20Mar19.elstop.g++.4 @@ -0,0 +1,597 @@ +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 +# Test case / example for the electronic stopping fix elstop +# Perfect Si lattice with one primary knock-on atom. +# +# Also uses fix dt/reset, as one should when energies are high +# enough to require electronic stopping. + +units metal +boundary p p p +timestep 0.0001 + +lattice fcc 5.431 +Lattice spacing in x,y,z = 5.431 5.431 5.431 + +region rbox block -10 10 -10 10 -10 10 +create_box 1 rbox +Created orthogonal box = (-54.31 -54.31 -54.31) to (54.31 54.31 54.31) + 1 by 2 by 2 MPI processor grid + +mass 1 28.0855 + +create_atoms 1 box +Created 32000 atoms + Time spent = 0.000838995 secs + +velocity all create 300 42534 mom yes rot yes + +group gPKA id 1 +1 atoms in group gPKA +velocity gPKA set 1120 1620 389 + +pair_style sw +pair_coeff * * Si.sw Si +Reading potential file Si.sw with DATE: 2007-06-11 + +fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 +fix fel all elstop 1.0 Si.Si.elstop +fix fnve all nve + +thermo 10 +thermo_style custom step time dt f_fel + +#compute ek all ke/atom +#dump mydump all custom 200 elstop.dump id x y z vx vy vz fx fy fz c_ek + +run 5000 +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 5.77118 + ghost atom cutoff = 5.77118 + binsize = 2.88559, bins = 38 38 38 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair sw, perpetual + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard + (2) fix elstop, occasional, copy from (1) + attributes: full, newton on + pair build: copy + stencil: none + bin: none +Per MPI rank memory allocation (min/avg/max) = 3.825 | 3.825 | 3.825 Mbytes +Step Time Dt f_fel + 0 0 4.98128e-05 0 + 10 0.00030141235 7.4131221e-06 143.83474 + 20 0.00035951242 6.0314282e-06 171.53584 + 30 0.00057457861 3.511731e-05 274.07067 + 40 0.00086591115 5.8248574e-06 412.87352 + 50 0.00090045749 2.102773e-06 429.31482 + 60 0.00091828633 1.5369556e-06 437.79502 + 70 0.00093306208 1.4645168e-06 444.82135 + 80 0.00094861336 1.7491631e-06 452.21657 + 90 0.00097033523 3.0804023e-06 462.54893 + 100 0.0010792154 4.9075683e-05 514.37014 + 110 0.0012080866 2.3201427e-06 575.68827 + 120 0.0012239719 1.0507964e-06 583.23648 + 130 0.0012325518 6.8263389e-07 587.30975 + 140 0.0012385211 5.1201217e-07 590.14147 + 150 0.0012431661 4.1521773e-07 592.34347 + 160 0.001247021 3.5379338e-07 594.16984 + 170 0.0012503586 3.1202939e-07 595.75031 + 180 0.0012533374 2.8236002e-07 597.16021 + 190 0.0012560582 2.6071816e-07 598.44745 + 200 0.0012585895 2.4474279e-07 599.64465 + 210 0.001260981 2.3298831e-07 600.7754 + 220 0.0012632704 2.2454021e-07 601.85763 + 230 0.001265488 2.1881458e-07 602.90571 + 240 0.0012676591 2.154488e-07 603.93173 + 250 0.0012698064 2.1424147e-07 604.94641 + 260 0.0012719511 2.1512161e-07 605.9598 + 270 0.0012741141 2.1813836e-07 606.98189 + 280 0.0012763174 2.2346783e-07 608.02314 + 290 0.0012785856 2.3143942e-07 609.09518 + 300 0.0012809473 2.4258888e-07 610.2116 + 310 0.0012834376 2.5775518e-07 611.38916 + 320 0.0012861023 2.7825685e-07 612.64953 + 330 0.0012890034 3.062254e-07 614.02218 + 340 0.0012922301 3.4527805e-07 615.54956 + 350 0.0012959196 4.0200263e-07 617.29679 + 360 0.0013003 4.8966484e-07 619.37233 + 370 0.0013057965 6.3923294e-07 621.9783 + 380 0.00131335 9.423535e-07 625.56194 + 390 0.0013258073 1.8277087e-06 631.47661 + 400 0.0013653313 1.4985239e-05 650.25939 + 410 0.0016927117 4.5643592e-05 805.84388 + 420 0.002085671 2.5698185e-05 992.40957 + 430 0.0021935861 5.3102217e-06 1043.597 + 440 0.0022614637 1.5788858e-05 1075.7807 + 450 0.0025463923 1.6989456e-05 1210.8535 + 460 0.0029095455 3.9205279e-05 1382.8591 + 470 0.003309122 3.8882183e-05 1571.9128 + 480 0.0037129772 4.0573389e-05 1762.7749 + 490 0.004120209 2.7525742e-05 1955.0148 + 500 0.0042711049 1.9373612e-05 2026.1805 + 510 0.0045860203 2.4773305e-05 2174.6208 + 520 0.004995259 3.8017877e-05 2367.3335 + 530 0.0051457762 5.4205615e-06 2438.1475 + 540 0.005203221 8.8625579e-06 2465.1577 + 550 0.0054221421 5.7304442e-06 2568.0888 + 560 0.0054524345 1.5599386e-06 2582.3169 + 570 0.0054645073 9.1093243e-07 2587.9819 + 580 0.0054723338 6.6033575e-07 2591.6518 + 590 0.0054782965 5.3155858e-07 2594.446 + 600 0.005483241 4.5581839e-07 2596.7619 + 610 0.0054875675 4.0821885e-07 2598.7875 + 620 0.0054915013 3.7775507e-07 2600.6287 + 630 0.0054951861 3.5898561e-07 2602.3529 + 640 0.0054987249 3.4911444e-07 2604.0086 + 650 0.0055021998 3.4682698e-07 2605.6342 + 660 0.0055056844 3.5182676e-07 2607.2643 + 670 0.0055092538 3.6473743e-07 2608.9342 + 680 0.0055129936 3.8730595e-07 2610.6841 + 690 0.0055170145 4.2303997e-07 2612.566 + 700 0.0055214749 4.7876507e-07 2614.6542 + 710 0.0055266296 5.6863699e-07 2617.0684 + 720 0.0055329452 7.2626141e-07 2620.0278 + 730 0.0055414528 1.0527596e-06 2624.0166 + 740 0.0055553208 2.0371511e-06 2630.523 + 750 0.0056023478 2.2133456e-05 2652.6057 + 760 0.0059007346 3.8610962e-05 2792.7168 + 770 0.0062508505 3.9428337e-05 2956.9697 + 780 0.0063682296 2.1223153e-06 3011.9927 + 790 0.0063824196 9.0656948e-07 3018.6346 + 800 0.0063896741 5.6137676e-07 3022.0266 + 810 0.0063944906 4.0276465e-07 3024.2763 + 820 0.0063980771 3.1284015e-07 3025.9499 + 830 0.0064009279 2.5537602e-07 3027.2789 + 840 0.006403292 2.1569057e-07 3028.3801 + 850 0.0064053117 1.8674792e-07 3029.32 + 860 0.0064070756 1.6477015e-07 3030.1402 + 870 0.0064086425 1.4755386e-07 3030.8682 + 880 0.0064100535 1.3373048e-07 3031.5232 + 890 0.0064113381 1.2240666e-07 3032.1191 + 900 0.0064125183 1.1297538e-07 3032.6662 + 910 0.0064136112 1.0501022e-07 3033.1724 + 920 0.0064146298 9.8203162e-08 3033.6439 + 930 0.0064155847 9.2326368e-08 3034.0856 + 940 0.0064164843 8.7207794e-08 3034.5015 + 950 0.0064173357 8.2715188e-08 3034.8948 + 960 0.0064181446 7.8745279e-08 3035.2682 + 970 0.0064189159 7.5216291e-08 3035.6241 + 980 0.0064196535 7.2062662e-08 3035.9642 + 990 0.0064203612 6.9231241e-08 3036.2903 + 1000 0.0064210418 6.6678502e-08 3036.6038 + 1010 0.006421698 6.4368478e-08 3036.9059 + 1020 0.0064223321 6.2271202e-08 3037.1976 + 1030 0.0064229461 6.0361517e-08 3037.4799 + 1040 0.0064235417 5.8618162e-08 3037.7537 + 1050 0.0064241206 5.702305e-08 3038.0197 + 1060 0.0064246841 5.556071e-08 3038.2784 + 1070 0.0064252336 5.4217838e-08 3038.5306 + 1080 0.0064257701 5.2982939e-08 3038.7768 + 1090 0.0064262948 5.1846034e-08 3039.0174 + 1100 0.0064268085 5.079843e-08 3039.2529 + 1110 0.006427312 4.9832523e-08 3039.4837 + 1120 0.0064278063 4.8941643e-08 3039.7101 + 1130 0.0064282919 4.811992e-08 3039.9325 + 1140 0.0064287697 4.7362175e-08 3040.1512 + 1150 0.0064292401 4.6663831e-08 3040.3665 + 1160 0.0064297038 4.6020833e-08 3040.5786 + 1170 0.0064301613 4.5429586e-08 3040.7878 + 1180 0.0064306131 4.4886899e-08 3040.9944 + 1190 0.0064310597 4.4389937e-08 3041.1986 + 1200 0.0064315016 4.3936183e-08 3041.4005 + 1210 0.006431939 4.3523406e-08 3041.6003 + 1220 0.0064323725 4.3149628e-08 3041.7984 + 1230 0.0064328025 4.2813101e-08 3041.9947 + 1240 0.0064332292 4.2512286e-08 3042.1896 + 1250 0.0064336531 4.2245836e-08 3042.3831 + 1260 0.0064340745 4.201258e-08 3042.5755 + 1270 0.0064344937 4.1811507e-08 3042.7668 + 1280 0.006434911 4.1641759e-08 3042.9572 + 1290 0.0064353268 4.1502622e-08 3043.1469 + 1300 0.0064357413 4.1393513e-08 3043.336 + 1310 0.0064361549 4.1313982e-08 3043.5247 + 1320 0.0064365678 4.1263699e-08 3043.713 + 1330 0.0064369803 4.1242458e-08 3043.9012 + 1340 0.0064373927 4.125017e-08 3044.0893 + 1350 0.0064378054 4.1286866e-08 3044.2775 + 1360 0.0064382185 4.1352691e-08 3044.466 + 1370 0.0064386324 4.1447915e-08 3044.6548 + 1380 0.0064390475 4.1572925e-08 3044.8441 + 1390 0.0064394639 4.1728238e-08 3045.034 + 1400 0.0064398819 4.1914501e-08 3045.2247 + 1410 0.006440302 4.2132499e-08 3045.4163 + 1420 0.0064407245 4.2383163e-08 3045.6091 + 1430 0.0064411496 4.2667584e-08 3045.803 + 1440 0.0064415776 4.2987016e-08 3045.9983 + 1450 0.0064420091 4.33429e-08 3046.1952 + 1460 0.0064424443 4.3736874e-08 3046.3938 + 1470 0.0064428835 4.4170794e-08 3046.5944 + 1480 0.0064433274 4.4646761e-08 3046.797 + 1490 0.0064437761 4.5167139e-08 3047.0019 + 1500 0.0064442303 4.5734596e-08 3047.2093 + 1510 0.0064446904 4.6352132e-08 3047.4195 + 1520 0.0064451569 4.7023127e-08 3047.6327 + 1530 0.0064456303 4.7751389e-08 3047.849 + 1540 0.0064461114 4.8541214e-08 3048.0689 + 1550 0.0064466006 4.9397455e-08 3048.2926 + 1560 0.0064470987 5.0325606e-08 3048.5204 + 1570 0.0064476064 5.1331902e-08 3048.7527 + 1580 0.0064481245 5.2423434e-08 3048.9899 + 1590 0.006448654 5.3608296e-08 3049.2323 + 1600 0.0064491958 5.4895757e-08 3049.4804 + 1610 0.006449751 5.6296469e-08 3049.7347 + 1620 0.0064503207 5.7822727e-08 3049.9959 + 1630 0.0064509063 5.9488788e-08 3050.2644 + 1640 0.0064515092 6.1311263e-08 3050.5409 + 1650 0.0064521312 6.3309616e-08 3050.8263 + 1660 0.006452774 6.5506785e-08 3051.1214 + 1670 0.0064534398 6.7929981e-08 3051.4272 + 1680 0.0064541309 7.0611714e-08 3051.7448 + 1690 0.0064548502 7.3591127e-08 3052.0755 + 1700 0.0064556007 7.6915753e-08 3052.4207 + 1710 0.0064563863 8.064386e-08 3052.7823 + 1720 0.0064572113 8.4847627e-08 3053.1621 + 1730 0.0064580807 8.9617502e-08 3053.5627 + 1740 0.0064590008 9.5068304e-08 3053.9869 + 1750 0.006459979 1.0134793e-07 3054.4381 + 1760 0.0064610244 1.0865003e-07 3054.9206 + 1770 0.0064621483 1.1723301e-07 3055.4397 + 1780 0.0064633651 1.2744917e-07 3056.0021 + 1790 0.0064646931 1.3979108e-07 3056.6163 + 1800 0.0064661566 1.5496815e-07 3057.2937 + 1810 0.0064677883 1.7403894e-07 3058.0494 + 1820 0.006469634 1.9865267e-07 3058.9049 + 1830 0.0064717601 2.3152064e-07 3059.8912 + 1840 0.0064742682 2.7741818e-07 3061.0556 + 1850 0.0064773249 3.4556351e-07 3062.4759 + 1860 0.0064812294 4.5619653e-07 3064.2917 + 1870 0.0064866019 6.6337441e-07 3066.7924 + 1880 0.0064950748 1.1706786e-06 3070.7399 + 1890 0.0065140322 3.7878566e-06 3079.5809 + 1900 0.0066957122 6.7105464e-06 3164.3691 + 1910 0.0067279909 1.493224e-06 3179.4195 + 1920 0.0067392058 8.1410321e-07 3184.6428 + 1930 0.0067460435 5.5996376e-07 3187.8246 + 1940 0.0067509948 4.2936252e-07 3190.1267 + 1950 0.0067549055 3.5072462e-07 3191.9436 + 1960 0.0067581623 2.9865016e-07 3193.4556 + 1970 0.0067609737 2.6192794e-07 3194.7601 + 1980 0.0067634648 2.3486813e-07 3195.9153 + 1990 0.0067657165 2.1428715e-07 3196.9589 + 2000 0.0067677841 1.9827071e-07 3197.9167 + 2010 0.0067697074 1.8560268e-07 3198.8073 + 2020 0.006771516 1.7547663e-07 3199.6445 + 2030 0.0067732327 1.6733961e-07 3200.4388 + 2040 0.0067748755 1.6080268e-07 3201.1987 + 2050 0.0067764591 1.5558723e-07 3201.931 + 2060 0.0067779957 1.5149159e-07 3202.6414 + 2070 0.0067794958 1.4836976e-07 3203.3348 + 2080 0.0067809687 1.4611749e-07 3204.0155 + 2090 0.0067824227 1.4466322e-07 3204.6874 + 2100 0.0067838655 1.4396229e-07 3205.3542 + 2110 0.0067853047 1.4399348e-07 3206.0191 + 2120 0.0067867474 1.4475745e-07 3206.6858 + 2130 0.0067882012 1.4627671e-07 3207.3576 + 2140 0.0067896737 1.4859736e-07 3208.0381 + 2150 0.0067911733 1.5179256e-07 3208.7311 + 2160 0.0067927092 1.5596849e-07 3209.4411 + 2170 0.0067942917 1.6127347e-07 3210.1728 + 2180 0.0067959331 1.6791214e-07 3210.9319 + 2190 0.0067976479 1.7616698e-07 3211.7251 + 2200 0.0067994539 1.8643208e-07 3212.5608 + 2210 0.0068013736 1.9926751e-07 3213.4494 + 2220 0.0068034361 2.154897e-07 3214.4044 + 2230 0.0068056803 2.3632937e-07 3215.4441 + 2240 0.0068081604 2.6372257e-07 3216.5937 + 2250 0.0068109549 3.0088625e-07 3217.8897 + 2260 0.0068141846 3.5356212e-07 3219.3884 + 2270 0.0068180485 4.330391e-07 3221.1825 + 2280 0.0068229109 5.6479966e-07 3223.4417 + 2290 0.0068295488 8.2016289e-07 3226.5284 + 2300 0.0068401389 1.4950446e-06 3231.4568 + 2310 0.0068668194 6.4794351e-06 3243.8847 + 2320 0.0071339944 2.3817631e-05 3368.3827 + 2330 0.0074221156 3.4144405e-05 3502.5364 + 2340 0.007650075 3.3142879e-06 3608.5998 + 2350 0.0076703526 1.1927138e-06 3618.0215 + 2360 0.0076797526 7.185434e-07 3622.3847 + 2370 0.0076859146 5.1648342e-07 3625.2424 + 2380 0.0076905359 4.0623045e-07 3627.3839 + 2390 0.0076942651 3.3753265e-07 3629.1108 + 2400 0.0076974175 2.910504e-07 3630.5697 + 2410 0.0077001699 2.5780894e-07 3631.8426 + 2420 0.007702631 2.3309498e-07 3632.9803 + 2430 0.007704873 2.1420535e-07 3634.0161 + 2440 0.0077069459 1.9948463e-07 3634.9733 + 2450 0.0077088862 1.8786685e-07 3635.869 + 2460 0.0077107216 1.7863849e-07 3636.716 + 2470 0.0077124736 1.713078e-07 3637.5242 + 2480 0.0077141595 1.6552875e-07 3638.3017 + 2490 0.0077157937 1.6105508e-07 3639.0552 + 2500 0.0077173883 1.5771154e-07 3639.7903 + 2510 0.0077189541 1.553756e-07 3640.5121 + 2520 0.0077205008 1.539658e-07 3641.2249 + 2530 0.0077220373 1.534345e-07 3641.933 + 2540 0.0077235724 1.5376384e-07 3642.6405 + 2550 0.0077251148 1.5496427e-07 3643.3513 + 2560 0.0077266731 1.5707538e-07 3644.0695 + 2570 0.007728257 1.6016917e-07 3644.7995 + 2580 0.0077298765 1.6435633e-07 3645.5461 + 2590 0.0077315435 1.6979645e-07 3646.3147 + 2600 0.0077332712 1.7671412e-07 3647.1115 + 2610 0.0077350759 1.8542415e-07 3647.944 + 2620 0.0077369773 1.9637153e-07 3648.8214 + 2630 0.0077390006 2.1019669e-07 3649.7553 + 2640 0.0077411783 2.2784614e-07 3650.7609 + 2650 0.0077435548 2.5076917e-07 3651.8588 + 2660 0.0077461922 2.8128932e-07 3653.0779 + 2670 0.0077491826 3.233607e-07 3654.4608 + 2680 0.0077526703 3.8426634e-07 3656.0746 + 2690 0.0077569014 4.7896536e-07 3658.0337 + 2700 0.0077623476 6.435095e-07 3660.5572 + 2710 0.0077700972 9.9066415e-07 3664.1508 + 2720 0.0077837321 2.1192489e-06 3670.4787 + 2730 0.0078537309 5.0478452e-05 3702.9978 + 2740 0.0080019842 2.234588e-06 3771.8639 + 2750 0.0080167983 9.3912008e-07 3778.7349 + 2760 0.0080243022 5.7998894e-07 3782.2116 + 2770 0.0080292782 4.1619434e-07 3784.5147 + 2780 0.0080329859 3.2365852e-07 3786.2291 + 2790 0.0080359374 2.6464667e-07 3787.5927 + 2800 0.0080383893 2.2394834e-07 3788.7244 + 2810 0.0080404882 1.9429813e-07 3789.6924 + 2820 0.0080423251 1.7180333e-07 3790.5389 + 2830 0.0080439606 1.5419708e-07 3791.292 + 2840 0.0080454366 1.4007294e-07 3791.9711 + 2850 0.0080467835 1.2851365e-07 3792.5904 + 2860 0.0080480239 1.1889632e-07 3793.1603 + 2870 0.0080491753 1.1078364e-07 3793.689 + 2880 0.0080502511 1.0385986e-07 3794.1826 + 2890 0.0080512621 9.7891518e-08 3794.6462 + 2900 0.0080522171 9.2702379e-08 3795.0838 + 2910 0.0080531232 8.815703e-08 3795.4988 + 2920 0.0080539863 8.4149767e-08 3795.8939 + 2930 0.0080548115 8.0596927e-08 3796.2714 + 2940 0.0080556029 7.7431468e-08 3796.6332 + 2950 0.0080563642 7.4599072e-08 3796.9811 + 2960 0.0080570985 7.2055292e-08 3797.3166 + 2970 0.0080578086 6.9763432e-08 3797.6407 + 2980 0.0080584967 6.7692955e-08 3797.9548 + 2990 0.0080591651 6.5818259e-08 3798.2596 + 3000 0.0080598155 6.4117744e-08 3798.5562 + 3010 0.0080604496 6.2573076e-08 3798.8452 + 3020 0.0080610689 6.1168613e-08 3799.1273 + 3030 0.0080616747 5.9890948e-08 3799.4033 + 3040 0.0080622683 5.8728542e-08 3799.6735 + 3050 0.0080628507 5.7671429e-08 3799.9386 + 3060 0.0080634231 5.6710976e-08 3800.199 + 3070 0.0080639862 5.5839691e-08 3800.4551 + 3080 0.008064541 5.5051058e-08 3800.7074 + 3090 0.0080650882 5.4339406e-08 3800.9562 + 3100 0.0080656287 5.3699803e-08 3801.2018 + 3110 0.008066163 5.3127961e-08 3801.4446 + 3120 0.008066692 5.2620159e-08 3801.6849 + 3130 0.0080672161 5.2173187e-08 3801.923 + 3140 0.0080677361 5.1784286e-08 3802.1591 + 3150 0.0080682524 5.1451107e-08 3802.3936 + 3160 0.0080687656 5.1171678e-08 3802.6266 + 3170 0.0080692762 5.0944369e-08 3802.8584 + 3180 0.0080697848 5.0767875e-08 3803.0892 + 3190 0.0080702919 5.064119e-08 3803.3194 + 3200 0.0080707979 5.0563598e-08 3803.549 + 3210 0.0080713034 5.0534662e-08 3803.7784 + 3220 0.0080718088 5.0554215e-08 3804.0077 + 3230 0.0080723146 5.0622362e-08 3804.2373 + 3240 0.0080728213 5.073948e-08 3804.4672 + 3250 0.0080733294 5.090622e-08 3804.6978 + 3260 0.0080738394 5.1123521e-08 3804.9292 + 3270 0.0080743518 5.139262e-08 3805.1618 + 3280 0.0080748671 5.171507e-08 3805.3957 + 3290 0.0080753859 5.2092761e-08 3805.6311 + 3300 0.0080759088 5.2527952e-08 3805.8685 + 3310 0.0080764362 5.3023303e-08 3806.1079 + 3320 0.0080769689 5.3581914e-08 3806.3498 + 3330 0.0080775075 5.4207378e-08 3806.5944 + 3340 0.0080780526 5.4903844e-08 3806.842 + 3350 0.0080786051 5.567608e-08 3807.093 + 3360 0.0080791656 5.652957e-08 3807.3477 + 3370 0.0080797351 5.7470611e-08 3807.6065 + 3380 0.0080803144 5.8506444e-08 3807.8698 + 3390 0.0080809045 5.9645402e-08 3808.1381 + 3400 0.0080815065 6.0897097e-08 3808.412 + 3410 0.0080821215 6.2272649e-08 3808.6918 + 3420 0.0080827509 6.3784959e-08 3808.9782 + 3430 0.0080833961 6.5449061e-08 3809.272 + 3440 0.0080840587 6.7282544e-08 3809.5737 + 3450 0.0080847405 6.9306098e-08 3809.8843 + 3460 0.0080854434 7.1544197e-08 3810.2047 + 3470 0.0080861698 7.402597e-08 3810.5359 + 3480 0.0080869223 7.6786336e-08 3810.8791 + 3490 0.0080877037 7.9867475e-08 3811.2357 + 3500 0.0080885176 8.3320783e-08 3811.6073 + 3510 0.0080893679 8.7209484e-08 3811.9957 + 3520 0.0080902594 9.1612182e-08 3812.4031 + 3530 0.0080911975 9.662777e-08 3812.8321 + 3540 0.008092189 1.0238234e-07 3813.2857 + 3550 0.008093242 1.0903907e-07 3813.7677 + 3560 0.0080943663 1.1681285e-07 3814.2827 + 3570 0.0080955744 1.2599212e-07 3814.8364 + 3580 0.0080968821 1.3697303e-07 3815.4361 + 3590 0.0080983096 1.5031413e-07 3816.0912 + 3600 0.008099884 1.6682798e-07 3816.8142 + 3610 0.0081016421 1.877419e-07 3817.6222 + 3620 0.0081036359 2.1499717e-07 3818.5391 + 3630 0.0081059419 2.5184713e-07 3819.6004 + 3640 0.0081086795 3.041685e-07 3820.8614 + 3650 0.0081120491 3.8370792e-07 3822.4147 + 3660 0.0081164246 5.1761443e-07 3824.4335 + 3670 0.0081226282 7.8476649e-07 3827.2984 + 3680 0.0081330874 1.5377267e-06 3832.133 + 3690 0.0081640997 9.4754571e-06 3846.4828 + 3700 0.0084647088 3.6520628e-05 3985.6105 + 3710 0.0087788105 5.0607918e-05 4130.8576 + 3720 0.0089496823 2.7369422e-06 4209.8144 + 3730 0.0089676915 1.1442905e-06 4218.1247 + 3740 0.0089769276 7.2591487e-07 4222.3827 + 3750 0.0089832427 5.3867242e-07 4225.2918 + 3760 0.0089881163 4.3436406e-07 4227.5353 + 3770 0.0089921427 3.689283e-07 4229.3876 + 3780 0.0089956201 3.2480899e-07 4230.9866 + 3790 0.0089987196 2.9368682e-07 4232.4111 + 3800 0.0090015492 2.7114137e-07 4233.711 + 3810 0.0090041821 2.5463023e-07 4234.9202 + 3820 0.0090066711 2.4261002e-07 4236.0629 + 3830 0.0090090563 2.3411372e-07 4237.1578 + 3840 0.0090113701 2.2853263e-07 4238.2196 + 3850 0.0090136398 2.2549889e-07 4239.2611 + 3860 0.0090158898 2.2482231e-07 4240.2936 + 3870 0.0090181435 2.264602e-07 4241.3277 + 3880 0.0090204243 2.3051066e-07 4242.3742 + 3890 0.0090227572 2.3722751e-07 4243.4449 + 3900 0.0090251709 2.4706119e-07 4244.5528 + 3910 0.0090276995 2.6073849e-07 4245.7136 + 3920 0.0090303862 2.7940938e-07 4246.9474 + 3930 0.0090332884 3.0492215e-07 4248.2805 + 3940 0.0090364872 3.4036714e-07 4249.7505 + 3950 0.0090401038 3.9124064e-07 4251.4133 + 3960 0.0090443343 4.6822852e-07 4253.3593 + 3970 0.0090495296 5.9498137e-07 4255.7504 + 3980 0.0090564177 8.3552398e-07 4258.9229 + 3990 0.0090669429 1.4384739e-06 4263.774 + 4000 0.0090904831 4.9111984e-06 4274.6331 + 4010 0.0092929124 8.3135371e-06 4368.0633 + 4020 0.0093414419 3.1334206e-06 4390.4447 + 4030 0.0093714047 3.1966251e-06 4404.2581 + 4040 0.0094176451 9.8265197e-06 4425.5788 + 4050 0.0097772862 4.2787238e-05 4591.3956 + 4060 0.010043914 5.0703357e-05 4714.2148 + 4070 0.010275503 5.9586189e-06 4820.8179 + 4080 0.010329372 6.4730027e-06 4845.5948 + 4090 0.010580719 3.2675549e-05 4961.1991 + 4100 0.01097933 4.1824022e-05 5144.3777 + 4110 0.011375225 4.4528389e-05 5326.1041 + 4120 0.011791986 4.4629128e-05 5517.1914 + 4130 0.012199057 3.8467532e-05 5703.6209 + 4140 0.012388718 1.6598211e-05 5790.3997 + 4150 0.012719145 2.6617697e-05 5941.4863 + 4160 0.013138874 3.9714695e-05 6133.2127 + 4170 0.013296898 5.7028372e-06 6205.3279 + 4180 0.013359491 1.0623338e-05 6233.8756 + 4190 0.013580279 4.9259166e-06 6334.5676 + 4200 0.013608204 1.5476759e-06 6347.2885 + 4210 0.013620408 9.4152281e-07 6352.8431 + 4220 0.013628594 7.0110358e-07 6356.5664 + 4230 0.01363499 5.7777895e-07 6359.474 + 4240 0.013640419 5.071712e-07 6361.941 + 4250 0.013645286 4.6571283e-07 6364.1515 + 4260 0.013649829 4.4320314e-07 6366.2145 + 4270 0.013654213 4.3508698e-07 6368.2055 + 4280 0.013658575 4.3986766e-07 6370.186 + 4290 0.013663045 4.5837677e-07 6372.2157 + 4300 0.013667773 4.9416073e-07 6374.363 + 4310 0.013672963 5.5535604e-07 6376.7211 + 4320 0.01367894 6.6021298e-07 6379.4372 + 4330 0.013686311 8.5526524e-07 6382.7882 + 4340 0.013696507 1.296644e-06 6387.4262 + 4350 0.013714701 2.9652221e-06 6395.7088 + 4360 0.013881439 3.5899661e-05 6471.6738 + 4370 0.014196617 3.1253608e-05 6615.1811 + 4380 0.014504048 7.0683429e-06 6755.0394 + 4390 0.014536871 1.4515319e-06 6769.9538 + 4400 0.014547629 7.6742092e-07 6774.8365 + 4410 0.01455401 5.1561918e-07 6777.7294 + 4420 0.014558528 3.8717171e-07 6779.7758 + 4430 0.014562024 3.1004583e-07 6781.3579 + 4440 0.014564879 2.5893679e-07 6782.6486 + 4450 0.014567296 2.2275131e-07 6783.7406 + 4460 0.014569397 1.9588676e-07 6784.6888 + 4470 0.014571258 1.7521879e-07 6785.5285 + 4480 0.014572934 1.5887218e-07 6786.2838 + 4490 0.014574461 1.4565562e-07 6786.9717 + 4500 0.014575867 1.3477717e-07 6787.6046 + 4510 0.014577173 1.2569059e-07 6788.1919 + 4520 0.014578394 1.1800737e-07 6788.741 + 4530 0.014579544 1.1144387e-07 6789.2576 + 4540 0.014580632 1.0578845e-07 6789.7464 + 4550 0.014581667 1.0088007e-07 6790.2111 + 4560 0.014582656 9.6594222e-08 6790.6548 + 4570 0.014583605 9.283317e-08 6791.0802 + 4580 0.014584518 8.9519251e-08 6791.4895 + 4590 0.0145854 8.6590045e-08 6791.8845 + 4600 0.014586254 8.3994895e-08 6792.267 + 4610 0.014587083 8.1692339e-08 6792.6383 + 4620 0.014587891 7.9648193e-08 6792.9997 + 4630 0.014588679 7.7834097e-08 6793.3523 + 4640 0.01458945 7.6226411e-08 6793.6971 + 4650 0.014590205 7.4805352e-08 6794.035 + 4660 0.014590948 7.3554327e-08 6794.3668 + 4670 0.014591678 7.2459408e-08 6794.6932 + 4680 0.014592398 7.1508917e-08 6795.015 + 4690 0.01459311 7.0693097e-08 6795.3328 + 4700 0.014593813 7.0003852e-08 6795.6471 + 4710 0.014594511 6.9434537e-08 6795.9585 + 4720 0.014595203 6.8979799e-08 6796.2676 + 4730 0.014595891 6.8635445e-08 6796.5748 + 4740 0.014596576 6.839835e-08 6796.8807 + 4750 0.01459726 6.8266383e-08 6797.1857 + 4760 0.014597942 6.823836e-08 6797.4903 + 4770 0.014598625 6.8314021e-08 6797.795 + 4780 0.014599309 6.849402e-08 6798.1003 + 4790 0.014599995 6.8779943e-08 6798.4065 + 4800 0.014600684 6.9174339e-08 6798.7143 + 4810 0.014601378 6.9680779e-08 6799.0241 + 4820 0.014602078 7.0303936e-08 6799.3364 + 4830 0.014602784 7.1049693e-08 6799.6517 + 4840 0.014603498 7.1925284e-08 6799.9707 + 4850 0.014604222 7.2939475e-08 6800.294 + 4860 0.014604956 7.4102791e-08 6800.6221 + 4870 0.014605703 7.5427802e-08 6800.9557 + 4880 0.014606464 7.6929481e-08 6801.2958 + 4890 0.014607241 7.8625665e-08 6801.643 + 4900 0.014608036 8.0537626e-08 6801.9983 + 4910 0.01460885 8.2690811e-08 6802.3627 + 4920 0.014609688 8.5115787e-08 6802.7374 + 4930 0.014610551 8.7849474e-08 6803.1237 + 4940 0.014611443 9.0936752e-08 6803.5231 + 4950 0.014612368 9.4432608e-08 6803.9372 + 4960 0.01461333 9.8405013e-08 6804.3681 + 4970 0.014614334 1.0293885e-07 6804.8181 + 4980 0.014615386 1.0814135e-07 6805.2899 + 4990 0.014616494 1.1414984e-07 6805.7869 + 5000 0.014617666 1.2114278e-07 6806.313 +Loop time of 20.4871 on 4 procs for 5000 steps with 32000 atoms + +Performance: 0.003 ns/day, 9395.278 hours/ns, 244.056 timesteps/s +80.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 | 5.3304 | 5.3747 | 5.4481 | 1.9 | 26.23 +Neigh | 0.47764 | 0.49529 | 0.50484 | 1.5 | 2.42 +Comm | 7.3264 | 7.6698 | 8.0174 | 11.5 | 37.44 +Output | 0.020597 | 0.064879 | 0.11197 | 13.7 | 0.32 +Modify | 4.3321 | 4.7499 | 5.1576 | 18.4 | 23.18 +Other | | 2.132 | | | 10.41 + +Nlocal: 8000 ave 8033 max 7977 min +Histogram: 1 0 1 1 0 0 0 0 0 1 +Nghost: 6061.25 ave 6085 max 6028 min +Histogram: 1 0 0 0 0 1 0 1 0 1 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 144002 ave 144601 max 143596 min +Histogram: 1 0 1 1 0 0 0 0 0 1 + +Total # of neighbors = 576008 +Ave neighs/atom = 18.0003 +Neighbor list builds = 67 +Dangerous builds = 38 +Total wall time: 0:00:20 diff --git a/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.1 b/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.1 new file mode 100644 index 0000000000..e586fb5afb --- /dev/null +++ b/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.1 @@ -0,0 +1,198 @@ +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 +# Test case / example for the electronic stopping fix elstop +# One fast atom, no other interactions. +# Elstop only applied in a smaller box in the middle. +# +# Also uses fix dt/reset, as one should when energies are high +# enough to require electronic stopping. + +units metal +boundary p p p +timestep 0.0001 + +lattice fcc 1 +Lattice spacing in x,y,z = 1 1 1 + +region rbox block -100 100 -100 100 -100 100 +region rsmallbox block -90 90 -90 90 -90 90 + +create_box 1 rbox +Created orthogonal box = (-100 -100 -100) to (100 100 100) + 1 by 1 by 1 MPI processor grid + +mass 1 28.0855 + +create_atoms 1 single 0 0 0 +Created 1 atoms + Time spent = 3.09944e-06 secs +velocity all set 1120 1620 389 + +pair_style zero 1 +pair_coeff * * 1 + +fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 +fix fel all elstop 1.0 Si.Si.elstop minneigh 0 region rsmallbox +fix fnve all nve + +compute ek all ke/atom +compute ektot all reduce sum c_ek + +thermo 100 +thermo_style custom step time dt f_fel c_ektot + +#dump mydump all custom 200 elstop.only.dump id x y z vx vy vz fx fy fz c_ek + +run 10000 +WARNING: More than one compute ke/atom (src/compute_ke_atom.cpp:55) +WARNING: More than one compute ke/atom (src/compute_ke_atom.cpp:55) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3 + ghost atom cutoff = 3 + binsize = 1.5, bins = 134 134 134 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) fix elstop, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 13.31 | 13.31 | 13.31 Mbytes +Step Time Dt f_fel c_ektot + 0 0 4.98128e-05 0 5865.5525 + 100 0.0049972222 5.0137252e-05 76.048699 5789.883 + 200 0.010027278 5.0467945e-05 151.67477 5714.2548 + 300 0.015090636 5.0803375e-05 226.8806 5639.0469 + 400 0.020187777 5.1143663e-05 301.6685 5564.2569 + 500 0.025319192 5.1488933e-05 376.04082 5489.8825 + 600 0.030485386 5.1839314e-05 449.99984 5415.9215 + 700 0.035686876 5.2194938e-05 523.54788 5342.3714 + 800 0.040924195 5.2555944e-05 596.68721 5269.23 + 900 0.046197886 5.2922477e-05 669.42011 5196.4951 + 1000 0.05150851 5.3294685e-05 741.74883 5124.1643 + 1100 0.056856642 5.3672723e-05 813.67563 5052.2355 + 1200 0.062229338 5.3731851e-05 824.43012 5041.1224 + 1300 0.067602524 5.3731851e-05 824.43012 5041.1224 + 1400 0.072978188 5.387166e-05 850.91948 5014.9907 + 1500 0.07838447 5.425887e-05 922.23961 4943.6685 + 1600 0.08382978 5.4652329e-05 993.16341 4872.7428 + 1700 0.089299984 5.4705935e-05 1002.3545 4863.198 + 1800 0.094770578 5.4705935e-05 1002.3545 4863.198 + 1900 0.10024117 5.4705935e-05 1002.3545 4863.198 + 2000 0.10571333 5.4819488e-05 1022.8338 4843.0716 + 2100 0.11121515 5.5222127e-05 1093.1986 4772.7048 + 2200 0.11675757 5.5631458e-05 1163.1724 4702.7291 + 2300 0.12234126 5.6047675e-05 1232.7573 4633.1422 + 2400 0.12796692 5.6470985e-05 1301.9555 4563.942 + 2500 0.13363527 5.6901598e-05 1370.7692 4495.1264 + 2600 0.13934706 5.7339739e-05 1439.2006 4426.6932 + 2700 0.14510304 5.7785637e-05 1507.2516 4358.6403 + 2800 0.150904 5.8239536e-05 1574.9245 4290.9655 + 2900 0.15675076 5.8701688e-05 1642.2213 4223.6668 + 3000 0.16264416 5.9172358e-05 1709.1441 4156.7422 + 3100 0.16858505 5.9651822e-05 1775.695 4090.1894 + 3200 0.17457434 6.0140369e-05 1841.8761 4024.0064 + 3300 0.18061294 6.0638302e-05 1907.6894 3958.1913 + 3400 0.18669814 6.0949329e-05 1947.6558 3917.8967 + 3500 0.19279307 6.0949329e-05 1947.6558 3917.8967 + 3600 0.198888 6.0949329e-05 1947.6558 3917.8967 + 3700 0.20498294 6.0949329e-05 1947.6558 3917.8967 + 3800 0.21107787 6.0949329e-05 1947.6558 3917.8967 + 3900 0.2171728 6.0949329e-05 1947.6558 3917.8967 + 4000 0.22326773 6.0949329e-05 1947.6558 3917.8967 + 4100 0.22936267 6.0949329e-05 1947.6558 3917.8967 + 4200 0.2354576 6.0949329e-05 1947.6558 3917.8967 + 4300 0.24155253 6.0949329e-05 1947.6558 3917.8967 + 4400 0.24764747 6.0949329e-05 1947.6558 3917.8967 + 4500 0.2537424 6.0949329e-05 1947.6558 3917.8967 + 4600 0.25983733 6.0949329e-05 1947.6558 3917.8967 + 4700 0.26593227 6.0949329e-05 1947.6558 3917.8967 + 4800 0.2720272 6.0949329e-05 1947.6558 3917.8967 + 4900 0.27812213 6.0949329e-05 1947.6558 3917.8967 + 5000 0.28421706 6.0949329e-05 1947.6558 3917.8967 + 5100 0.290312 6.0949329e-05 1947.6558 3917.8967 + 5200 0.29640693 6.0949329e-05 1947.6558 3917.8967 + 5300 0.30250186 6.0949329e-05 1947.6558 3917.8967 + 5400 0.3085968 6.0949329e-05 1947.6558 3917.8967 + 5500 0.31469173 6.0949329e-05 1947.6558 3917.8967 + 5600 0.32078666 6.0949329e-05 1947.6558 3917.8967 + 5700 0.32688159 6.0949329e-05 1947.6558 3917.8967 + 5800 0.33297653 6.0949329e-05 1947.6558 3917.8967 + 5900 0.33907146 6.0949329e-05 1947.6558 3917.8967 + 6000 0.34516639 6.0949329e-05 1947.6558 3917.8967 + 6100 0.35126133 6.0949329e-05 1947.6558 3917.8967 + 6200 0.35735626 6.0949329e-05 1947.6558 3917.8967 + 6300 0.36345119 6.0949329e-05 1947.6558 3917.8967 + 6400 0.36954612 6.0949329e-05 1947.6558 3917.8967 + 6500 0.37564106 6.0949329e-05 1947.6558 3917.8967 + 6600 0.38173599 6.0949329e-05 1947.6558 3917.8967 + 6700 0.38783092 6.0949329e-05 1947.6558 3917.8967 + 6800 0.39392586 6.0949329e-05 1947.6558 3917.8967 + 6900 0.40002079 6.0949329e-05 1947.6558 3917.8967 + 7000 0.40611572 6.0949329e-05 1947.6558 3917.8967 + 7100 0.41221066 6.0949329e-05 1947.6558 3917.8967 + 7200 0.41830559 6.0949329e-05 1947.6558 3917.8967 + 7300 0.42440052 6.0949329e-05 1947.6558 3917.8967 + 7400 0.43049545 6.0949329e-05 1947.6558 3917.8967 + 7500 0.43659039 6.0949329e-05 1947.6558 3917.8967 + 7600 0.44268532 6.0949329e-05 1947.6558 3917.8967 + 7700 0.44878025 6.0949329e-05 1947.6558 3917.8967 + 7800 0.45487519 6.0949329e-05 1947.6558 3917.8967 + 7900 0.46097012 6.0949329e-05 1947.6558 3917.8967 + 8000 0.46706505 6.0949329e-05 1947.6558 3917.8967 + 8100 0.47315998 6.0949329e-05 1947.6558 3917.8967 + 8200 0.47925492 6.0949329e-05 1947.6558 3917.8967 + 8300 0.48534985 6.0949329e-05 1947.6558 3917.8967 + 8400 0.49144478 6.0949329e-05 1947.6558 3917.8967 + 8500 0.49753972 6.0949329e-05 1947.6558 3917.8967 + 8600 0.50363465 6.0949329e-05 1947.6558 3917.8967 + 8700 0.50972958 6.0949329e-05 1947.6558 3917.8967 + 8800 0.51582452 6.0949329e-05 1947.6558 3917.8967 + 8900 0.52191945 6.0949329e-05 1947.6558 3917.8967 + 9000 0.52801438 6.0949329e-05 1947.6558 3917.8967 + 9100 0.53410931 6.0949329e-05 1947.6558 3917.8967 + 9200 0.54020425 6.0949329e-05 1947.6558 3917.8967 + 9300 0.54629918 6.0949329e-05 1947.6558 3917.8967 + 9400 0.55239411 6.0949329e-05 1947.6558 3917.8967 + 9500 0.55848905 6.0949329e-05 1947.6558 3917.8967 + 9600 0.56458398 6.0949329e-05 1947.6558 3917.8967 + 9700 0.57067891 6.0949329e-05 1947.6558 3917.8967 + 9800 0.57677384 6.0949329e-05 1947.6558 3917.8967 + 9900 0.58286878 6.0949329e-05 1947.6558 3917.8967 + 10000 0.58896371 6.0949329e-05 1947.6558 3917.8967 +Loop time of 1.81749 on 1 procs for 10000 steps with 1 atoms + +Performance: 28.974 ns/day, 0.828 hours/ns, 5502.087 timesteps/s +95.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.00068855 | 0.00068855 | 0.00068855 | 0.0 | 0.04 +Neigh | 1.777 | 1.777 | 1.777 | 0.0 | 97.77 +Comm | 0.028521 | 0.028521 | 0.028521 | 0.0 | 1.57 +Output | 0.0020428 | 0.0020428 | 0.0020428 | 0.0 | 0.11 +Modify | 0.0063827 | 0.0063827 | 0.0063827 | 0.0 | 0.35 +Other | | 0.002891 | | | 0.16 + +Nlocal: 1 ave 1 max 1 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Nghost: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 +FullNghs: 0 ave 0 max 0 min +Histogram: 1 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Ave neighs/atom = 0 +Neighbor list builds = 960 +Dangerous builds = 568 +Total wall time: 0:00:01 diff --git a/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.4 b/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.4 new file mode 100644 index 0000000000..5ed0d86f1c --- /dev/null +++ b/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.4 @@ -0,0 +1,198 @@ +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 +# Test case / example for the electronic stopping fix elstop +# One fast atom, no other interactions. +# Elstop only applied in a smaller box in the middle. +# +# Also uses fix dt/reset, as one should when energies are high +# enough to require electronic stopping. + +units metal +boundary p p p +timestep 0.0001 + +lattice fcc 1 +Lattice spacing in x,y,z = 1 1 1 + +region rbox block -100 100 -100 100 -100 100 +region rsmallbox block -90 90 -90 90 -90 90 + +create_box 1 rbox +Created orthogonal box = (-100 -100 -100) to (100 100 100) + 1 by 2 by 2 MPI processor grid + +mass 1 28.0855 + +create_atoms 1 single 0 0 0 +Created 1 atoms + Time spent = 2.00272e-05 secs +velocity all set 1120 1620 389 + +pair_style zero 1 +pair_coeff * * 1 + +fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 +fix fel all elstop 1.0 Si.Si.elstop minneigh 0 region rsmallbox +fix fnve all nve + +compute ek all ke/atom +compute ektot all reduce sum c_ek + +thermo 100 +thermo_style custom step time dt f_fel c_ektot + +#dump mydump all custom 200 elstop.only.dump id x y z vx vy vz fx fy fz c_ek + +run 10000 +WARNING: More than one compute ke/atom (src/compute_ke_atom.cpp:55) +WARNING: More than one compute ke/atom (src/compute_ke_atom.cpp:55) +Neighbor list info ... + update every 1 steps, delay 10 steps, check yes + max neighbors/atom: 2000, page size: 100000 + master list distance cutoff = 3 + ghost atom cutoff = 3 + binsize = 1.5, bins = 134 134 134 + 2 neighbor lists, perpetual/occasional/extra = 1 1 0 + (1) pair zero, perpetual + attributes: half, newton on + pair build: half/bin/atomonly/newton + stencil: half/bin/3d/newton + bin: standard + (2) fix elstop, occasional + attributes: full, newton on + pair build: full/bin/atomonly + stencil: full/bin/3d + bin: standard +Per MPI rank memory allocation (min/avg/max) = 3.637 | 4.2 | 5.887 Mbytes +Step Time Dt f_fel c_ektot + 0 0 4.98128e-05 0 5865.5525 + 100 0.0049972222 5.0137252e-05 76.048699 5789.883 + 200 0.010027278 5.0467945e-05 151.67477 5714.2548 + 300 0.015090636 5.0803375e-05 226.8806 5639.0469 + 400 0.020187777 5.1143663e-05 301.6685 5564.2569 + 500 0.025319192 5.1488933e-05 376.04082 5489.8825 + 600 0.030485386 5.1839314e-05 449.99984 5415.9215 + 700 0.035686876 5.2194938e-05 523.54788 5342.3714 + 800 0.040924195 5.2555944e-05 596.68721 5269.23 + 900 0.046197886 5.2922477e-05 669.42011 5196.4951 + 1000 0.05150851 5.3294685e-05 741.74883 5124.1643 + 1100 0.056856642 5.3672723e-05 813.67563 5052.2355 + 1200 0.062229338 5.3731851e-05 824.43012 5041.1224 + 1300 0.067602524 5.3731851e-05 824.43012 5041.1224 + 1400 0.072978188 5.387166e-05 850.91948 5014.9907 + 1500 0.07838447 5.425887e-05 922.23961 4943.6685 + 1600 0.08382978 5.4652329e-05 993.16341 4872.7428 + 1700 0.089299984 5.4705935e-05 1002.3545 4863.198 + 1800 0.094770578 5.4705935e-05 1002.3545 4863.198 + 1900 0.10024117 5.4705935e-05 1002.3545 4863.198 + 2000 0.10571333 5.4819488e-05 1022.8338 4843.0716 + 2100 0.11121515 5.5222127e-05 1093.1986 4772.7048 + 2200 0.11675757 5.5631458e-05 1163.1724 4702.7291 + 2300 0.12234126 5.6047675e-05 1232.7573 4633.1422 + 2400 0.12796692 5.6470985e-05 1301.9555 4563.942 + 2500 0.13363527 5.6901598e-05 1370.7692 4495.1264 + 2600 0.13934706 5.7339739e-05 1439.2006 4426.6932 + 2700 0.14510304 5.7785637e-05 1507.2516 4358.6403 + 2800 0.150904 5.8239536e-05 1574.9245 4290.9655 + 2900 0.15675076 5.8701688e-05 1642.2213 4223.6668 + 3000 0.16264416 5.9172358e-05 1709.1441 4156.7422 + 3100 0.16858505 5.9651822e-05 1775.695 4090.1894 + 3200 0.17457434 6.0140369e-05 1841.8761 4024.0064 + 3300 0.18061294 6.0638302e-05 1907.6894 3958.1913 + 3400 0.18669814 6.0949329e-05 1947.6558 3917.8967 + 3500 0.19279307 6.0949329e-05 1947.6558 3917.8967 + 3600 0.198888 6.0949329e-05 1947.6558 3917.8967 + 3700 0.20498294 6.0949329e-05 1947.6558 3917.8967 + 3800 0.21107787 6.0949329e-05 1947.6558 3917.8967 + 3900 0.2171728 6.0949329e-05 1947.6558 3917.8967 + 4000 0.22326773 6.0949329e-05 1947.6558 3917.8967 + 4100 0.22936267 6.0949329e-05 1947.6558 3917.8967 + 4200 0.2354576 6.0949329e-05 1947.6558 3917.8967 + 4300 0.24155253 6.0949329e-05 1947.6558 3917.8967 + 4400 0.24764747 6.0949329e-05 1947.6558 3917.8967 + 4500 0.2537424 6.0949329e-05 1947.6558 3917.8967 + 4600 0.25983733 6.0949329e-05 1947.6558 3917.8967 + 4700 0.26593227 6.0949329e-05 1947.6558 3917.8967 + 4800 0.2720272 6.0949329e-05 1947.6558 3917.8967 + 4900 0.27812213 6.0949329e-05 1947.6558 3917.8967 + 5000 0.28421706 6.0949329e-05 1947.6558 3917.8967 + 5100 0.290312 6.0949329e-05 1947.6558 3917.8967 + 5200 0.29640693 6.0949329e-05 1947.6558 3917.8967 + 5300 0.30250186 6.0949329e-05 1947.6558 3917.8967 + 5400 0.3085968 6.0949329e-05 1947.6558 3917.8967 + 5500 0.31469173 6.0949329e-05 1947.6558 3917.8967 + 5600 0.32078666 6.0949329e-05 1947.6558 3917.8967 + 5700 0.32688159 6.0949329e-05 1947.6558 3917.8967 + 5800 0.33297653 6.0949329e-05 1947.6558 3917.8967 + 5900 0.33907146 6.0949329e-05 1947.6558 3917.8967 + 6000 0.34516639 6.0949329e-05 1947.6558 3917.8967 + 6100 0.35126133 6.0949329e-05 1947.6558 3917.8967 + 6200 0.35735626 6.0949329e-05 1947.6558 3917.8967 + 6300 0.36345119 6.0949329e-05 1947.6558 3917.8967 + 6400 0.36954612 6.0949329e-05 1947.6558 3917.8967 + 6500 0.37564106 6.0949329e-05 1947.6558 3917.8967 + 6600 0.38173599 6.0949329e-05 1947.6558 3917.8967 + 6700 0.38783092 6.0949329e-05 1947.6558 3917.8967 + 6800 0.39392586 6.0949329e-05 1947.6558 3917.8967 + 6900 0.40002079 6.0949329e-05 1947.6558 3917.8967 + 7000 0.40611572 6.0949329e-05 1947.6558 3917.8967 + 7100 0.41221066 6.0949329e-05 1947.6558 3917.8967 + 7200 0.41830559 6.0949329e-05 1947.6558 3917.8967 + 7300 0.42440052 6.0949329e-05 1947.6558 3917.8967 + 7400 0.43049545 6.0949329e-05 1947.6558 3917.8967 + 7500 0.43659039 6.0949329e-05 1947.6558 3917.8967 + 7600 0.44268532 6.0949329e-05 1947.6558 3917.8967 + 7700 0.44878025 6.0949329e-05 1947.6558 3917.8967 + 7800 0.45487519 6.0949329e-05 1947.6558 3917.8967 + 7900 0.46097012 6.0949329e-05 1947.6558 3917.8967 + 8000 0.46706505 6.0949329e-05 1947.6558 3917.8967 + 8100 0.47315998 6.0949329e-05 1947.6558 3917.8967 + 8200 0.47925492 6.0949329e-05 1947.6558 3917.8967 + 8300 0.48534985 6.0949329e-05 1947.6558 3917.8967 + 8400 0.49144478 6.0949329e-05 1947.6558 3917.8967 + 8500 0.49753972 6.0949329e-05 1947.6558 3917.8967 + 8600 0.50363465 6.0949329e-05 1947.6558 3917.8967 + 8700 0.50972958 6.0949329e-05 1947.6558 3917.8967 + 8800 0.51582452 6.0949329e-05 1947.6558 3917.8967 + 8900 0.52191945 6.0949329e-05 1947.6558 3917.8967 + 9000 0.52801438 6.0949329e-05 1947.6558 3917.8967 + 9100 0.53410931 6.0949329e-05 1947.6558 3917.8967 + 9200 0.54020425 6.0949329e-05 1947.6558 3917.8967 + 9300 0.54629918 6.0949329e-05 1947.6558 3917.8967 + 9400 0.55239411 6.0949329e-05 1947.6558 3917.8967 + 9500 0.55848905 6.0949329e-05 1947.6558 3917.8967 + 9600 0.56458398 6.0949329e-05 1947.6558 3917.8967 + 9700 0.57067891 6.0949329e-05 1947.6558 3917.8967 + 9800 0.57677384 6.0949329e-05 1947.6558 3917.8967 + 9900 0.58286878 6.0949329e-05 1947.6558 3917.8967 + 10000 0.58896371 6.0949329e-05 1947.6558 3917.8967 +Loop time of 3.82192 on 4 procs for 10000 steps with 1 atoms + +Performance: 13.778 ns/day, 1.742 hours/ns, 2616.487 timesteps/s +76.8% 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.0006454 | 0.00077975 | 0.001003 | 0.0 | 0.02 +Neigh | 1.3094 | 1.3771 | 1.441 | 4.0 | 36.03 +Comm | 0.13665 | 0.16207 | 0.20281 | 6.1 | 4.24 +Output | 0.036584 | 0.046189 | 0.060792 | 4.2 | 1.21 +Modify | 2.1326 | 2.212 | 2.3096 | 4.3 | 57.88 +Other | | 0.02382 | | | 0.62 + +Nlocal: 0.25 ave 1 max 0 min +Histogram: 3 0 0 0 0 0 0 0 0 1 +Nghost: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +Neighs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 +FullNghs: 0 ave 0 max 0 min +Histogram: 4 0 0 0 0 0 0 0 0 0 + +Total # of neighbors = 0 +Ave neighs/atom = 0 +Neighbor list builds = 960 +Dangerous builds = 568 +Total wall time: 0:00:03 diff --git a/src/USER-MISC/README b/src/USER-MISC/README index 13e406d42f..43deda0bdb 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -45,6 +45,7 @@ dihedral_style table/cut, Mike Salerno, ksalerno@pha.jhu.edu, 11 May 18 fix addtorque, Laurent Joly (U Lyon), ljoly.ulyon at gmail.com, 8 Aug 11 fix ave/correlate/long, Jorge Ramirez (UPM Madrid), jorge.ramirez at upm.es, 21 Oct 2015 fix bond/react, Jacob Gissinger (CU Boulder), info at disarmmd.org, 24 Feb 2018 +fix elstop, Konstantin Avchaciov, k.avchachov at gmail.com, 26 Feb 2019 fix ffl, David Wilkins (EPFL Lausanne), david.wilkins @ epfl.ch, 28 Sep 2018 fix filter/corotate, Lukas Fath (KIT), lukas.fath at kit.edu, 15 Mar 2017 fix flow/gauss, Joel Eaves (CU Boulder), Joel.Eaves@Colorado.edu, 23 Aug 2016 diff --git a/src/USER-MISC/fix_elstop.cpp b/src/USER-MISC/fix_elstop.cpp new file mode 100644 index 0000000000..def576cfca --- /dev/null +++ b/src/USER-MISC/fix_elstop.cpp @@ -0,0 +1,326 @@ +/* ---------------------------------------------------------------------- + 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. +------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Electronic stopping power + Contributing authors: K. Avchaciov and T. Metspalu + Information: k.avchachov@gmail.com +------------------------------------------------------------------------- */ + +#include +#include +#include +#include "fix_elstop.h" +#include "mpi.h" +#include "atom.h" +#include "update.h" +#include "domain.h" +#include "region.h" +#include "group.h" +#include "force.h" +#include "pair.h" +#include "fix.h" +#include "compute.h" +#include "modify.h" +#include "memory.h" +#include "comm.h" +#include "error.h" +#include "neighbor.h" +#include "neigh_list.h" +#include "neigh_request.h" + +using namespace LAMMPS_NS; +using namespace FixConst; + +#define MAXLINE 1024 + +/* ---------------------------------------------------------------------- */ + +FixElstop::FixElstop(LAMMPS *lmp, int narg, char **arg) : + Fix(lmp, narg, arg) +{ + scalar_flag = 1; // Has compute_scalar + global_freq = 1; // SeLoss computed every step + extscalar = 0; // SeLoss compute_scalar is intensive + nevery = 1; // Run fix every step + + + // Make sure the id for the kinetic energy compute is unique + // by prepending the ID of this fix. + int n = strlen(id) + strlen("_ke_atom") + 1; + id_ke_atom = new char[n]; + strcpy(id_ke_atom, id); + strcat(id_ke_atom, "_ke_atom"); + + char *newarg[3]; + newarg[0] = id_ke_atom; + newarg[1] = group->names[igroup]; + newarg[2] = (char *) "ke/atom"; + modify->add_compute(3, newarg); + + + // args: 0 = fix ID, 1 = group ID, 2 = "elstop" + // 3 = Ecut, 4 = file path + // optional rest: "region" + // "minneigh" + + if (narg < 5) + error->all(FLERR, "Illegal fix elstop command: too few arguments"); + + Ecut = force->numeric(FLERR, arg[3]); + if (Ecut <= 0.0) error->all(FLERR, "Illegal fix elstop command: Ecut <= 0"); + + int iarg = 5; + iregion = -1; + minneigh = 1; + bool minneighflag = false; + + while (iarg < narg) { + if (strcmp(arg[iarg], "region") == 0) { + if (iregion >= 0) + error->all(FLERR, "Illegal fix elstop command: region given twice"); + if (iarg+2 > narg) + error->all(FLERR, "Illegal fix elstop command: region name missing"); + iregion = domain->find_region(arg[iarg+1]); + if (iregion < 0) + error->all(FLERR, "Region ID for fix elstop does not exist"); + iarg += 2; + } + else if (strcmp(arg[iarg], "minneigh") == 0) { + if (minneighflag) + error->all(FLERR, "Illegal fix elstop command: minneigh given twice"); + minneighflag = true; + if (iarg+2 > narg) + error->all(FLERR, "Illegal fix elstop command: minneigh number missing"); + minneigh = force->inumeric(FLERR, arg[iarg+1]); + if (minneigh < 0) + error->all(FLERR, "Illegal fix elstop command: minneigh < 0"); + iarg += 2; + } + else error->all(FLERR, "Illegal fix elstop command: unknown argument"); + } + + + // Read the input file for energy ranges and stopping powers. + // First proc 0 reads the file, then bcast to others. + const int ncol = atom->ntypes + 1; + if (comm->me == 0) { + maxlines = 300; + memory->create(elstop_ranges, ncol, maxlines, "elstop:tabs"); + read_table(arg[4]); + } + + MPI_Bcast(&maxlines, 1 , MPI_INT, 0, world); + MPI_Bcast(&table_entries, 1 , MPI_INT, 0, world); + + if (comm->me != 0) + memory->create(elstop_ranges, ncol, maxlines, "elstop:tabs"); + + MPI_Bcast(&elstop_ranges[0][0], ncol*maxlines, MPI_DOUBLE, 0, world); +} + +/* ---------------------------------------------------------------------- */ + +FixElstop::~FixElstop() +{ + memory->destroy(elstop_ranges); + modify->delete_compute(id_ke_atom); + delete id_ke_atom; +} + +/* ---------------------------------------------------------------------- */ + +int FixElstop::setmask() +{ + int mask = 0; + mask |= POST_FORCE; + return mask; +} + +/* ---------------------------------------------------------------------- */ + +void FixElstop::init() +{ + SeLoss_sync_flag = 0; + SeLoss = 0.0; + + int ikeatom = modify->find_compute(id_ke_atom); + if (ikeatom < 0) + error->all(FLERR, "KE compute ID for fix elstop does not exist"); + c_ke = modify->compute[ikeatom]; + + + // need an occasional full neighbor list + 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]->occasional = 1; +} + +/* ---------------------------------------------------------------------- */ + +void FixElstop::init_list(int /*id*/, NeighList *ptr) +{ + list = ptr; +} + +/* ---------------------------------------------------------------------- */ + +void FixElstop::post_force(int /*vflag*/) +{ + SeLoss_sync_flag = 0; + + double **x = atom->x; + double **v = atom->v; + double **f = atom->f; + double dt = update->dt; + + int *type = atom->type; + int *mask = atom->mask; + int nlocal = atom->nlocal; + + neighbor->build_one(list); + int *numneigh = list->numneigh; + + c_ke->compute_peratom(); + double *ke = c_ke->vector_atom; + + for (int i = 0; i < nlocal; ++i) { + + // Do fast checks first, only then the region check + if (!(mask[i] & groupbit)) continue; + + // Avoid atoms outside bulk material + if (numneigh[i] < minneigh) continue; + + double energy = ke[i]; + if (energy < Ecut) continue; + if (energy < elstop_ranges[0][0]) continue; + if (energy > elstop_ranges[0][table_entries - 1]) + error->one(FLERR, "Atom kinetic energy too high for fix elstop"); + + if (iregion >= 0) { + // Only apply in the given region + if (domain->regions[iregion]->match(x[i][0], x[i][1], x[i][2]) != 1) + continue; + } + + // Binary search to find correct energy range + int iup = table_entries - 1; + int idown = 0; + while (true) { + int ihalf = idown + (iup - idown) / 2; + if (ihalf == idown) break; + if (elstop_ranges[0][ihalf] < energy) idown = ihalf; + else iup = ihalf; + } + + int itype = type[i]; + double Se_lo = elstop_ranges[itype][idown]; + double Se_hi = elstop_ranges[itype][iup]; + double E_lo = elstop_ranges[0][idown]; + double E_hi = elstop_ranges[0][iup]; + + // Get elstop with a simple linear interpolation + double Se = (Se_hi - Se_lo) / (E_hi - E_lo) * (energy - E_lo) + Se_lo; + + double v2 = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; + double vabs = sqrt(v2); + double factor = -Se / vabs; + + f[i][0] += v[i][0] * factor; + f[i][1] += v[i][1] * factor; + f[i][2] += v[i][2] * factor; + + SeLoss += Se * vabs * dt; // very rough approx + } +} + +/* ---------------------------------------------------------------------- */ + +double FixElstop::compute_scalar() +{ + // only sum across procs when changed since last call + + if (SeLoss_sync_flag == 0) { + MPI_Allreduce(&SeLoss, &SeLoss_all, 1, MPI_DOUBLE, MPI_SUM, world); + SeLoss_sync_flag = 1; + } + return SeLoss_all; +} + +/* ---------------------------------------------------------------------- */ + +void FixElstop::read_table(const char *file) +{ + char line[MAXLINE]; + + FILE *fp = force->open_potential(file); + if (fp == NULL) { + char str[128]; + snprintf(str, 128, "Cannot open stopping range table %s", file); + error->one(FLERR, str); + } + + const int ncol = atom->ntypes + 1; + + int l = 0; + while (true) { + if (fgets(line, MAXLINE, fp) == NULL) break; // end of file + if (line[0] == '#') continue; // comment + + char *pch = strtok(line, " \t\n\r"); + if (pch == NULL) continue; // blank line + + if (l >= maxlines) grow_table(); + + int i = 0; + for ( ; i < ncol && pch != NULL; i++) { + elstop_ranges[i][l] = force->numeric(FLERR, pch); + pch = strtok(NULL, " \t\n\r"); + } + + if (i != ncol || pch != NULL) // too short or too long + error->one(FLERR, "fix elstop: Invalid table line"); + + if (l >= 1 && elstop_ranges[0][l] <= elstop_ranges[0][l-1]) + error->one(FLERR, "fix elstop: Energies must be in ascending order"); + + l++; + } + table_entries = l; + + if (table_entries == 0) + error->one(FLERR, "Did not find any data in elstop table file"); + + fclose(fp); +} + +/* ---------------------------------------------------------------------- */ + +void FixElstop::grow_table() +{ + const int ncol = atom->ntypes + 1; + int new_maxlines = 2 * maxlines; + + double **new_array; + memory->create(new_array, ncol, new_maxlines, "elstop:tabscopy"); + + for (int i = 0; i < ncol; i++) + memcpy(new_array[i], elstop_ranges[i], maxlines*sizeof(double)); + + memory->destroy(elstop_ranges); + elstop_ranges = new_array; + maxlines = new_maxlines; +} diff --git a/src/USER-MISC/fix_elstop.h b/src/USER-MISC/fix_elstop.h new file mode 100644 index 0000000000..dc49825290 --- /dev/null +++ b/src/USER-MISC/fix_elstop.h @@ -0,0 +1,111 @@ +/* -*- 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. +------------------------------------------------------------------------- */ +/* ---------------------------------------------------------------------- + Electronic stopping power + Contributing authors: K. Avchaciov and T. Metspalu + Information: k.avchachov@gmail.com +------------------------------------------------------------------------- */ + +#ifdef FIX_CLASS + +FixStyle(elstop,FixElstop) + +#else + +#ifndef LMP_FIX_ELSTOP_H +#define LMP_FIX_ELSTOP_H + +#include "fix.h" + + +namespace LAMMPS_NS { + +class FixElstop : public Fix { + public: + FixElstop(class LAMMPS *, int, char **); + ~FixElstop(); + int setmask(); + void init(); + void post_force(int); + void init_list(int, class NeighList *); + double compute_scalar(); + + private: + void read_table(const char *); + void grow_table(); + + double Ecut; // cutoff energy + double SeLoss, SeLoss_all; // electronic energy loss + int SeLoss_sync_flag; // sync done since last change? + + int maxlines; // max number of lines in table + int table_entries; // number of table entries actually read + double **elstop_ranges; // [ 0][i]: energies + // [>0][i]: stopping powers per type + + char *id_ke_atom; // name of kinetic energy compute + int iregion; // region index if used, else -1 + int minneigh; // minimum number of neighbors + + class NeighList *list; + class Compute *c_ke; +}; + +} + +#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: Region ID for fix elstop does not exist + +Self-explanatory. + +E: KE compute ID for fix elstop does not exist + +Internal error. Should not happen. + +E: Atom kinetic energy too high for fix elstop + +The group given in the fix elstop command includes an atom that has +a kinetic energy higher than the largest energy in the elstop table. +Reconsider whether the table is physically applicable to your system. + +E: Cannot open stopping range table ... + +The file containing the elstop table could not be opened. Chck the +given path and the file's permissions. + +E: fix elstop: Invalid table line + +A line in the elstop table file contained too many or too few columns. + +E: fix elstop: Energies must be in ascending order + +The first column in the elstop table must be sorted from the smallest +energy to the largest. + +E: Did not find any data in elstop table file + +Parsing the elstop table file produced no lines that were identifiable +as energies/stopping powers. Most likely the file is empty or contains +only comments. + +*/ From 676370ade7995fca6ef125d8644e196c55c16ef4 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 26 Mar 2019 07:21:16 -0600 Subject: [PATCH 0328/1242] Commit JT 032619 - added citeme in neb/spin - started work on distance output --- src/SPIN/fix_neb_spin.cpp | 7 ++++++- src/SPIN/neb_spin.cpp | 24 +++++++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/SPIN/fix_neb_spin.cpp b/src/SPIN/fix_neb_spin.cpp index 610e6d2fe5..49736bce33 100644 --- a/src/SPIN/fix_neb_spin.cpp +++ b/src/SPIN/fix_neb_spin.cpp @@ -566,6 +566,10 @@ void FixNEB_spin::min_post_force(int /*vflag*/) if (NEBLongRange) error->all(FLERR,"NEB_spin long range option not yet active"); + // test output length + + //printf("testi irep / plen: %d %g \n",ireplica,nlen); + // exit calc. if first or last replica (no gneb force) if (ireplica == 0 || ireplica == nreplica-1) return ; @@ -587,11 +591,12 @@ void FixNEB_spin::min_post_force(int /*vflag*/) MPI_Allreduce(&dot,&dotall,1,MPI_DOUBLE,MPI_SUM,world); dot=dotall; + // for intermediate replica // calc. GNEB force prefactor if (ireplica == rclimber) prefactor = -2.0*dot; // for climbing replica else { - if (NEBLongRange) { // for intermediate replica + if (NEBLongRange) { error->all(FLERR,"Long Range NEB_spin climber option not yet active"); } else if (StandardNEB) { prefactor = -dot + kspring*(nlen-plen); diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 728532a187..ecbbffdcd8 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -15,6 +15,10 @@ Contributing authors: Julien Tranchida (SNL) Please cite the related publication: + Bessarab, P. F., Uzdin, V. M., & Jónsson, H. (2015). + Method for finding mechanism and activation energy of magnetic transitions, + applied to skyrmion and antivortex annihilation. + Computer Physics Communications, 196, 335-347. ------------------------------------------------------------------------- */ // lmptype.h must be first b/c this file uses MAXBIGINT and includes mpi.h @@ -27,6 +31,7 @@ #include #include #include "neb_spin.h" +#include "citeme.h" #include "compute.h" #include "force.h" #include "universe.h" @@ -49,6 +54,21 @@ using namespace LAMMPS_NS; using namespace MathConst; +static const char cite_neb_spin[] = + "neb/spin command:\n\n" + "@article{bessarab2015method,\n" + "title={Method for finding mechanism and activation energy of " + "magnetic transitions, applied to skyrmion and antivortex " + "annihilation},\n" + "author={Bessarab, P.F. and Uzdin, V.M. and J{\'o}nsson, H.},\n" + "journal={Computer Physics Communications},\n" + "volume={196},\n" + "pages={335--347},\n" + "year={2015},\n" + "publisher={Elsevier}\n" + "doi={10.1016/j.cpc.2015.07.001}\n" + "}\n\n"; + #define MAXLINE 256 #define CHUNK 1024 // 8 attributes: tag, spin norm, position (3), spin direction (3) @@ -56,7 +76,9 @@ using namespace MathConst; /* ---------------------------------------------------------------------- */ -NEB_spin::NEB_spin(LAMMPS *lmp) : Pointers(lmp) {} +NEB_spin::NEB_spin(LAMMPS *lmp) : Pointers(lmp) { + if (lmp->citeme) lmp->citeme->add(cite_neb_spin); +} /* ---------------------------------------------------------------------- internal NEB_spin constructor, called from TAD From 9912c444135a7476d9ae4b88f209e6a4f585a210 Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Fri, 30 Nov 2018 11:54:48 -0700 Subject: [PATCH 0329/1242] 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 0330/1242] 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 0331/1242] 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 0332/1242] 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 0333/1242] 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 0334/1242] 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 0335/1242] 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 0336/1242] 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 0337/1242] 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 0338/1242] 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 0339/1242] 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 0340/1242] 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 0341/1242] 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 0342/1242] 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 0343/1242] 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 0344/1242] 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 3cabfd13cd1b4f4628aff45fd59c1a78f7c4d6b3 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 26 Mar 2019 12:51:51 -0600 Subject: [PATCH 0345/1242] Commit JT 032619 - finish merge of min_spin.cpp - test output --- src/SPIN/min_spin.cpp | 116 ------------------------------------------ src/SPIN/neb_spin.cpp | 3 +- 2 files changed, 2 insertions(+), 117 deletions(-) diff --git a/src/SPIN/min_spin.cpp b/src/SPIN/min_spin.cpp index 33b602f519..2bddc110e7 100644 --- a/src/SPIN/min_spin.cpp +++ b/src/SPIN/min_spin.cpp @@ -51,11 +51,7 @@ MinSpin::MinSpin(LAMMPS *lmp) : Min(lmp) {} void MinSpin::init() { alpha_damp = 1.0; -<<<<<<< HEAD - discret_factor = 10.0; -======= discrete_factor = 10.0; ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 Min::init(); @@ -88,15 +84,9 @@ int MinSpin::modify_param(int narg, char **arg) alpha_damp = force->numeric(FLERR,arg[1]); return 2; } -<<<<<<< HEAD - if (strcmp(arg[0],"discret_factor") == 0) { - if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); - discret_factor = force->numeric(FLERR,arg[1]); -======= if (strcmp(arg[0],"discrete_factor") == 0) { if (narg < 2) error->all(FLERR,"Illegal fix_modify command"); discrete_factor = force->numeric(FLERR,arg[1]); ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 return 2; } return 0; @@ -114,17 +104,10 @@ void MinSpin::reset_vectors() // size sp is 4N vector nvec = 4 * atom->nlocal; if (nvec) spvec = atom->sp[0]; -<<<<<<< HEAD - - nvec = 3 * atom->nlocal; - if (nvec) fmvec = atom->fm[0]; - -======= nvec = 3 * atom->nlocal; if (nvec) fmvec = atom->fm[0]; ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 if (nvec) xvec = atom->x[0]; if (nvec) fvec = atom->f[0]; } @@ -136,11 +119,7 @@ void MinSpin::reset_vectors() int MinSpin::iterate(int maxiter) { bigint ntimestep; -<<<<<<< HEAD - double fmdotfm,fmdotfmall; -======= double fmdotfm; ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 int flag,flagall; for (int iter = 0; iter < maxiter; iter++) { @@ -153,21 +132,12 @@ int MinSpin::iterate(int maxiter) // optimize timestep accross processes / replicas // need a force calculation for timestep optimization -<<<<<<< HEAD - - energy_force(0); - dts = evaluate_dt(); - - // apply damped precessional dynamics to the spins - -======= energy_force(0); dts = evaluate_dt(); // apply damped precessional dynamics to the spins ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 advance_spins(dts); eprevious = ecurrent; @@ -230,18 +200,10 @@ double MinSpin::evaluate_dt() double fmsq; double fmaxsqone,fmaxsqloc,fmaxsqall; int nlocal = atom->nlocal; -<<<<<<< HEAD - int *mask = atom->mask; - double **fm = atom->fm; - - // finding max fm on this proc. - -======= double **fm = atom->fm; // finding max fm on this proc. ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 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]; @@ -249,17 +211,10 @@ double MinSpin::evaluate_dt() } // finding max fm on this replica -<<<<<<< HEAD - - fmaxsqloc = fmaxsqone; - MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); - -======= fmaxsqloc = fmaxsqone; MPI_Allreduce(&fmaxsqone,&fmaxsqloc,1,MPI_DOUBLE,MPI_MAX,world); ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 // finding max fm over all replicas, if necessary // this communicator would be invalid for multiprocess replicas @@ -272,17 +227,10 @@ double MinSpin::evaluate_dt() if (fmaxsqall == 0.0) error->all(FLERR,"Incorrect fmaxsqall calculation"); -<<<<<<< HEAD - // define max timestep by dividing by the - // inverse of max frequency by discret_factor - - dtmax = MY_2PI/(discret_factor*sqrt(fmaxsqall)); -======= // define max timestep by dividing by the // inverse of max frequency by discrete_factor dtmax = MY_2PI/(discrete_factor*sqrt(fmaxsqall)); ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 return dtmax; } @@ -294,51 +242,17 @@ double MinSpin::evaluate_dt() void MinSpin::advance_spins(double dts) { int nlocal = atom->nlocal; -<<<<<<< HEAD - int *mask = atom->mask; -======= ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 double **sp = atom->sp; double **fm = atom->fm; double tdampx,tdampy,tdampz; double msq,scale,fm2,energy,dts2; double cp[3],g[3]; -<<<<<<< HEAD - dts2 = dts*dts; -======= dts2 = dts*dts; ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 // loop on all spins on proc. for (int i = 0; i < nlocal; i++) { -<<<<<<< HEAD - - // 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; - -======= // calc. damping torque @@ -363,34 +277,22 @@ void MinSpin::advance_spins(double dts) 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; ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 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]; -<<<<<<< HEAD - sp[i][2] = g[2]; - - // renormalization (check if necessary) - -======= sp[i][2] = g[2]; // renormalization (check if necessary) ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 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; -<<<<<<< HEAD - -======= ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 // no comm. to atoms with same tag // because no need for simplecticity } @@ -402,23 +304,13 @@ void MinSpin::advance_spins(double dts) double MinSpin::fmnorm_sqr() { -<<<<<<< HEAD - int i,n; - double *fmatom; - -======= ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 int nlocal = atom->nlocal; double tx,ty,tz; double **sp = atom->sp; double **fm = atom->fm; // calc. magnetic torques -<<<<<<< HEAD - -======= ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 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]); @@ -427,19 +319,11 @@ double MinSpin::fmnorm_sqr() local_norm2_sqr += tx*tx + ty*ty + tz*tz; } -<<<<<<< HEAD - - // no extra atom calc. for spins - - if (nextra_atom) - error->all(FLERR,"extra atom option not available yet"); -======= // no extra atom calc. for spins if (nextra_atom) error->all(FLERR,"extra atom option not available yet"); ->>>>>>> e2e4fe2cf7a95a04ae6a7de93d9b72ad56f0b620 double norm2_sqr = 0.0; MPI_Allreduce(&local_norm2_sqr,&norm2_sqr,1,MPI_DOUBLE,MPI_SUM,world); diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index ecbbffdcd8..53b9da9c42 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -901,7 +901,8 @@ void NEB_spin::print_status() gradvnorm0,gradvnorm1,gradvnormc); fprintf(ulogfile,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); for (int i = 0; i < nreplica; i++) - fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); + //fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); + fprintf(ulogfile,"%12.8g %12.8g %12.8g %12.8g ",rdist[i],all[i][0],all[i][2],all[i][5]); if (verbose) { fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", NAN,180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, From 07a6749ddce729103620fb6215afcad9ca9ecbdd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 26 Mar 2019 16:00:48 -0400 Subject: [PATCH 0346/1242] 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 0347/1242] 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 0348/1242] 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 0349/1242] 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 0350/1242] 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 0351/1242] 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 0352/1242] 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 0353/1242] 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 0354/1242] 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 0355/1242] 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 0356/1242] 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 0357/1242] 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 0358/1242] 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 44fe8330b923a2c6221f6678822f1ddd73558aab Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 27 Mar 2019 14:59:12 -0600 Subject: [PATCH 0359/1242] Commit JT 032719 - commit before wok output --- src/SPIN/fix_neb_spin.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/SPIN/fix_neb_spin.cpp b/src/SPIN/fix_neb_spin.cpp index 49736bce33..fce099e7c4 100644 --- a/src/SPIN/fix_neb_spin.cpp +++ b/src/SPIN/fix_neb_spin.cpp @@ -492,7 +492,7 @@ void FixNEB_spin::min_post_force(int /*vflag*/) // no Perpendicular nudging force option active yet if (kspringPerp != 0.0) - error->all(FLERR,"NEB_spin Perpendicular nudging force not yet active"); + error->all(FLERR,"NEB_spin Perpendicular spring force not yet active"); } } @@ -566,10 +566,6 @@ void FixNEB_spin::min_post_force(int /*vflag*/) if (NEBLongRange) error->all(FLERR,"NEB_spin long range option not yet active"); - // test output length - - //printf("testi irep / plen: %d %g \n",ireplica,nlen); - // exit calc. if first or last replica (no gneb force) if (ireplica == 0 || ireplica == nreplica-1) return ; From 6b09f6d49032364b5cc0f4607a7a6c97d5955e0a Mon Sep 17 00:00:00 2001 From: Steve Plimpton Date: Wed, 27 Mar 2019 15:51:10 -0600 Subject: [PATCH 0360/1242] 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 0361/1242] 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 0362/1242] 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 0363/1242] 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 0364/1242] 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 0365/1242] 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 0366/1242] 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 0367/1242] 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 0368/1242] 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 0369/1242] 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 0370/1242] 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 0371/1242] 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 0372/1242] 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 0373/1242] 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 0374/1242] 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 0375/1242] 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 0376/1242] 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 0377/1242] 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 0378/1242] 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 0379/1242] 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 0380/1242] 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 0381/1242] 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 0382/1242] 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 0383/1242] 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 0384/1242] 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 0385/1242] 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 0386/1242] 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 0387/1242] 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 0388/1242] 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 61d4b7a47f0e4995d1b368b3b82cdde7b9e2ee6d Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Mon, 1 Apr 2019 09:14:47 +0300 Subject: [PATCH 0389/1242] Add Kai as spelling false positive --- doc/utils/sphinx-config/false_positives.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 6d376d7b1f..65d0d16908 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1246,6 +1246,7 @@ Jy Jz jzimmer Kadiri +Kai Kalia Kamberaj Kapfer From 7688ead60fd8f56ddf96a846420303dfb0614733 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 04:42:56 -0400 Subject: [PATCH 0390/1242] 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 053bdea2347a640f7d82df92e25978a069238586 Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Mon, 1 Apr 2019 12:27:50 +0300 Subject: [PATCH 0391/1242] fix elstop: Use inline LaTeX for equation --- doc/src/Eqs/fix_elstop.jpg | Bin 2262 -> 0 bytes doc/src/Eqs/fix_elstop.tex | 13 ------------- doc/src/fix_elstop.txt | 4 +++- 3 files changed, 3 insertions(+), 14 deletions(-) delete mode 100644 doc/src/Eqs/fix_elstop.jpg delete mode 100644 doc/src/Eqs/fix_elstop.tex diff --git a/doc/src/Eqs/fix_elstop.jpg b/doc/src/Eqs/fix_elstop.jpg deleted file mode 100644 index e862c938f0ee1d8795bacd7c69cf029e48dc913f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2262 zcmb7E3p7;w8sD?`o?*;j&zNDz@t8bQneiB+GLBRx-SOx}WOR^lI3pJ!49cTH-gR7c zG>9IGL@7N8cd00Gyh0T2jE86_BHtSlA_!&o^P8JsLpjz}cP5eV`MWJF$pq(C4b$_Pn` zLZwoPiYhc^3XM#mQlyt)Ak+rN;;~pfMV=r}`M*ih2#{m}F3=8PNB~H}KqQRhF`y1$ z01%S8yGk$)gs?IgS@e|huli+xq#qzcs0{)k0DxI?SvC8&7kOXCT}`%Bd0AEYOw8t2 zPiJ^U&QV|e#C*RnRIj*h3*31uRc7;z!jztL(YMm=vyz2f^6_v!(TA`;aNz)K zO;7eO-+E1S@Lo5PT}|$3Y!{{+OnSUayZ#5yeP7OsHGXH+X|_7h9!7Rvzfz>S1T4lL zlvaSW8pBE`@qc)ZmdpkN#(f0=t|BbabU)~D~dF@x>9Hf{*; ze-Itw`w(ZIslI=M!wJG2gXBX`)$lJrg==09K3_st#^%|Z2Bks;j;^(o(Tc0DrhoS7 zT{HQnq=VOzyf9odaI7X*e5QxQcdq!zoIC~oB915Oy^gVpj_`9*kEG9Xe$om1N8;$o zO}S;>0o#mjKbqB;{NAdW&)ylFrJJ2&2#!Ww&CJI#&IB24w$kv7``~Dib8oijjnU5% z;C+(U+{v4jejh^G&6_>l^T{Qwi>aHt)rii`?iY?;<~`@iH|UI8SKZUC@zhgCj+C_H zrph{_#&rHhY&C4N>QA)sus6D9@?q?F_0Y7OrU$X1;%0#%f%NTzq-mS<^zi(SZ_JCm z7OGlru|gv`v&CN8Prq2i;-)9L)(hu?YA?`5vrT=?)rDWC9>&rp-*hPMt8<_0xO#ZZ zly<1Bn}*f54`hy{MFk{1i**e+AwSK@`||GfkA<=GCG=m%^|oH>xM53Hv^&-7dhRmU z{IN&Wg>yYO9&tkU_jQSF!dZbMe$}~_rPiTg^f!V-GIpa0HEXiNPdLDFT)cP=^3VGF zPy=jPo=w@-YCNo}z$!_9l%z_!P7x|sa9;ECO?o*g>ZcN-hXRvyN?Z4_qTlCzut_>iu?U55%XJW4EBrkdPI5d3+{(v=W}yd zU$*JqW;xCr`i26OhaVrNI?P}Djnu(9^&2ZF)ZB^k(*8H@0P_)~vZvBb} zi7m`#6BpKcf2AjGUicuF(4MV@gL54-Ph3CWZ8);=cfBR!GI4H9R)g_gKYNk={;J{- z-?+OGA>|t{B}6^*Ycj^4r+bI@xGtS8$R%^4dxt*_biN#?4Xyni-WzGkVMUHCf;N`B z!|FxXGVn7$JuZl-+wG8-$-@hFe$?$hCaeUCF2&e&3l81atTZp{JKA#Rb3;>*|4Aha z=gh6IqTjnD7@Sx!uCclki5k&NjOEv26mwBrq zG-#u@uUE4Da`q-vI#pIjJKltOsc9qu&|ePA3l8{(`4b42ql$&d*NtGlsWcq*R=(RvW*irSR5CJt`Gs zIw#CG_`I)8T9>~8U^*f?&ohCl_2s3{x9pfy)}U-|v1u`p05t;9mf^!))O3#wA0047 z1S7Wkmkqk-mbz%W8WJiuSvU?m*m~mfH5vtbpn!KW5yl1PRh&_nR~yO;%u*{viZ!AL<@Bk7H3`%-p4oT1y^re0W4AuXc#t2a|5mDEpE(|dFa#uxZIc9kLiJ!I z9O)#Ow0P0(PN)e9@(%lWI>kcH$LekP(ws$VT19Tmk&$~EslMgOAE!9JZ}0 wQG=JxCk(4U>C?HF=639WS2~otK{Z~8*Zt(N&FCP~m8OC;0-27BUXs3l0^?FYX#fBK diff --git a/doc/src/Eqs/fix_elstop.tex b/doc/src/Eqs/fix_elstop.tex deleted file mode 100644 index 760ded00f1..0000000000 --- a/doc/src/Eqs/fix_elstop.tex +++ /dev/null @@ -1,13 +0,0 @@ -\documentclass[12pt]{article} - -\begin{document} - -$$ - {\vec F}_i = {\vec F}^{0}_i - \frac{{\vec v}_i}{\|\vec{v}_i\|}\cdot S_e -$$ - -\end{document} - - - - diff --git a/doc/src/fix_elstop.txt b/doc/src/fix_elstop.txt index 75bb2ef101..53779e0953 100644 --- a/doc/src/fix_elstop.txt +++ b/doc/src/fix_elstop.txt @@ -44,7 +44,9 @@ considered, the simulated range of the ions can be severely overestimated The electronic stopping is implemented by applying a friction force to each atom as: -:c,image(Eqs/fix_elstop.jpg) +\begin\{equation\} +\vec\{F\}_i = \vec\{F\}^0_i - \frac\{\vec\{v\}_i\}\{\|\vec\{v\}_i\|\} \cdot S_e +\end\{equation\} where \(\vec\{F\}_i\) is the resulting total force on the atom. \(\vec\{F\}^0_i\) is the original force applied to the atom, \(\vec\{v\}_i\) is its velocity and From a8e5af3cb4b93e241785537327f2b626e5d60067 Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Mon, 1 Apr 2019 12:59:25 +0300 Subject: [PATCH 0392/1242] fix elstop: Inline kinetic energy computation --- src/USER-MISC/fix_elstop.cpp | 33 +++++---------------------------- src/USER-MISC/fix_elstop.h | 6 ------ 2 files changed, 5 insertions(+), 34 deletions(-) diff --git a/src/USER-MISC/fix_elstop.cpp b/src/USER-MISC/fix_elstop.cpp index def576cfca..842c2f4e1a 100644 --- a/src/USER-MISC/fix_elstop.cpp +++ b/src/USER-MISC/fix_elstop.cpp @@ -54,20 +54,6 @@ FixElstop::FixElstop(LAMMPS *lmp, int narg, char **arg) : nevery = 1; // Run fix every step - // Make sure the id for the kinetic energy compute is unique - // by prepending the ID of this fix. - int n = strlen(id) + strlen("_ke_atom") + 1; - id_ke_atom = new char[n]; - strcpy(id_ke_atom, id); - strcat(id_ke_atom, "_ke_atom"); - - char *newarg[3]; - newarg[0] = id_ke_atom; - newarg[1] = group->names[igroup]; - newarg[2] = (char *) "ke/atom"; - modify->add_compute(3, newarg); - - // args: 0 = fix ID, 1 = group ID, 2 = "elstop" // 3 = Ecut, 4 = file path // optional rest: "region" @@ -133,8 +119,6 @@ FixElstop::FixElstop(LAMMPS *lmp, int narg, char **arg) : FixElstop::~FixElstop() { memory->destroy(elstop_ranges); - modify->delete_compute(id_ke_atom); - delete id_ke_atom; } /* ---------------------------------------------------------------------- */ @@ -153,12 +137,6 @@ void FixElstop::init() SeLoss_sync_flag = 0; SeLoss = 0.0; - int ikeatom = modify->find_compute(id_ke_atom); - if (ikeatom < 0) - error->all(FLERR, "KE compute ID for fix elstop does not exist"); - c_ke = modify->compute[ikeatom]; - - // need an occasional full neighbor list int irequest = neighbor->request(this, instance_me); neighbor->requests[irequest]->pair = 0; @@ -193,9 +171,6 @@ void FixElstop::post_force(int /*vflag*/) neighbor->build_one(list); int *numneigh = list->numneigh; - c_ke->compute_peratom(); - double *ke = c_ke->vector_atom; - for (int i = 0; i < nlocal; ++i) { // Do fast checks first, only then the region check @@ -204,7 +179,11 @@ void FixElstop::post_force(int /*vflag*/) // Avoid atoms outside bulk material if (numneigh[i] < minneigh) continue; - double energy = ke[i]; + int itype = type[i]; + double massone = (atom->rmass) ? atom->rmass[i] : atom->mass[itype]; + double v2 = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; + double energy = 0.5 * force->mvv2e * massone * v2; + if (energy < Ecut) continue; if (energy < elstop_ranges[0][0]) continue; if (energy > elstop_ranges[0][table_entries - 1]) @@ -226,7 +205,6 @@ void FixElstop::post_force(int /*vflag*/) else iup = ihalf; } - int itype = type[i]; double Se_lo = elstop_ranges[itype][idown]; double Se_hi = elstop_ranges[itype][iup]; double E_lo = elstop_ranges[0][idown]; @@ -235,7 +213,6 @@ void FixElstop::post_force(int /*vflag*/) // Get elstop with a simple linear interpolation double Se = (Se_hi - Se_lo) / (E_hi - E_lo) * (energy - E_lo) + Se_lo; - double v2 = v[i][0]*v[i][0] + v[i][1]*v[i][1] + v[i][2]*v[i][2]; double vabs = sqrt(v2); double factor = -Se / vabs; diff --git a/src/USER-MISC/fix_elstop.h b/src/USER-MISC/fix_elstop.h index dc49825290..afb9fd813a 100644 --- a/src/USER-MISC/fix_elstop.h +++ b/src/USER-MISC/fix_elstop.h @@ -53,12 +53,10 @@ class FixElstop : public Fix { double **elstop_ranges; // [ 0][i]: energies // [>0][i]: stopping powers per type - char *id_ke_atom; // name of kinetic energy compute int iregion; // region index if used, else -1 int minneigh; // minimum number of neighbors class NeighList *list; - class Compute *c_ke; }; } @@ -78,10 +76,6 @@ E: Region ID for fix elstop does not exist Self-explanatory. -E: KE compute ID for fix elstop does not exist - -Internal error. Should not happen. - E: Atom kinetic energy too high for fix elstop The group given in the fix elstop command includes an atom that has From 2e7316a9e34f1b888a58ab05b58d0946a6fcc637 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 08:11:22 -0400 Subject: [PATCH 0393/1242] 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 adbc64b45e30b5199a97027a12de90fed29366b8 Mon Sep 17 00:00:00 2001 From: mkanski Date: Mon, 1 Apr 2019 16:34:34 +0200 Subject: [PATCH 0394/1242] Cleaning includes + changing error->all to error->one --- src/USER-OMP/reaxc_forces_omp.cpp | 4 ++-- src/USER-REAXC/reaxc_allocate.cpp | 2 -- src/USER-REAXC/reaxc_control.cpp | 2 ++ src/USER-REAXC/reaxc_ffield.cpp | 2 -- src/USER-REAXC/reaxc_forces.cpp | 4 +++- src/USER-REAXC/reaxc_init_md.cpp | 1 + src/USER-REAXC/reaxc_list.cpp | 2 ++ src/USER-REAXC/reaxc_reset_tools.cpp | 2 ++ src/USER-REAXC/reaxc_tool_box.cpp | 2 ++ src/USER-REAXC/reaxc_traj.cpp | 2 ++ src/USER-REAXC/reaxc_types.h | 12 ++++++------ src/USER-REAXC/reaxc_valence_angles.cpp | 2 ++ 12 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 96b27c4c26..1e1cf44f50 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -292,7 +292,7 @@ void Validate_ListsOMP( reax_system *system, storage * /*workspace */, reax_list char errmsg[256]; snprintf(errmsg, 256, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", step, i, End_Index(i,bonds), comp ); - system->error_ptr->all(FLERR,errmsg); + system->error_ptr->one(FLERR,errmsg); } } } @@ -319,7 +319,7 @@ void Validate_ListsOMP( reax_system *system, storage * /*workspace */, reax_list char errmsg[256]; snprintf(errmsg, 256, "step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", step, Hindex, End_Index(Hindex,hbonds), comp ); - system->error_ptr->all(FLERR, errmsg); + system->error_ptr->one(FLERR, errmsg); } } } diff --git a/src/USER-REAXC/reaxc_allocate.cpp b/src/USER-REAXC/reaxc_allocate.cpp index ff829db3dc..460f8aeb6a 100644 --- a/src/USER-REAXC/reaxc_allocate.cpp +++ b/src/USER-REAXC/reaxc_allocate.cpp @@ -35,9 +35,7 @@ #include #endif -#include "lammps.h" #include "error.h" -using namespace LAMMPS_NS; /* allocate space for my_atoms important: we cannot know the exact number of atoms that will fall into a diff --git a/src/USER-REAXC/reaxc_control.cpp b/src/USER-REAXC/reaxc_control.cpp index 0caae40156..535226fff8 100644 --- a/src/USER-REAXC/reaxc_control.cpp +++ b/src/USER-REAXC/reaxc_control.cpp @@ -28,6 +28,8 @@ #include "reaxc_control.h" #include "reaxc_tool_box.h" +#include "error.h" + char Read_Control_File( char *control_file, control_params* control, output_controls *out_control ) { diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 28bc0429cc..eea1696cd6 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -29,8 +29,6 @@ #include "reaxc_ffield.h" #include "reaxc_tool_box.h" -#include "lammps.h" -#include "error.h" char Read_Force_Field( FILE *fp, reax_interaction *reax, control_params *control ) diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index afe9a059ed..8c602e9156 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -39,6 +39,8 @@ #include "reaxc_valence_angles.h" #include "reaxc_vector.h" +#include "error.h" + interaction_function Interaction_Functions[NUM_INTRS]; @@ -138,7 +140,7 @@ void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **l char errmsg[256]; snprintf(errmsg, 256, "step%d-bondchk failed: i=%d end(i)=%d str(i+1)=%d\n", step, i, End_Index(i,bonds), comp ); - system->error_ptr->all(FLERR,errmsg); + system->error_ptr->one(FLERR,errmsg); } } } diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 913bc241de..fbef5e42d1 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -36,6 +36,7 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" +#include "error.h" int Init_System( reax_system *system, control_params *control, char * /*msg*/ ) { diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index d0143ec9ae..2e86c3c06b 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -28,6 +28,8 @@ #include "reaxc_list.h" #include "reaxc_tool_box.h" +#include "error.h" + /************* allocate list space ******************/ int Make_List(int n, int num_intrs, int type, reax_list *l ) { diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index 8954e344df..5439ee33a4 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -30,6 +30,8 @@ #include "reaxc_tool_box.h" #include "reaxc_vector.h" +#include "error.h" + void Reset_Atoms( reax_system* system, control_params *control ) { diff --git a/src/USER-REAXC/reaxc_tool_box.cpp b/src/USER-REAXC/reaxc_tool_box.cpp index 05ebc34c1b..df8d7c85bf 100644 --- a/src/USER-REAXC/reaxc_tool_box.cpp +++ b/src/USER-REAXC/reaxc_tool_box.cpp @@ -27,6 +27,8 @@ #include "pair_reaxc.h" #include "reaxc_tool_box.h" +#include "error.h" + struct timeval tim; double t_end; diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 27bebb6327..d25221512e 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -29,6 +29,8 @@ #include "reaxc_list.h" #include "reaxc_tool_box.h" +#include "error.h" + int Reallocate_Output_Buffer( LAMMPS_NS::Error *error_ptr, output_controls *out_control, int req_space ) { if (out_control->buffer_len > 0) diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index 310ef42bdf..d390768ac6 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -39,9 +39,8 @@ #include #include "accelerator_kokkos.h" -#include "lammps.h" -#include "error.h" -using LAMMPS_NS::Error; + +namespace LAMMPS_NS { class Error;} #if defined LMP_USER_OMP #define OMP_TIMING 0 @@ -415,7 +414,7 @@ struct _reax_system boundary_cutoff bndry_cuts; reax_atom *my_atoms; - class Error *error_ptr; + class LAMMPS_NS::Error *error_ptr; class Pair *pair_ptr; int my_bonds; int mincap; @@ -493,7 +492,8 @@ typedef struct int lgflag; int enobondsflag; - class Error *error_ptr; + class LAMMPS_NS::Error *error_ptr; + int me; } control_params; @@ -780,7 +780,7 @@ struct _reax_list int type; list_type select; - class Error *error_ptr; + class LAMMPS_NS::Error *error_ptr; }; typedef _reax_list reax_list; diff --git a/src/USER-REAXC/reaxc_valence_angles.cpp b/src/USER-REAXC/reaxc_valence_angles.cpp index e0e94d18f8..4ba870b6d9 100644 --- a/src/USER-REAXC/reaxc_valence_angles.cpp +++ b/src/USER-REAXC/reaxc_valence_angles.cpp @@ -30,6 +30,8 @@ #include "reaxc_list.h" #include "reaxc_vector.h" +#include "error.h" + static double Dot( double* v1, double* v2, int k ) { double ret = 0.0; From 799c16a8b29922838994d6381662ad77692d4a92 Mon Sep 17 00:00:00 2001 From: mkanski Date: Mon, 1 Apr 2019 17:04:09 +0200 Subject: [PATCH 0395/1242] restore a removed check + print some warnings only once --- src/USER-REAXC/reaxc_ffield.cpp | 2 ++ src/USER-REAXC/reaxc_init_md.cpp | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index eea1696cd6..36b7105ce8 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -148,6 +148,8 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, c = Tokenize( s, &tmp ); /* Sanity checks */ + if (c == 2 && !lgflag) + control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); if (c < 9) { control->error_ptr->all(FLERR,"Inconsistent ffield file"); diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index fbef5e42d1..8ac9f0e53c 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -91,13 +91,13 @@ void Init_Taper( control_params *control, storage *workspace ) swa = control->nonb_low; swb = control->nonb_cut; - if (fabs( swa ) > 0.01) + if (fabs( swa ) > 0.01 && control->me == 0) control->error_ptr->warning( FLERR, "Non-zero lower Taper-radius cutoff" ); if (swb < 0) { control->error_ptr->all(FLERR,"Negative upper Taper-radius cutoff"); } - else if( swb < 5 ) { + else if( swb < 5 && control->me == 0) { char errmsg[256]; snprintf(errmsg, 256, "Very low Taper-radius cutoff: %f", swb ); control->error_ptr->warning( FLERR, errmsg ); From b7aecc0d5928244de708f4127d0d87584f49c0cd Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 17:22:53 -0400 Subject: [PATCH 0396/1242] 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 0397/1242] 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 0398/1242] 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 0399/1242] 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 0400/1242] 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 a0e5d14990af4cd281e5db5c97c8a281838fb072 Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 1 Apr 2019 15:53:36 -0600 Subject: [PATCH 0401/1242] Commit JT 040119 - corrected tangent vector projection - output verbose (Gradidottan) --- src/SPIN/fix_neb_spin.cpp | 18 ++++++++++-- src/SPIN/neb_spin.cpp | 59 +++++++++++---------------------------- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/src/SPIN/fix_neb_spin.cpp b/src/SPIN/fix_neb_spin.cpp index fce099e7c4..017085a9a8 100644 --- a/src/SPIN/fix_neb_spin.cpp +++ b/src/SPIN/fix_neb_spin.cpp @@ -15,6 +15,10 @@ Contributing authors: Julien Tranchida (SNL) Please cite the related publication: + Bessarab, P. F., Uzdin, V. M., & Jónsson, H. (2015). + Method for finding mechanism and activation energy of magnetic transitions, + applied to skyrmion and antivortex annihilation. + Computer Physics Communications, 196, 335-347. ------------------------------------------------------------------------- */ #include @@ -467,6 +471,15 @@ void FixNEB_spin::min_post_force(int /*vflag*/) } } + // project tangent vector on tangent space + + double sdottan; + sdottan = sp[i][0]*tangent[i][0] + sp[i][1]*tangent[i][1] + + sp[i][2]*tangent[i][2]; + tangent[i][0] -= sdottan*sp[i][0]; + tangent[i][1] -= sdottan*sp[i][1]; + tangent[i][2] -= sdottan*sp[i][2]; + // calc. next geodesic length spi[0]=sp[i][0]; @@ -518,7 +531,8 @@ void FixNEB_spin::min_post_force(int /*vflag*/) dottangrad = bufout[6]; dotgrad = bufout[7]; - // project tangent vector on tangent space and normalize it + // check projection of tangent vector on tangent space + // and normalize it double buftan[3]; double tandots; @@ -655,7 +669,7 @@ double FixNEB_spin::geodesic_distance(double spi[3], double spj[3]) if (normcross == 0.0 && dots == 0.0) error->all(FLERR,"Incorrect calc. of geodesic_distance in Fix NEB/spin"); - dist = atan2(normcross,dots); + dist = atan2(normcross,dots); return dist; } diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 53b9da9c42..5dcd27ef2b 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -281,10 +281,9 @@ void NEB_spin::run() if (uscreen) { if (verbose) { fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " - "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " - "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " - "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " - "... ReplicaTorqueN MaxAtomTorqueN\n"); + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "GradV0dottan ... GradVNdottan\n"); } else { fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " @@ -294,11 +293,10 @@ void NEB_spin::run() if (ulogfile) { if (verbose) { - fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " - "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " - "RDN PEN pathangle1 angletangrad1 anglegrad1 gradV1 " - "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " - "... ReplicaTorqueN MaxAtomTorqueN\n"); + fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "GradV0dottan ... GradVNdottan\n"); } else { fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " @@ -370,9 +368,7 @@ void NEB_spin::run() fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " - "pathangle1 angletangrad1 anglegrad1 gradV1 " - "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " - "... ReplicaForceN MaxAtomForceN\n"); + "GradV0dottan ... GradVNdottan\n"); } else { fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc " @@ -382,12 +378,10 @@ void NEB_spin::run() } if (ulogfile) { if (verbose) { - fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " - "GradV0 GradV1 GradVc EBF EBR RDT " - "RD1 PE1 RD2 PE2 ... RDN PEN " - "pathangle1 angletangrad1 anglegrad1 gradV1 " - "ReplicaForce1 MaxAtomForce1 pathangle2 angletangrad2 " - "... ReplicaForceN MaxAtomForceN\n"); + fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " + "GradV0 GradV1 GradVc EBF EBR RDT " + "RD1 PE1 RD2 PE2 ... RDN PEN " + "GradV0dottan ... GradVNdottan\n"); } else { fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc " @@ -879,17 +873,8 @@ void NEB_spin::print_status() for (int i = 0; i < nreplica; i++) fprintf(uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); if (verbose) { - fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", - NAN,180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, - all[0][3],freplica[0],fmaxatomInRepl[0]); - for (int i = 1; i < nreplica-1; i++) - fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", - 180-acos(all[i][4])*todeg,180-acos(all[i][5])*todeg, - 180-acos(all[i][6])*todeg,all[i][3],freplica[i], - fmaxatomInRepl[i]); - fprintf(uscreen,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", - NAN,180-acos(all[nreplica-1][5])*todeg,NAN,all[nreplica-1][3], - freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + for (int i = 0; i < nreplica; i++) + fprintf(uscreen,"%12.8g ",all[i][5]); } fprintf(uscreen,"\n"); } @@ -901,20 +886,10 @@ void NEB_spin::print_status() gradvnorm0,gradvnorm1,gradvnormc); fprintf(ulogfile,"%12.8g %12.8g %12.8g ",ebf,ebr,endpt); for (int i = 0; i < nreplica; i++) - //fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); - fprintf(ulogfile,"%12.8g %12.8g %12.8g %12.8g ",rdist[i],all[i][0],all[i][2],all[i][5]); + fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); if (verbose) { - fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", - NAN,180-acos(all[0][5])*todeg,180-acos(all[0][6])*todeg, - all[0][3],freplica[0],fmaxatomInRepl[0]); - for (int i = 1; i < nreplica-1; i++) - fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", - 180-acos(all[i][4])*todeg,180-acos(all[i][5])*todeg, - 180-acos(all[i][6])*todeg,all[i][3],freplica[i], - fmaxatomInRepl[i]); - fprintf(ulogfile,"%12.5g %12.5g %12.5g %12.5g %12.5g %12.5g", - NAN,180-acos(all[nreplica-1][5])*todeg,NAN,all[nreplica-1][3], - freplica[nreplica-1],fmaxatomInRepl[nreplica-1]); + for (int i = 0; i < nreplica; i++) + fprintf(ulogfile,"%12.8g ",all[i][5]); } fprintf(ulogfile,"\n"); fflush(ulogfile); From 76b848bb0ad2028deff14c37584f22922c9387ca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 17:58:19 -0400 Subject: [PATCH 0402/1242] 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 0403/1242] 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 0404/1242] 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 0b8332cedfa5f7df3979efd8525edcf45d7a5d2a Mon Sep 17 00:00:00 2001 From: julient31 Date: Mon, 1 Apr 2019 17:52:59 -0600 Subject: [PATCH 0405/1242] Commit2 JT 040119 - improved verbose output - work on examples --- examples/SPIN/gneb/README | 4 +- examples/SPIN/gneb/interpolate/README | 7 + examples/SPIN/gneb/interpolate/interpolate.c | 109 +++ .../interpolate/reac_coords_iron_verbose.dat | 8 + examples/SPIN/gneb/{ => iron}/final.iron_spin | 0 examples/SPIN/gneb/{ => iron}/in.gneb.iron | 14 +- .../SPIN/gneb/{ => iron}/initial.iron_spin | 0 examples/SPIN/gneb/skyrmion/final.skyrmion | 401 +++++++++ examples/SPIN/gneb/skyrmion/in.gneb.skyrmion | 58 ++ examples/SPIN/gneb/skyrmion/initial.skyrmion | 818 ++++++++++++++++++ src/SPIN/neb_spin.cpp | 18 +- 11 files changed, 1415 insertions(+), 22 deletions(-) create mode 100644 examples/SPIN/gneb/interpolate/README create mode 100644 examples/SPIN/gneb/interpolate/interpolate.c create mode 100644 examples/SPIN/gneb/interpolate/reac_coords_iron_verbose.dat rename examples/SPIN/gneb/{ => iron}/final.iron_spin (100%) rename examples/SPIN/gneb/{ => iron}/in.gneb.iron (70%) rename examples/SPIN/gneb/{ => iron}/initial.iron_spin (100%) create mode 100644 examples/SPIN/gneb/skyrmion/final.skyrmion create mode 100644 examples/SPIN/gneb/skyrmion/in.gneb.skyrmion create mode 100644 examples/SPIN/gneb/skyrmion/initial.skyrmion diff --git a/examples/SPIN/gneb/README b/examples/SPIN/gneb/README index eeb4aa4692..7d388d898e 100644 --- a/examples/SPIN/gneb/README +++ b/examples/SPIN/gneb/README @@ -1,5 +1,5 @@ -Run this example as: +Run those examples as: -mpirun -np 3 lmp_g++ -partition 3x1 -in in.tad +mpirun -np 4 lmp_mpi -in in.gneb.iron -partition 4x1 You should be able to use any number of replicas >= 3. diff --git a/examples/SPIN/gneb/interpolate/README b/examples/SPIN/gneb/interpolate/README new file mode 100644 index 0000000000..d0f75226c5 --- /dev/null +++ b/examples/SPIN/gneb/interpolate/README @@ -0,0 +1,7 @@ +Interpolate.x tries to perform a cubic polynomial interpolation +of the MEP found + +Compile the program with: +gcc interpolate.c -o interpolate.x -lm -lgsl + + diff --git a/examples/SPIN/gneb/interpolate/interpolate.c b/examples/SPIN/gneb/interpolate/interpolate.c new file mode 100644 index 0000000000..48804d53a2 --- /dev/null +++ b/examples/SPIN/gneb/interpolate/interpolate.c @@ -0,0 +1,109 @@ +/* ------------------------------------------------------------------------ + Provide some explanation here +------------------------------------------------------------------------- */ + +/* ------------------------------------------------------------------------ + This program is a courtesy of Aleksei Ivanov (Univ. of Iceland) + Contributing authors: Aleksei Ivanov (Univ. of Iceland), + Julien Tranchida (SNL) +------------------------------------------------------------------------- */ + +#include +#include +#include +#include +#include + +// calculate cubic coefficients + +void count_coefficient(double *V, double *F, double *R, double *a, double *b, + double *c,double *d,int M){ + /* R = square of distance between images*/ + /* V = energy of images */ + /* F = projection of real real forces along the path? */ + int i; + for(i = 0; i < M ; i++) { + a[i] = ( -2.0*(V[i+1]-V[i])/R[i] - F[i] - F[i+1] ) / (R[i]*R[i]); + //a[i] = ( -2.0*(V[i+1]-V[i])/sqrt(R[i]) - F[i] - F[i+1] ) / R[i]; + b[i] = ( 3.0*(V[i+1]-V[i]) + (2.0*F[i]+F[i+1])*R[i] ) / (R[i]*R[i]); + //b[i] = ( 3.0*(V[i+1]-V[i]) + (2.0*F[i]+F[i+1])*sqrt(R[i]) ) / R[i]; + c[i] = -F[i]; + d[i] = V[i]; + } +} + +// cubic spline + +double spline(double a,double b,double c,double d,double x) { + return (a*x*x*x + b*x*x + c*x + d); +} + +int main() { + int M=0; // M+1 = number of images + double *fmdottan; // projection of real forces on tangent path + double *coords; // initial value of reaction coords + double *V; // energy of images + double *dist; // square of the distance between images + double *a, *b, *c, *d ; // coefficients of cubic functions + double x; // reaction coordinate + double A,B; // additional variables for rnd + double length = 0.0; + int i,j; + FILE *data; + + printf("Enter M = number of images - 1 \n"); + scanf("%d",&M); + + // allocating and initializing tables + + a = calloc(M,sizeof(double)); // cubic coefficients + b = calloc(M,sizeof(double)); + c = calloc(M,sizeof(double)); + d = calloc(M,sizeof(double)); + V = calloc((M+1),sizeof(double)); // energies + coords = calloc((M+1),sizeof(double)); // reaction coordinates + fmdottan = calloc((M+1),sizeof(double)); // fm dot tangent + dist = calloc(M+1,sizeof(double)); // distance between images + + // reading input file + + if((data=fopen("reac_coords_iron_verbose.dat","r")) == NULL) { + //if((data=fopen("neb_init.dat","r")) == NULL) { + printf("Incorrect input file name."); + return 0; + } + + for(j=0; j < M+1; j++) { + fscanf(data,"%lf\t%lf\t%lf\t%lf\n",&coords[j],&V[j],&fmdottan[j],&dist[j]); + length += dist[j]; + printf("%lf %lf %lf %lf\n",coords[j],V[j],fmdottan[j],dist[j]); + } + + if( (fclose(data)) == 0) { + printf("Data stored, input file closed.\n "); + } + + // calculate value of coefficients + + count_coefficient(V,fmdottan,dist,a,b,c,d,M); + + // plot result of the interpolation + + if( ( data=fopen("interpolation_result.dat","w") )== NULL) { + printf("Interpolation file could not be open."); + return 0; + } + + A = B = 0.0; + for(i = 0; i < M ; i++) { + B += dist[i]; + printf("%13le\n",B); + for(j = 0; j <= 1000; j++) { + x = dist[i]*1.0e-3*j; + fprintf(data,"%13lf\t%13le\n",(x+A)/length,spline(a[i],b[i],c[i],d[i],x)); + } + A += dist[i]; + } + + return 0; +} diff --git a/examples/SPIN/gneb/interpolate/reac_coords_iron_verbose.dat b/examples/SPIN/gneb/interpolate/reac_coords_iron_verbose.dat new file mode 100644 index 0000000000..7a56274a31 --- /dev/null +++ b/examples/SPIN/gneb/interpolate/reac_coords_iron_verbose.dat @@ -0,0 +1,8 @@ +0.0000000 -3.915271 3.4995081e-17 2.4573077 +0.14285714 -3.9148148 -0.00059075739 2.4573077 +0.28571429 -3.9136926 -0.00072315767 2.4573077 +0.42857143 -3.9127883 -0.0003191228 2.4573265 +0.57142857 -3.9127883 0.0003191228 2.4403341 +0.71428571 -3.9136926 0.00072315767 2.4044093 +0.85714286 -3.9148148 0.00059075739 2.3766041 +1.0000000 -3.915271 -4.1231828e-17 0.0000000 diff --git a/examples/SPIN/gneb/final.iron_spin b/examples/SPIN/gneb/iron/final.iron_spin similarity index 100% rename from examples/SPIN/gneb/final.iron_spin rename to examples/SPIN/gneb/iron/final.iron_spin diff --git a/examples/SPIN/gneb/in.gneb.iron b/examples/SPIN/gneb/iron/in.gneb.iron similarity index 70% rename from examples/SPIN/gneb/in.gneb.iron rename to examples/SPIN/gneb/iron/in.gneb.iron index a8028392a1..4cfbd723b7 100644 --- a/examples/SPIN/gneb/in.gneb.iron +++ b/examples/SPIN/gneb/iron/in.gneb.iron @@ -8,17 +8,11 @@ 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 1.0 -#create_box 1 box -#create_atoms 1 box - read_data initial.iron_spin # setting mass, mag. moments, and interactions for bcc iron mass 1 55.845 -#set group all spin 2.2 -1.0 0.0 0.0 pair_style spin/exchange 3.5 pair_coeff * * exchange 3.4 0.02726 0.2171 1.841 @@ -28,9 +22,7 @@ neigh_modify every 10 check yes delay 20 fix 1 all precession/spin zeeman 0.1 0.0 0.0 1.0 anisotropy 0.0001 1.0 0.0 0.0 fix_modify 1 energy yes -fix 2 all langevin/spin 0.0 0.0 21 fix 3 all neb/spin 1.0 -#fix 4 all nve/spin lattice no timestep 0.0001 thermo 100 @@ -52,10 +44,8 @@ thermo_modify format float %20.15g compute outsp all property/atom spx spy spz sp fmx fmy fmz variable u universe 1 2 3 4 -#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] dump 1 all custom 200 dump.$u 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 -neb/spin 1.0e-12 1.0e-12 50000 50000 10 final final.iron_spin -#neb/spin 1.0e-6 1.0e-6 1000 10 10 final final.iron_spin +min_modify alpha_damp 1.0 discrete_factor 10.0 +neb/spin 1.0e-12 1.0e-12 200000 100000 1000 final final.iron_spin verbose diff --git a/examples/SPIN/gneb/initial.iron_spin b/examples/SPIN/gneb/iron/initial.iron_spin similarity index 100% rename from examples/SPIN/gneb/initial.iron_spin rename to examples/SPIN/gneb/iron/initial.iron_spin diff --git a/examples/SPIN/gneb/skyrmion/final.skyrmion b/examples/SPIN/gneb/skyrmion/final.skyrmion new file mode 100644 index 0000000000..4ff51f6376 --- /dev/null +++ b/examples/SPIN/gneb/skyrmion/final.skyrmion @@ -0,0 +1,401 @@ +400 +1 2.5 0.0 0.0 0.0 0.0 0.0 1.0 +2 2.5 0.0 3.0 0.0 0.0 0.0 1.0 +3 2.5 0.0 6.0 0.0 0.0 0.0 1.0 +4 2.5 0.0 9.0 0.0 0.0 0.0 1.0 +5 2.5 0.0 12.0 0.0 0.0 0.0 1.0 +6 2.5 0.0 15.0 0.0 0.0 0.0 1.0 +7 2.5 0.0 18.0 0.0 0.0 0.0 1.0 +8 2.5 0.0 21.0 0.0 0.0 0.0 1.0 +9 2.5 0.0 24.0 0.0 0.0 0.0 1.0 +10 2.5 0.0 27.0 0.0 0.0 0.0 1.0 +11 2.5 0.0 30.0 0.0 0.0 0.0 1.0 +12 2.5 0.0 33.0 0.0 0.0 0.0 1.0 +13 2.5 0.0 36.0 0.0 0.0 0.0 1.0 +14 2.5 0.0 39.0 0.0 0.0 0.0 1.0 +15 2.5 0.0 42.0 0.0 0.0 0.0 1.0 +16 2.5 0.0 45.0 0.0 0.0 0.0 1.0 +17 2.5 0.0 48.0 0.0 0.0 0.0 1.0 +18 2.5 0.0 51.0 0.0 0.0 0.0 1.0 +19 2.5 0.0 54.0 0.0 0.0 0.0 1.0 +20 2.5 0.0 57.0 0.0 0.0 0.0 1.0 +21 2.5 3.0 0.0 0.0 0.0 0.0 1.0 +22 2.5 3.0 3.0 0.0 0.0 0.0 1.0 +23 2.5 3.0 6.0 0.0 0.0 0.0 1.0 +24 2.5 3.0 9.0 0.0 0.0 0.0 1.0 +25 2.5 3.0 12.0 0.0 0.0 0.0 1.0 +26 2.5 3.0 15.0 0.0 0.0 0.0 1.0 +27 2.5 3.0 18.0 0.0 0.0 0.0 1.0 +28 2.5 3.0 21.0 0.0 0.0 0.0 1.0 +29 2.5 3.0 24.0 0.0 0.0 0.0 1.0 +30 2.5 3.0 27.0 0.0 0.0 0.0 1.0 +31 2.5 3.0 30.0 0.0 0.0 0.0 1.0 +32 2.5 3.0 33.0 0.0 0.0 0.0 1.0 +33 2.5 3.0 36.0 0.0 0.0 0.0 1.0 +34 2.5 3.0 39.0 0.0 0.0 0.0 1.0 +35 2.5 3.0 42.0 0.0 0.0 0.0 1.0 +36 2.5 3.0 45.0 0.0 0.0 0.0 1.0 +37 2.5 3.0 48.0 0.0 0.0 0.0 1.0 +38 2.5 3.0 51.0 0.0 0.0 0.0 1.0 +39 2.5 3.0 54.0 0.0 0.0 0.0 1.0 +40 2.5 3.0 57.0 0.0 0.0 0.0 1.0 +41 2.5 6.0 0.0 0.0 0.0 0.0 1.0 +42 2.5 6.0 3.0 0.0 0.0 0.0 1.0 +43 2.5 6.0 6.0 0.0 0.0 0.0 1.0 +44 2.5 6.0 9.0 0.0 0.0 0.0 1.0 +45 2.5 6.0 12.0 0.0 0.0 0.0 1.0 +46 2.5 6.0 15.0 0.0 0.0 0.0 1.0 +47 2.5 6.0 18.0 0.0 0.0 0.0 1.0 +48 2.5 6.0 21.0 0.0 0.0 0.0 1.0 +49 2.5 6.0 24.0 0.0 0.0 0.0 1.0 +50 2.5 6.0 27.0 0.0 0.0 0.0 1.0 +51 2.5 6.0 30.0 0.0 0.0 0.0 1.0 +52 2.5 6.0 33.0 0.0 0.0 0.0 1.0 +53 2.5 6.0 36.0 0.0 0.0 0.0 1.0 +54 2.5 6.0 39.0 0.0 0.0 0.0 1.0 +55 2.5 6.0 42.0 0.0 0.0 0.0 1.0 +56 2.5 6.0 45.0 0.0 0.0 0.0 1.0 +57 2.5 6.0 48.0 0.0 0.0 0.0 1.0 +58 2.5 6.0 51.0 0.0 0.0 0.0 1.0 +59 2.5 6.0 54.0 0.0 0.0 0.0 1.0 +60 2.5 6.0 57.0 0.0 0.0 0.0 1.0 +61 2.5 9.0 0.0 0.0 0.0 0.0 1.0 +62 2.5 9.0 3.0 0.0 0.0 0.0 1.0 +63 2.5 9.0 6.0 0.0 0.0 0.0 1.0 +64 2.5 9.0 9.0 0.0 0.0 0.0 1.0 +65 2.5 9.0 12.0 0.0 0.0 0.0 1.0 +66 2.5 9.0 15.0 0.0 0.0 0.0 1.0 +67 2.5 9.0 18.0 0.0 0.0 0.0 1.0 +68 2.5 9.0 21.0 0.0 0.0 0.0 1.0 +69 2.5 9.0 24.0 0.0 0.0 0.0 1.0 +70 2.5 9.0 27.0 0.0 0.0 0.0 1.0 +71 2.5 9.0 30.0 0.0 0.0 0.0 1.0 +72 2.5 9.0 33.0 0.0 0.0 0.0 1.0 +73 2.5 9.0 36.0 0.0 0.0 0.0 1.0 +74 2.5 9.0 39.0 0.0 0.0 0.0 1.0 +75 2.5 9.0 42.0 0.0 0.0 0.0 1.0 +76 2.5 9.0 45.0 0.0 0.0 0.0 1.0 +77 2.5 9.0 48.0 0.0 0.0 0.0 1.0 +78 2.5 9.0 51.0 0.0 0.0 0.0 1.0 +79 2.5 9.0 54.0 0.0 0.0 0.0 1.0 +80 2.5 9.0 57.0 0.0 0.0 0.0 1.0 +81 2.5 12.0 0.0 0.0 0.0 0.0 1.0 +82 2.5 12.0 3.0 0.0 0.0 0.0 1.0 +83 2.5 12.0 6.0 0.0 0.0 0.0 1.0 +84 2.5 12.0 9.0 0.0 0.0 0.0 1.0 +85 2.5 12.0 12.0 0.0 0.0 0.0 1.0 +86 2.5 12.0 15.0 0.0 0.0 0.0 1.0 +87 2.5 12.0 18.0 0.0 0.0 0.0 1.0 +88 2.5 12.0 21.0 0.0 0.0 0.0 1.0 +89 2.5 12.0 24.0 0.0 0.0 0.0 1.0 +90 2.5 12.0 27.0 0.0 0.0 0.0 1.0 +91 2.5 12.0 30.0 0.0 0.0 0.0 1.0 +92 2.5 12.0 33.0 0.0 0.0 0.0 1.0 +93 2.5 12.0 36.0 0.0 0.0 0.0 1.0 +94 2.5 12.0 39.0 0.0 0.0 0.0 1.0 +95 2.5 12.0 42.0 0.0 0.0 0.0 1.0 +96 2.5 12.0 45.0 0.0 0.0 0.0 1.0 +97 2.5 12.0 48.0 0.0 0.0 0.0 1.0 +98 2.5 12.0 51.0 0.0 0.0 0.0 1.0 +99 2.5 12.0 54.0 0.0 0.0 0.0 1.0 +100 2.5 12.0 57.0 0.0 0.0 0.0 1.0 +101 2.5 15.0 0.0 0.0 0.0 0.0 1.0 +102 2.5 15.0 3.0 0.0 0.0 0.0 1.0 +103 2.5 15.0 6.0 0.0 0.0 0.0 1.0 +104 2.5 15.0 9.0 0.0 0.0 0.0 1.0 +105 2.5 15.0 12.0 0.0 0.0 0.0 1.0 +106 2.5 15.0 15.0 0.0 0.0 0.0 1.0 +107 2.5 15.0 18.0 0.0 0.0 0.0 1.0 +108 2.5 15.0 21.0 0.0 0.0 0.0 1.0 +109 2.5 15.0 24.0 0.0 0.0 0.0 1.0 +110 2.5 15.0 27.0 0.0 0.0 0.0 1.0 +111 2.5 15.0 30.0 0.0 0.0 0.0 1.0 +112 2.5 15.0 33.0 0.0 0.0 0.0 1.0 +113 2.5 15.0 36.0 0.0 0.0 0.0 1.0 +114 2.5 15.0 39.0 0.0 0.0 0.0 1.0 +115 2.5 15.0 42.0 0.0 0.0 0.0 1.0 +116 2.5 15.0 45.0 0.0 0.0 0.0 1.0 +117 2.5 15.0 48.0 0.0 0.0 0.0 1.0 +118 2.5 15.0 51.0 0.0 0.0 0.0 1.0 +119 2.5 15.0 54.0 0.0 0.0 0.0 1.0 +120 2.5 15.0 57.0 0.0 0.0 0.0 1.0 +121 2.5 18.0 0.0 0.0 0.0 0.0 1.0 +122 2.5 18.0 3.0 0.0 0.0 0.0 1.0 +123 2.5 18.0 6.0 0.0 0.0 0.0 1.0 +124 2.5 18.0 9.0 0.0 0.0 0.0 1.0 +125 2.5 18.0 12.0 0.0 0.0 0.0 1.0 +126 2.5 18.0 15.0 0.0 0.0 0.0 1.0 +127 2.5 18.0 18.0 0.0 0.0 0.0 1.0 +128 2.5 18.0 21.0 0.0 0.0 0.0 1.0 +129 2.5 18.0 24.0 0.0 0.0 0.0 1.0 +130 2.5 18.0 27.0 0.0 0.0 0.0 1.0 +131 2.5 18.0 30.0 0.0 0.0 0.0 1.0 +132 2.5 18.0 33.0 0.0 0.0 0.0 1.0 +133 2.5 18.0 36.0 0.0 0.0 0.0 1.0 +134 2.5 18.0 39.0 0.0 0.0 0.0 1.0 +135 2.5 18.0 42.0 0.0 0.0 0.0 1.0 +136 2.5 18.0 45.0 0.0 0.0 0.0 1.0 +137 2.5 18.0 48.0 0.0 0.0 0.0 1.0 +138 2.5 18.0 51.0 0.0 0.0 0.0 1.0 +139 2.5 18.0 54.0 0.0 0.0 0.0 1.0 +140 2.5 18.0 57.0 0.0 0.0 0.0 1.0 +141 2.5 21.0 0.0 0.0 0.0 0.0 1.0 +142 2.5 21.0 3.0 0.0 0.0 0.0 1.0 +143 2.5 21.0 6.0 0.0 0.0 0.0 1.0 +144 2.5 21.0 9.0 0.0 0.0 0.0 1.0 +145 2.5 21.0 12.0 0.0 0.0 0.0 1.0 +146 2.5 21.0 15.0 0.0 0.0 0.0 1.0 +147 2.5 21.0 18.0 0.0 0.0 0.0 1.0 +148 2.5 21.0 21.0 0.0 0.0 0.0 1.0 +149 2.5 21.0 24.0 0.0 0.0 0.0 1.0 +150 2.5 21.0 27.0 0.0 0.0 0.0 1.0 +151 2.5 21.0 30.0 0.0 0.0 0.0 1.0 +152 2.5 21.0 33.0 0.0 0.0 0.0 1.0 +153 2.5 21.0 36.0 0.0 0.0 0.0 1.0 +154 2.5 21.0 39.0 0.0 0.0 0.0 1.0 +155 2.5 21.0 42.0 0.0 0.0 0.0 1.0 +156 2.5 21.0 45.0 0.0 0.0 0.0 1.0 +157 2.5 21.0 48.0 0.0 0.0 0.0 1.0 +158 2.5 21.0 51.0 0.0 0.0 0.0 1.0 +159 2.5 21.0 54.0 0.0 0.0 0.0 1.0 +160 2.5 21.0 57.0 0.0 0.0 0.0 1.0 +161 2.5 24.0 0.0 0.0 0.0 0.0 1.0 +162 2.5 24.0 3.0 0.0 0.0 0.0 1.0 +163 2.5 24.0 6.0 0.0 0.0 0.0 1.0 +164 2.5 24.0 9.0 0.0 0.0 0.0 1.0 +165 2.5 24.0 12.0 0.0 0.0 0.0 1.0 +166 2.5 24.0 15.0 0.0 0.0 0.0 1.0 +167 2.5 24.0 18.0 0.0 0.0 0.0 1.0 +168 2.5 24.0 21.0 0.0 0.0 0.0 1.0 +169 2.5 24.0 24.0 0.0 0.0 0.0 1.0 +170 2.5 24.0 27.0 0.0 0.0 0.0 1.0 +171 2.5 24.0 30.0 0.0 0.0 0.0 1.0 +172 2.5 24.0 33.0 0.0 0.0 0.0 1.0 +173 2.5 24.0 36.0 0.0 0.0 0.0 1.0 +174 2.5 24.0 39.0 0.0 0.0 0.0 1.0 +175 2.5 24.0 42.0 0.0 0.0 0.0 1.0 +176 2.5 24.0 45.0 0.0 0.0 0.0 1.0 +177 2.5 24.0 48.0 0.0 0.0 0.0 1.0 +178 2.5 24.0 51.0 0.0 0.0 0.0 1.0 +179 2.5 24.0 54.0 0.0 0.0 0.0 1.0 +180 2.5 24.0 57.0 0.0 0.0 0.0 1.0 +181 2.5 27.0 0.0 0.0 0.0 0.0 1.0 +182 2.5 27.0 3.0 0.0 0.0 0.0 1.0 +183 2.5 27.0 6.0 0.0 0.0 0.0 1.0 +184 2.5 27.0 9.0 0.0 0.0 0.0 1.0 +185 2.5 27.0 12.0 0.0 0.0 0.0 1.0 +186 2.5 27.0 15.0 0.0 0.0 0.0 1.0 +187 2.5 27.0 18.0 0.0 0.0 0.0 1.0 +188 2.5 27.0 21.0 0.0 0.0 0.0 1.0 +189 2.5 27.0 24.0 0.0 0.0 0.0 1.0 +190 2.5 27.0 27.0 0.0 0.0 0.0 1.0 +191 2.5 27.0 30.0 0.0 0.0 0.0 1.0 +192 2.5 27.0 33.0 0.0 0.0 0.0 1.0 +193 2.5 27.0 36.0 0.0 0.0 0.0 1.0 +194 2.5 27.0 39.0 0.0 0.0 0.0 1.0 +195 2.5 27.0 42.0 0.0 0.0 0.0 1.0 +196 2.5 27.0 45.0 0.0 0.0 0.0 1.0 +197 2.5 27.0 48.0 0.0 0.0 0.0 1.0 +198 2.5 27.0 51.0 0.0 0.0 0.0 1.0 +199 2.5 27.0 54.0 0.0 0.0 0.0 1.0 +200 2.5 27.0 57.0 0.0 0.0 0.0 1.0 +201 2.5 30.0 0.0 0.0 0.0 0.0 1.0 +202 2.5 30.0 3.0 0.0 0.0 0.0 1.0 +203 2.5 30.0 6.0 0.0 0.0 0.0 1.0 +204 2.5 30.0 9.0 0.0 0.0 0.0 1.0 +205 2.5 30.0 12.0 0.0 0.0 0.0 1.0 +206 2.5 30.0 15.0 0.0 0.0 0.0 1.0 +207 2.5 30.0 18.0 0.0 0.0 0.0 1.0 +208 2.5 30.0 21.0 0.0 0.0 0.0 1.0 +209 2.5 30.0 24.0 0.0 0.0 0.0 1.0 +210 2.5 30.0 27.0 0.0 0.0 0.0 1.0 +211 2.5 30.0 30.0 0.0 0.0 0.0 1.0 +212 2.5 30.0 33.0 0.0 0.0 0.0 1.0 +213 2.5 30.0 36.0 0.0 0.0 0.0 1.0 +214 2.5 30.0 39.0 0.0 0.0 0.0 1.0 +215 2.5 30.0 42.0 0.0 0.0 0.0 1.0 +216 2.5 30.0 45.0 0.0 0.0 0.0 1.0 +217 2.5 30.0 48.0 0.0 0.0 0.0 1.0 +218 2.5 30.0 51.0 0.0 0.0 0.0 1.0 +219 2.5 30.0 54.0 0.0 0.0 0.0 1.0 +220 2.5 30.0 57.0 0.0 0.0 0.0 1.0 +221 2.5 33.0 0.0 0.0 0.0 0.0 1.0 +222 2.5 33.0 3.0 0.0 0.0 0.0 1.0 +223 2.5 33.0 6.0 0.0 0.0 0.0 1.0 +224 2.5 33.0 9.0 0.0 0.0 0.0 1.0 +225 2.5 33.0 12.0 0.0 0.0 0.0 1.0 +226 2.5 33.0 15.0 0.0 0.0 0.0 1.0 +227 2.5 33.0 18.0 0.0 0.0 0.0 1.0 +228 2.5 33.0 21.0 0.0 0.0 0.0 1.0 +229 2.5 33.0 24.0 0.0 0.0 0.0 1.0 +230 2.5 33.0 27.0 0.0 0.0 0.0 1.0 +231 2.5 33.0 30.0 0.0 0.0 0.0 1.0 +232 2.5 33.0 33.0 0.0 0.0 0.0 1.0 +233 2.5 33.0 36.0 0.0 0.0 0.0 1.0 +234 2.5 33.0 39.0 0.0 0.0 0.0 1.0 +235 2.5 33.0 42.0 0.0 0.0 0.0 1.0 +236 2.5 33.0 45.0 0.0 0.0 0.0 1.0 +237 2.5 33.0 48.0 0.0 0.0 0.0 1.0 +238 2.5 33.0 51.0 0.0 0.0 0.0 1.0 +239 2.5 33.0 54.0 0.0 0.0 0.0 1.0 +240 2.5 33.0 57.0 0.0 0.0 0.0 1.0 +241 2.5 36.0 0.0 0.0 0.0 0.0 1.0 +242 2.5 36.0 3.0 0.0 0.0 0.0 1.0 +243 2.5 36.0 6.0 0.0 0.0 0.0 1.0 +244 2.5 36.0 9.0 0.0 0.0 0.0 1.0 +245 2.5 36.0 12.0 0.0 0.0 0.0 1.0 +246 2.5 36.0 15.0 0.0 0.0 0.0 1.0 +247 2.5 36.0 18.0 0.0 0.0 0.0 1.0 +248 2.5 36.0 21.0 0.0 0.0 0.0 1.0 +249 2.5 36.0 24.0 0.0 0.0 0.0 1.0 +250 2.5 36.0 27.0 0.0 0.0 0.0 1.0 +251 2.5 36.0 30.0 0.0 0.0 0.0 1.0 +252 2.5 36.0 33.0 0.0 0.0 0.0 1.0 +253 2.5 36.0 36.0 0.0 0.0 0.0 1.0 +254 2.5 36.0 39.0 0.0 0.0 0.0 1.0 +255 2.5 36.0 42.0 0.0 0.0 0.0 1.0 +256 2.5 36.0 45.0 0.0 0.0 0.0 1.0 +257 2.5 36.0 48.0 0.0 0.0 0.0 1.0 +258 2.5 36.0 51.0 0.0 0.0 0.0 1.0 +259 2.5 36.0 54.0 0.0 0.0 0.0 1.0 +260 2.5 36.0 57.0 0.0 0.0 0.0 1.0 +261 2.5 39.0 0.0 0.0 0.0 0.0 1.0 +262 2.5 39.0 3.0 0.0 0.0 0.0 1.0 +263 2.5 39.0 6.0 0.0 0.0 0.0 1.0 +264 2.5 39.0 9.0 0.0 0.0 0.0 1.0 +265 2.5 39.0 12.0 0.0 0.0 0.0 1.0 +266 2.5 39.0 15.0 0.0 0.0 0.0 1.0 +267 2.5 39.0 18.0 0.0 0.0 0.0 1.0 +268 2.5 39.0 21.0 0.0 0.0 0.0 1.0 +269 2.5 39.0 24.0 0.0 0.0 0.0 1.0 +270 2.5 39.0 27.0 0.0 0.0 0.0 1.0 +271 2.5 39.0 30.0 0.0 0.0 0.0 1.0 +272 2.5 39.0 33.0 0.0 0.0 0.0 1.0 +273 2.5 39.0 36.0 0.0 0.0 0.0 1.0 +274 2.5 39.0 39.0 0.0 0.0 0.0 1.0 +275 2.5 39.0 42.0 0.0 0.0 0.0 1.0 +276 2.5 39.0 45.0 0.0 0.0 0.0 1.0 +277 2.5 39.0 48.0 0.0 0.0 0.0 1.0 +278 2.5 39.0 51.0 0.0 0.0 0.0 1.0 +279 2.5 39.0 54.0 0.0 0.0 0.0 1.0 +280 2.5 39.0 57.0 0.0 0.0 0.0 1.0 +281 2.5 42.0 0.0 0.0 0.0 0.0 1.0 +282 2.5 42.0 3.0 0.0 0.0 0.0 1.0 +283 2.5 42.0 6.0 0.0 0.0 0.0 1.0 +284 2.5 42.0 9.0 0.0 0.0 0.0 1.0 +285 2.5 42.0 12.0 0.0 0.0 0.0 1.0 +286 2.5 42.0 15.0 0.0 0.0 0.0 1.0 +287 2.5 42.0 18.0 0.0 0.0 0.0 1.0 +288 2.5 42.0 21.0 0.0 0.0 0.0 1.0 +289 2.5 42.0 24.0 0.0 0.0 0.0 1.0 +290 2.5 42.0 27.0 0.0 0.0 0.0 1.0 +291 2.5 42.0 30.0 0.0 0.0 0.0 1.0 +292 2.5 42.0 33.0 0.0 0.0 0.0 1.0 +293 2.5 42.0 36.0 0.0 0.0 0.0 1.0 +294 2.5 42.0 39.0 0.0 0.0 0.0 1.0 +295 2.5 42.0 42.0 0.0 0.0 0.0 1.0 +296 2.5 42.0 45.0 0.0 0.0 0.0 1.0 +297 2.5 42.0 48.0 0.0 0.0 0.0 1.0 +298 2.5 42.0 51.0 0.0 0.0 0.0 1.0 +299 2.5 42.0 54.0 0.0 0.0 0.0 1.0 +300 2.5 42.0 57.0 0.0 0.0 0.0 1.0 +301 2.5 45.0 0.0 0.0 0.0 0.0 1.0 +302 2.5 45.0 3.0 0.0 0.0 0.0 1.0 +303 2.5 45.0 6.0 0.0 0.0 0.0 1.0 +304 2.5 45.0 9.0 0.0 0.0 0.0 1.0 +305 2.5 45.0 12.0 0.0 0.0 0.0 1.0 +306 2.5 45.0 15.0 0.0 0.0 0.0 1.0 +307 2.5 45.0 18.0 0.0 0.0 0.0 1.0 +308 2.5 45.0 21.0 0.0 0.0 0.0 1.0 +309 2.5 45.0 24.0 0.0 0.0 0.0 1.0 +310 2.5 45.0 27.0 0.0 0.0 0.0 1.0 +311 2.5 45.0 30.0 0.0 0.0 0.0 1.0 +312 2.5 45.0 33.0 0.0 0.0 0.0 1.0 +313 2.5 45.0 36.0 0.0 0.0 0.0 1.0 +314 2.5 45.0 39.0 0.0 0.0 0.0 1.0 +315 2.5 45.0 42.0 0.0 0.0 0.0 1.0 +316 2.5 45.0 45.0 0.0 0.0 0.0 1.0 +317 2.5 45.0 48.0 0.0 0.0 0.0 1.0 +318 2.5 45.0 51.0 0.0 0.0 0.0 1.0 +319 2.5 45.0 54.0 0.0 0.0 0.0 1.0 +320 2.5 45.0 57.0 0.0 0.0 0.0 1.0 +321 2.5 48.0 0.0 0.0 0.0 0.0 1.0 +322 2.5 48.0 3.0 0.0 0.0 0.0 1.0 +323 2.5 48.0 6.0 0.0 0.0 0.0 1.0 +324 2.5 48.0 9.0 0.0 0.0 0.0 1.0 +325 2.5 48.0 12.0 0.0 0.0 0.0 1.0 +326 2.5 48.0 15.0 0.0 0.0 0.0 1.0 +327 2.5 48.0 18.0 0.0 0.0 0.0 1.0 +328 2.5 48.0 21.0 0.0 0.0 0.0 1.0 +329 2.5 48.0 24.0 0.0 0.0 0.0 1.0 +330 2.5 48.0 27.0 0.0 0.0 0.0 1.0 +331 2.5 48.0 30.0 0.0 0.0 0.0 1.0 +332 2.5 48.0 33.0 0.0 0.0 0.0 1.0 +333 2.5 48.0 36.0 0.0 0.0 0.0 1.0 +334 2.5 48.0 39.0 0.0 0.0 0.0 1.0 +335 2.5 48.0 42.0 0.0 0.0 0.0 1.0 +336 2.5 48.0 45.0 0.0 0.0 0.0 1.0 +337 2.5 48.0 48.0 0.0 0.0 0.0 1.0 +338 2.5 48.0 51.0 0.0 0.0 0.0 1.0 +339 2.5 48.0 54.0 0.0 0.0 0.0 1.0 +340 2.5 48.0 57.0 0.0 0.0 0.0 1.0 +341 2.5 51.0 0.0 0.0 0.0 0.0 1.0 +342 2.5 51.0 3.0 0.0 0.0 0.0 1.0 +343 2.5 51.0 6.0 0.0 0.0 0.0 1.0 +344 2.5 51.0 9.0 0.0 0.0 0.0 1.0 +345 2.5 51.0 12.0 0.0 0.0 0.0 1.0 +346 2.5 51.0 15.0 0.0 0.0 0.0 1.0 +347 2.5 51.0 18.0 0.0 0.0 0.0 1.0 +348 2.5 51.0 21.0 0.0 0.0 0.0 1.0 +349 2.5 51.0 24.0 0.0 0.0 0.0 1.0 +350 2.5 51.0 27.0 0.0 0.0 0.0 1.0 +351 2.5 51.0 30.0 0.0 0.0 0.0 1.0 +352 2.5 51.0 33.0 0.0 0.0 0.0 1.0 +353 2.5 51.0 36.0 0.0 0.0 0.0 1.0 +354 2.5 51.0 39.0 0.0 0.0 0.0 1.0 +355 2.5 51.0 42.0 0.0 0.0 0.0 1.0 +356 2.5 51.0 45.0 0.0 0.0 0.0 1.0 +357 2.5 51.0 48.0 0.0 0.0 0.0 1.0 +358 2.5 51.0 51.0 0.0 0.0 0.0 1.0 +359 2.5 51.0 54.0 0.0 0.0 0.0 1.0 +360 2.5 51.0 57.0 0.0 0.0 0.0 1.0 +361 2.5 54.0 0.0 0.0 0.0 0.0 1.0 +362 2.5 54.0 3.0 0.0 0.0 0.0 1.0 +363 2.5 54.0 6.0 0.0 0.0 0.0 1.0 +364 2.5 54.0 9.0 0.0 0.0 0.0 1.0 +365 2.5 54.0 12.0 0.0 0.0 0.0 1.0 +366 2.5 54.0 15.0 0.0 0.0 0.0 1.0 +367 2.5 54.0 18.0 0.0 0.0 0.0 1.0 +368 2.5 54.0 21.0 0.0 0.0 0.0 1.0 +369 2.5 54.0 24.0 0.0 0.0 0.0 1.0 +370 2.5 54.0 27.0 0.0 0.0 0.0 1.0 +371 2.5 54.0 30.0 0.0 0.0 0.0 1.0 +372 2.5 54.0 33.0 0.0 0.0 0.0 1.0 +373 2.5 54.0 36.0 0.0 0.0 0.0 1.0 +374 2.5 54.0 39.0 0.0 0.0 0.0 1.0 +375 2.5 54.0 42.0 0.0 0.0 0.0 1.0 +376 2.5 54.0 45.0 0.0 0.0 0.0 1.0 +377 2.5 54.0 48.0 0.0 0.0 0.0 1.0 +378 2.5 54.0 51.0 0.0 0.0 0.0 1.0 +379 2.5 54.0 54.0 0.0 0.0 0.0 1.0 +380 2.5 54.0 57.0 0.0 0.0 0.0 1.0 +381 2.5 57.0 0.0 0.0 0.0 0.0 1.0 +382 2.5 57.0 3.0 0.0 0.0 0.0 1.0 +383 2.5 57.0 6.0 0.0 0.0 0.0 1.0 +384 2.5 57.0 9.0 0.0 0.0 0.0 1.0 +385 2.5 57.0 12.0 0.0 0.0 0.0 1.0 +386 2.5 57.0 15.0 0.0 0.0 0.0 1.0 +387 2.5 57.0 18.0 0.0 0.0 0.0 1.0 +388 2.5 57.0 21.0 0.0 0.0 0.0 1.0 +389 2.5 57.0 24.0 0.0 0.0 0.0 1.0 +390 2.5 57.0 27.0 0.0 0.0 0.0 1.0 +391 2.5 57.0 30.0 0.0 0.0 0.0 1.0 +392 2.5 57.0 33.0 0.0 0.0 0.0 1.0 +393 2.5 57.0 36.0 0.0 0.0 0.0 1.0 +394 2.5 57.0 39.0 0.0 0.0 0.0 1.0 +395 2.5 57.0 42.0 0.0 0.0 0.0 1.0 +396 2.5 57.0 45.0 0.0 0.0 0.0 1.0 +397 2.5 57.0 48.0 0.0 0.0 0.0 1.0 +398 2.5 57.0 51.0 0.0 0.0 0.0 1.0 +399 2.5 57.0 54.0 0.0 0.0 0.0 1.0 +400 2.5 57.0 57.0 0.0 0.0 0.0 1.0 diff --git a/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion b/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion new file mode 100644 index 0000000000..aab6376e98 --- /dev/null +++ b/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion @@ -0,0 +1,58 @@ +# 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 sc 3.0 +#region box block 0.0 20.0 0.0 20.0 0.0 1.0 +#create_box 1 box +#create_atoms 1 box + +read_data initial.skyrmion + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +#set group all spin 2.2 -1.0 0.0 0.0 + +pair_style hybrid/overlay spin/exchange 3.1 spin/dmi 3.1 +pair_coeff * * spin/exchange exchange 3.1 0.01593 0.06626915552 1.211 +pair_coeff * * spin/dmi dmi 3.1 0.12e-03 0.0 0.0 1.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 anisotropy 5e-05 0.0 0.0 1.0 +fix_modify 1 energy yes +fix 2 all langevin/spin 0.0 0.0 21 +fix 3 all neb/spin 1.0 +#fix 4 all nve/spin lattice no + +timestep 0.0001 +#run 0 + +compute out_mag all spin +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] + +thermo 100 +thermo_style custom step time v_magx v_magz v_magnorm etotal +thermo_modify format float %20.15g + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +variable u universe 1 2 3 4 +#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] +dump 1 all custom 1 dump.$u 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 +neb/spin 1.0e-16 1.0e-16 1000 1000 10 final final.skyrmion +#neb/spin 1.0e-16 1.0e-16 10 10 10 final final.skyrmion diff --git a/examples/SPIN/gneb/skyrmion/initial.skyrmion b/examples/SPIN/gneb/skyrmion/initial.skyrmion new file mode 100644 index 0000000000..f940aee182 --- /dev/null +++ b/examples/SPIN/gneb/skyrmion/initial.skyrmion @@ -0,0 +1,818 @@ +LAMMPS data file via write_data, version 28 Feb 2019, timestep = 6 + +400 atoms +1 atom types + +0.0000000000000000e+00 6.0000000000000000e+01 xlo xhi +0.0000000000000000e+00 6.0000000000000000e+01 ylo yhi +0.0000000000000000e+00 3.0000000000000000e+00 zlo zhi + +Masses + +1 55.845 + +Atoms # spin + +1 1 2.5000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -3.9693242391277868e-03 -3.9693242391277929e-03 9.9998424434096433e-01 0 0 0 +21 1 2.5000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.1868011343002482e-02 -4.8145058779812530e-03 9.9991798205648519e-01 0 0 0 +41 1 2.5000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -1.9561861499557517e-02 -6.5828744882500201e-03 9.9978697697966845e-01 0 0 0 +61 1 2.5000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 -2.6644762521588476e-02 -9.3989438861432541e-03 9.9960077855311480e-01 0 0 0 +81 1 2.5000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.2364838887478299e-02 -1.3362272507461704e-02 9.9938679542868891e-01 0 0 0 +101 1 2.5000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.5634992015801843e-02 -1.8429703183501425e-02 9.9919492261750509e-01 0 0 0 +121 1 2.5000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.5235119566844247e-02 -2.4270277420221115e-02 9.9908430073895971e-01 0 0 0 +141 1 2.5000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -3.0237916900163156e-02 -3.0163850736159143e-02 9.9908748890690546e-01 0 0 0 +161 1 2.5000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -2.0551704657275890e-02 -3.5058787503171429e-02 9.9917391321755789e-01 0 0 0 +181 1 2.5000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 -7.2971667669136115e-03 -3.7860607272964066e-02 9.9925638640646097e-01 0 0 0 +201 1 2.5000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 7.2971667669136028e-03 -3.7860607272964066e-02 9.9925638640646086e-01 0 0 0 +221 1 2.5000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 2.0551704657275901e-02 -3.5058787503171443e-02 9.9917391321755789e-01 0 0 0 +241 1 2.5000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.0237916900163156e-02 -3.0163850736159153e-02 9.9908748890690535e-01 0 0 0 +261 1 2.5000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.5235119566844234e-02 -2.4270277420221108e-02 9.9908430073895960e-01 0 0 0 +281 1 2.5000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.5634992015801829e-02 -1.8429703183501414e-02 9.9919492261750498e-01 0 0 0 +301 1 2.5000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.2364838887478306e-02 -1.3362272507461704e-02 9.9938679542868891e-01 0 0 0 +321 1 2.5000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 2.6644762521588494e-02 -9.3989438861432611e-03 9.9960077855311491e-01 0 0 0 +341 1 2.5000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.9561861499557517e-02 -6.5828744882500201e-03 9.9978697697966856e-01 0 0 0 +361 1 2.5000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 1.1868011343002482e-02 -4.8145058779812547e-03 9.9991798205648508e-01 0 0 0 +381 1 2.5000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 0.0000000000000000e+00 3.9693242391277929e-03 -3.9693242391277937e-03 9.9998424434096445e-01 0 0 0 +2 1 2.5000000000000000e+00 0.0000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 -4.8145058779812512e-03 -1.1868011343002475e-02 9.9991798205648519e-01 0 0 0 +22 1 2.5000000000000000e+00 3.0000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 -1.4489047587394138e-02 -1.4489047587394138e-02 9.9979004545955574e-01 0 0 0 +42 1 2.5000000000000000e+00 6.0000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 -2.4184841732588187e-02 -2.0009637034407928e-02 9.9950723251816487e-01 0 0 0 +62 1 2.5000000000000000e+00 9.0000000000000000e+00 3.0000000000000000e+00 0.0000000000000000e+00 -3.3534698701154796e-02 -2.8894018478272422e-02 9.9901979944303421e-01 0 0 0 +82 1 2.5000000000000000e+00 1.2000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -4.1631298256624205e-02 -4.1569375222726884e-02 9.9826791095830603e-01 0 0 0 +102 1 2.5000000000000000e+00 1.5000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -4.6947676140268457e-02 -5.8031121465001792e-02 9.9721026100143129e-01 0 0 0 +122 1 2.5000000000000000e+00 1.8000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -4.7535409319668050e-02 -7.7312985281705895e-02 9.9587302763336383e-01 0 0 0 +142 1 2.5000000000000000e+00 2.1000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -4.1653952417990837e-02 -9.7059251840902777e-02 9.9440658177630958e-01 0 0 0 +162 1 2.5000000000000000e+00 2.4000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -2.8752729368399305e-02 -1.1365104497068100e-01 9.9310458690459180e-01 0 0 0 +182 1 2.5000000000000000e+00 2.7000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 -1.0293413501576094e-02 -1.2321728304286263e-01 9.9232633079951105e-01 0 0 0 +202 1 2.5000000000000000e+00 3.0000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 1.0293413501576086e-02 -1.2321728304286261e-01 9.9232633079951116e-01 0 0 0 +222 1 2.5000000000000000e+00 3.3000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 2.8752729368399291e-02 -1.1365104497068100e-01 9.9310458690459180e-01 0 0 0 +242 1 2.5000000000000000e+00 3.6000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.1653952417990824e-02 -9.7059251840902777e-02 9.9440658177630958e-01 0 0 0 +262 1 2.5000000000000000e+00 3.9000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.7535409319668057e-02 -7.7312985281705895e-02 9.9587302763336383e-01 0 0 0 +282 1 2.5000000000000000e+00 4.2000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.6947676140268443e-02 -5.8031121465001792e-02 9.9721026100143140e-01 0 0 0 +302 1 2.5000000000000000e+00 4.5000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.1631298256624191e-02 -4.1569375222726877e-02 9.9826791095830592e-01 0 0 0 +322 1 2.5000000000000000e+00 4.8000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 3.3534698701154809e-02 -2.8894018478272433e-02 9.9901979944303410e-01 0 0 0 +342 1 2.5000000000000000e+00 5.1000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 2.4184841732588204e-02 -2.0009637034407945e-02 9.9950723251816487e-01 0 0 0 +362 1 2.5000000000000000e+00 5.4000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 1.4489047587394149e-02 -1.4489047587394138e-02 9.9979004545955585e-01 0 0 0 +382 1 2.5000000000000000e+00 5.7000000000000000e+01 3.0000000000000000e+00 0.0000000000000000e+00 4.8145058779812547e-03 -1.1868011343002482e-02 9.9991798205648519e-01 0 0 0 +3 1 2.5000000000000000e+00 0.0000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 -6.5828744882500158e-03 -1.9561861499557527e-02 9.9978697697966856e-01 0 0 0 +23 1 2.5000000000000000e+00 3.0000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 -2.0009637034407932e-02 -2.4184841732588200e-02 9.9950723251816498e-01 0 0 0 +43 1 2.5000000000000000e+00 6.0000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 -3.4047077037887570e-02 -3.4047077037887577e-02 9.9884012388887977e-01 0 0 0 +63 1 2.5000000000000000e+00 9.0000000000000000e+00 6.0000000000000000e+00 0.0000000000000000e+00 -4.8498220596720307e-02 -5.0241530269051260e-02 9.9755887607457838e-01 0 0 0 +83 1 2.5000000000000000e+00 1.2000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -6.2196104012276265e-02 -7.3954811425103587e-02 9.9532021506285684e-01 0 0 0 +103 1 2.5000000000000000e+00 1.5000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -7.2649992877525826e-02 -1.0567933713226435e-01 9.9174283775491956e-01 0 0 0 +123 1 2.5000000000000000e+00 1.8000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -7.6126593015943808e-02 -1.4398087111736477e-01 9.8664798717073865e-01 0 0 0 +143 1 2.5000000000000000e+00 2.1000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -6.8709104650143085e-02 -1.8428174194944069e-01 9.8046891767268973e-01 0 0 0 +163 1 2.5000000000000000e+00 2.4000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -4.8457456104349643e-02 -2.1884669159068457e-01 9.7455528346405618e-01 0 0 0 +183 1 2.5000000000000000e+00 2.7000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 -1.7543173966404597e-02 -2.3902270727461428e-01 9.7085548999544657e-01 0 0 0 +203 1 2.5000000000000000e+00 3.0000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 1.7543173966404587e-02 -2.3902270727461422e-01 9.7085548999544646e-01 0 0 0 +223 1 2.5000000000000000e+00 3.3000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 4.8457456104349608e-02 -2.1884669159068454e-01 9.7455528346405618e-01 0 0 0 +243 1 2.5000000000000000e+00 3.6000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 6.8709104650143044e-02 -1.8428174194944069e-01 9.8046891767268962e-01 0 0 0 +263 1 2.5000000000000000e+00 3.9000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 7.6126593015943766e-02 -1.4398087111736474e-01 9.8664798717073865e-01 0 0 0 +283 1 2.5000000000000000e+00 4.2000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 7.2649992877525826e-02 -1.0567933713226434e-01 9.9174283775491956e-01 0 0 0 +303 1 2.5000000000000000e+00 4.5000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 6.2196104012276258e-02 -7.3954811425103573e-02 9.9532021506285673e-01 0 0 0 +323 1 2.5000000000000000e+00 4.8000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 4.8498220596720307e-02 -5.0241530269051260e-02 9.9755887607457838e-01 0 0 0 +343 1 2.5000000000000000e+00 5.1000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 3.4047077037887577e-02 -3.4047077037887577e-02 9.9884012388887966e-01 0 0 0 +363 1 2.5000000000000000e+00 5.4000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 2.0009637034407942e-02 -2.4184841732588211e-02 9.9950723251816498e-01 0 0 0 +383 1 2.5000000000000000e+00 5.7000000000000000e+01 6.0000000000000000e+00 0.0000000000000000e+00 6.5828744882500201e-03 -1.9561861499557531e-02 9.9978697697966856e-01 0 0 0 +4 1 2.5000000000000000e+00 0.0000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 -9.3989438861432524e-03 -2.6644762521588497e-02 9.9960077855311480e-01 0 0 0 +24 1 2.5000000000000000e+00 3.0000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 -2.8894018478272426e-02 -3.3534698701154803e-02 9.9901979944303410e-01 0 0 0 +44 1 2.5000000000000000e+00 6.0000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 -5.0241530269051232e-02 -4.8498220596720286e-02 9.9755887607457827e-01 0 0 0 +64 1 2.5000000000000000e+00 9.0000000000000000e+00 9.0000000000000000e+00 0.0000000000000000e+00 -7.3771080474423129e-02 -7.3771080474423115e-02 9.9454293792237669e-01 0 0 0 +84 1 2.5000000000000000e+00 1.2000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -9.8127311868331568e-02 -1.1214098437153223e-01 9.8883539089662387e-01 0 0 0 +104 1 2.5000000000000000e+00 1.5000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -1.1922421797550638e-01 -1.6561310406555055e-01 9.7895755046370747e-01 0 0 0 +124 1 2.5000000000000000e+00 1.8000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -1.2975986317850730e-01 -2.3284022614534144e-01 9.6381938504912923e-01 0 0 0 +144 1 2.5000000000000000e+00 2.1000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -1.2090775615411226e-01 -3.0602867088565672e-01 9.4431338394504205e-01 0 0 0 +164 1 2.5000000000000000e+00 2.4000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -8.7191355151399766e-02 -3.7026717261459724e-01 9.2482424734154478e-01 0 0 0 +184 1 2.5000000000000000e+00 2.7000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 -3.1922103301157183e-02 -4.0821375936870385e-01 9.1232806927272614e-01 0 0 0 +204 1 2.5000000000000000e+00 3.0000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 3.1922103301157155e-02 -4.0821375936870385e-01 9.1232806927272625e-01 0 0 0 +224 1 2.5000000000000000e+00 3.3000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 8.7191355151399724e-02 -3.7026717261459718e-01 9.2482424734154478e-01 0 0 0 +244 1 2.5000000000000000e+00 3.6000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 1.2090775615411219e-01 -3.0602867088565661e-01 9.4431338394504194e-01 0 0 0 +264 1 2.5000000000000000e+00 3.9000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 1.2975986317850724e-01 -2.3284022614534142e-01 9.6381938504912912e-01 0 0 0 +284 1 2.5000000000000000e+00 4.2000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 1.1922421797550635e-01 -1.6561310406555052e-01 9.7895755046370747e-01 0 0 0 +304 1 2.5000000000000000e+00 4.5000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 9.8127311868331568e-02 -1.1214098437153228e-01 9.8883539089662398e-01 0 0 0 +324 1 2.5000000000000000e+00 4.8000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 7.3771080474423129e-02 -7.3771080474423142e-02 9.9454293792237669e-01 0 0 0 +344 1 2.5000000000000000e+00 5.1000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 5.0241530269051253e-02 -4.8498220596720314e-02 9.9755887607457827e-01 0 0 0 +364 1 2.5000000000000000e+00 5.4000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 2.8894018478272443e-02 -3.3534698701154816e-02 9.9901979944303410e-01 0 0 0 +384 1 2.5000000000000000e+00 5.7000000000000000e+01 9.0000000000000000e+00 0.0000000000000000e+00 9.3989438861432611e-03 -2.6644762521588494e-02 9.9960077855311480e-01 0 0 0 +5 1 2.5000000000000000e+00 0.0000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 -1.3362272507461699e-02 -3.2364838887478299e-02 9.9938679542868880e-01 0 0 0 +25 1 2.5000000000000000e+00 3.0000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 -4.1569375222726863e-02 -4.1631298256624198e-02 9.9826791095830603e-01 0 0 0 +45 1 2.5000000000000000e+00 6.0000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 -7.3954811425103559e-02 -6.2196104012276245e-02 9.9532021506285673e-01 0 0 0 +65 1 2.5000000000000000e+00 9.0000000000000000e+00 1.2000000000000000e+01 0.0000000000000000e+00 -1.1214098437153225e-01 -9.8127311868331554e-02 9.8883539089662398e-01 0 0 0 +85 1 2.5000000000000000e+00 1.2000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -1.5508313718777630e-01 -1.5508313718777628e-01 9.7565282817198595e-01 0 0 0 +105 1 2.5000000000000000e+00 1.5000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -1.9646003525323200e-01 -2.3830565311068275e-01 9.5111191257590177e-01 0 0 0 +125 1 2.5000000000000000e+00 1.8000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -2.2234110900479689e-01 -3.4758786972735528e-01 9.1090455266450188e-01 0 0 0 +145 1 2.5000000000000000e+00 2.1000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -2.1357380845070773e-01 -4.7013886220911955e-01 8.5636188529416402e-01 0 0 0 +165 1 2.5000000000000000e+00 2.4000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -1.5692234237038313e-01 -5.7886257432716870e-01 8.0018341554190886e-01 0 0 0 +185 1 2.5000000000000000e+00 2.7000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 -5.7920936211537863e-02 -6.4295931380698856e-01 7.6370706814669809e-01 0 0 0 +205 1 2.5000000000000000e+00 3.0000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 5.7920936211537793e-02 -6.4295931380698856e-01 7.6370706814669809e-01 0 0 0 +225 1 2.5000000000000000e+00 3.3000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.5692234237038311e-01 -5.7886257432716881e-01 8.0018341554190908e-01 0 0 0 +245 1 2.5000000000000000e+00 3.6000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 2.1357380845070767e-01 -4.7013886220911949e-01 8.5636188529416413e-01 0 0 0 +265 1 2.5000000000000000e+00 3.9000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 2.2234110900479689e-01 -3.4758786972735528e-01 9.1090455266450188e-01 0 0 0 +285 1 2.5000000000000000e+00 4.2000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.9646003525323205e-01 -2.3830565311068283e-01 9.5111191257590177e-01 0 0 0 +305 1 2.5000000000000000e+00 4.5000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.5508313718777633e-01 -1.5508313718777636e-01 9.7565282817198595e-01 0 0 0 +325 1 2.5000000000000000e+00 4.8000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.1214098437153229e-01 -9.8127311868331610e-02 9.8883539089662398e-01 0 0 0 +345 1 2.5000000000000000e+00 5.1000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 7.3954811425103614e-02 -6.2196104012276265e-02 9.9532021506285684e-01 0 0 0 +365 1 2.5000000000000000e+00 5.4000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 4.1569375222726898e-02 -4.1631298256624198e-02 9.9826791095830603e-01 0 0 0 +385 1 2.5000000000000000e+00 5.7000000000000000e+01 1.2000000000000000e+01 0.0000000000000000e+00 1.3362272507461706e-02 -3.2364838887478299e-02 9.9938679542868891e-01 0 0 0 +6 1 2.5000000000000000e+00 0.0000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 -1.8429703183501404e-02 -3.5634992015801836e-02 9.9919492261750509e-01 0 0 0 +26 1 2.5000000000000000e+00 3.0000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 -5.8031121465001771e-02 -4.6947676140268457e-02 9.9721026100143140e-01 0 0 0 +46 1 2.5000000000000000e+00 6.0000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 -1.0567933713226434e-01 -7.2649992877525812e-02 9.9174283775491956e-01 0 0 0 +66 1 2.5000000000000000e+00 9.0000000000000000e+00 1.5000000000000000e+01 0.0000000000000000e+00 -1.6561310406555055e-01 -1.1922421797550634e-01 9.7895755046370747e-01 0 0 0 +86 1 2.5000000000000000e+00 1.2000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -2.3830565311068275e-01 -1.9646003525323197e-01 9.5111191257590177e-01 0 0 0 +106 1 2.5000000000000000e+00 1.5000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -3.1460569929723275e-01 -3.1460569929723275e-01 8.9557049300398384e-01 0 0 0 +126 1 2.5000000000000000e+00 1.8000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -3.6852592591640337e-01 -4.7476254409897906e-01 7.9924287212844281e-01 0 0 0 +146 1 2.5000000000000000e+00 2.1000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -3.6081689881382256e-01 -6.5421949001862334e-01 6.6468641058031896e-01 0 0 0 +166 1 2.5000000000000000e+00 2.4000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -2.6598547494087149e-01 -8.0744368404029232e-01 5.2657993146712301e-01 0 0 0 +186 1 2.5000000000000000e+00 2.7000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 -9.7873033584060118e-02 -8.9330169771966939e-01 4.3867179775797049e-01 0 0 0 +206 1 2.5000000000000000e+00 3.0000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 9.7873033584060007e-02 -8.9330169771966939e-01 4.3867179775797044e-01 0 0 0 +226 1 2.5000000000000000e+00 3.3000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 2.6598547494087138e-01 -8.0744368404029232e-01 5.2657993146712301e-01 0 0 0 +246 1 2.5000000000000000e+00 3.6000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 3.6081689881382251e-01 -6.5421949001862334e-01 6.6468641058031896e-01 0 0 0 +266 1 2.5000000000000000e+00 3.9000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 3.6852592591640337e-01 -4.7476254409897911e-01 7.9924287212844303e-01 0 0 0 +286 1 2.5000000000000000e+00 4.2000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 3.1460569929723281e-01 -3.1460569929723281e-01 8.9557049300398361e-01 0 0 0 +306 1 2.5000000000000000e+00 4.5000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 2.3830565311068277e-01 -1.9646003525323205e-01 9.5111191257590177e-01 0 0 0 +326 1 2.5000000000000000e+00 4.8000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 1.6561310406555055e-01 -1.1922421797550636e-01 9.7895755046370736e-01 0 0 0 +346 1 2.5000000000000000e+00 5.1000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 1.0567933713226439e-01 -7.2649992877525854e-02 9.9174283775491956e-01 0 0 0 +366 1 2.5000000000000000e+00 5.4000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 5.8031121465001820e-02 -4.6947676140268485e-02 9.9721026100143140e-01 0 0 0 +386 1 2.5000000000000000e+00 5.7000000000000000e+01 1.5000000000000000e+01 0.0000000000000000e+00 1.8429703183501425e-02 -3.5634992015801836e-02 9.9919492261750498e-01 0 0 0 +7 1 2.5000000000000000e+00 0.0000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 -2.4270277420221083e-02 -3.5235119566844234e-02 9.9908430073895960e-01 0 0 0 +27 1 2.5000000000000000e+00 3.0000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 -7.7312985281705854e-02 -4.7535409319668043e-02 9.9587302763336372e-01 0 0 0 +47 1 2.5000000000000000e+00 6.0000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 -1.4398087111736474e-01 -7.6126593015943766e-02 9.8664798717073854e-01 0 0 0 +67 1 2.5000000000000000e+00 9.0000000000000000e+00 1.8000000000000000e+01 0.0000000000000000e+00 -2.3284022614534147e-01 -1.2975986317850727e-01 9.6381938504912923e-01 0 0 0 +87 1 2.5000000000000000e+00 1.2000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -3.4758786972735523e-01 -2.2234110900479681e-01 9.1090455266450177e-01 0 0 0 +107 1 2.5000000000000000e+00 1.5000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -4.7476254409897900e-01 -3.6852592591640326e-01 7.9924287212844292e-01 0 0 0 +127 1 2.5000000000000000e+00 1.8000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -5.6571145299922609e-01 -5.6571145299922598e-01 5.9995091790163058e-01 0 0 0 +147 1 2.5000000000000000e+00 2.1000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -5.4725458628470525e-01 -7.6968694425946660e-01 3.2877716713129740e-01 0 0 0 +167 1 2.5000000000000000e+00 2.4000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -3.9048923819288139e-01 -9.1777534868081290e-01 7.2156525757244322e-02 0 0 0 +187 1 2.5000000000000000e+00 2.7000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 -1.3991724696158017e-01 -9.8714633419212083e-01 -7.7235217962726241e-02 0 0 0 +207 1 2.5000000000000000e+00 3.0000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 1.3991724696158006e-01 -9.8714633419212106e-01 -7.7235217962726241e-02 0 0 0 +227 1 2.5000000000000000e+00 3.3000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 3.9048923819288128e-01 -9.1777534868081279e-01 7.2156525757244322e-02 0 0 0 +247 1 2.5000000000000000e+00 3.6000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 5.4725458628470514e-01 -7.6968694425946649e-01 3.2877716713129734e-01 0 0 0 +267 1 2.5000000000000000e+00 3.9000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 5.6571145299922621e-01 -5.6571145299922609e-01 5.9995091790163035e-01 0 0 0 +287 1 2.5000000000000000e+00 4.2000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 4.7476254409897917e-01 -3.6852592591640337e-01 7.9924287212844281e-01 0 0 0 +307 1 2.5000000000000000e+00 4.5000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 3.4758786972735534e-01 -2.2234110900479692e-01 9.1090455266450188e-01 0 0 0 +327 1 2.5000000000000000e+00 4.8000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 2.3284022614534147e-01 -1.2975986317850732e-01 9.6381938504912912e-01 0 0 0 +347 1 2.5000000000000000e+00 5.1000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 1.4398087111736477e-01 -7.6126593015943808e-02 9.8664798717073854e-01 0 0 0 +367 1 2.5000000000000000e+00 5.4000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 7.7312985281705909e-02 -4.7535409319668064e-02 9.9587302763336372e-01 0 0 0 +387 1 2.5000000000000000e+00 5.7000000000000000e+01 1.8000000000000000e+01 0.0000000000000000e+00 2.4270277420221129e-02 -3.5235119566844247e-02 9.9908430073895971e-01 0 0 0 +8 1 2.5000000000000000e+00 0.0000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 -3.0163850736159105e-02 -3.0237916900163149e-02 9.9908748890690535e-01 0 0 0 +28 1 2.5000000000000000e+00 3.0000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 -9.7059251840902722e-02 -4.1653952417990810e-02 9.9440658177630958e-01 0 0 0 +48 1 2.5000000000000000e+00 6.0000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 -1.8428174194944064e-01 -6.8709104650143071e-02 9.8046891767268973e-01 0 0 0 +68 1 2.5000000000000000e+00 9.0000000000000000e+00 2.1000000000000000e+01 0.0000000000000000e+00 -3.0602867088565666e-01 -1.2090775615411221e-01 9.4431338394504205e-01 0 0 0 +88 1 2.5000000000000000e+00 1.2000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -4.7013886220911943e-01 -2.1357380845070767e-01 8.5636188529416413e-01 0 0 0 +108 1 2.5000000000000000e+00 1.5000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -6.5421949001862312e-01 -3.6081689881382245e-01 6.6468641058031908e-01 0 0 0 +128 1 2.5000000000000000e+00 1.8000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -7.6968694425946649e-01 -5.4725458628470514e-01 3.2877716713129745e-01 0 0 0 +148 1 2.5000000000000000e+00 2.1000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -7.0472416296125850e-01 -7.0472416296125850e-01 -8.2022608329090224e-02 0 0 0 +168 1 2.5000000000000000e+00 2.4000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -4.6907708232882805e-01 -7.8303583820847300e-01 -4.0843795968914098e-01 0 0 0 +188 1 2.5000000000000000e+00 2.7000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 -1.6077801357100108e-01 -8.0506391360620255e-01 -5.7098382232881861e-01 0 0 0 +208 1 2.5000000000000000e+00 3.0000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 1.6077801357100094e-01 -8.0506391360620255e-01 -5.7098382232881872e-01 0 0 0 +228 1 2.5000000000000000e+00 3.3000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 4.6907708232882789e-01 -7.8303583820847278e-01 -4.0843795968914093e-01 0 0 0 +248 1 2.5000000000000000e+00 3.6000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 7.0472416296125839e-01 -7.0472416296125850e-01 -8.2022608329090321e-02 0 0 0 +268 1 2.5000000000000000e+00 3.9000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 7.6968694425946660e-01 -5.4725458628470514e-01 3.2877716713129729e-01 0 0 0 +288 1 2.5000000000000000e+00 4.2000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 6.5421949001862334e-01 -3.6081689881382256e-01 6.6468641058031885e-01 0 0 0 +308 1 2.5000000000000000e+00 4.5000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 4.7013886220911955e-01 -2.1357380845070770e-01 8.5636188529416402e-01 0 0 0 +328 1 2.5000000000000000e+00 4.8000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 3.0602867088565666e-01 -1.2090775615411227e-01 9.4431338394504194e-01 0 0 0 +348 1 2.5000000000000000e+00 5.1000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 1.8428174194944072e-01 -6.8709104650143099e-02 9.8046891767268962e-01 0 0 0 +368 1 2.5000000000000000e+00 5.4000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 9.7059251840902791e-02 -4.1653952417990824e-02 9.9440658177630958e-01 0 0 0 +388 1 2.5000000000000000e+00 5.7000000000000000e+01 2.1000000000000000e+01 0.0000000000000000e+00 3.0163850736159153e-02 -3.0237916900163146e-02 9.9908748890690535e-01 0 0 0 +9 1 2.5000000000000000e+00 0.0000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 -3.5058787503171387e-02 -2.0551704657275887e-02 9.9917391321755789e-01 0 0 0 +29 1 2.5000000000000000e+00 3.0000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 -1.1365104497068090e-01 -2.8752729368399281e-02 9.9310458690459180e-01 0 0 0 +49 1 2.5000000000000000e+00 6.0000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 -2.1884669159068454e-01 -4.8457456104349608e-02 9.7455528346405629e-01 0 0 0 +69 1 2.5000000000000000e+00 9.0000000000000000e+00 2.4000000000000000e+01 0.0000000000000000e+00 -3.7026717261459713e-01 -8.7191355151399724e-02 9.2482424734154478e-01 0 0 0 +89 1 2.5000000000000000e+00 1.2000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -5.7886257432716870e-01 -1.5692234237038305e-01 8.0018341554190908e-01 0 0 0 +109 1 2.5000000000000000e+00 1.5000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -8.0744368404029221e-01 -2.6598547494087144e-01 5.2657993146712301e-01 0 0 0 +129 1 2.5000000000000000e+00 1.8000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -9.1777534868081279e-01 -3.9048923819288128e-01 7.2156525757244433e-02 0 0 0 +149 1 2.5000000000000000e+00 2.1000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -7.8303583820847289e-01 -4.6907708232882789e-01 -4.0843795968914071e-01 0 0 0 +169 1 2.5000000000000000e+00 2.4000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -4.8741359543182999e-01 -4.8741359543182988e-01 -7.2446944309365668e-01 0 0 0 +189 1 2.5000000000000000e+00 2.7000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 -1.6115060626850930e-01 -4.8338466373268979e-01 -8.6044741208706443e-01 0 0 0 +209 1 2.5000000000000000e+00 3.0000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 1.6115060626850913e-01 -4.8338466373268968e-01 -8.6044741208706432e-01 0 0 0 +229 1 2.5000000000000000e+00 3.3000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 4.8741359543182988e-01 -4.8741359543182988e-01 -7.2446944309365668e-01 0 0 0 +249 1 2.5000000000000000e+00 3.6000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 7.8303583820847289e-01 -4.6907708232882789e-01 -4.0843795968914098e-01 0 0 0 +269 1 2.5000000000000000e+00 3.9000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 9.1777534868081290e-01 -3.9048923819288139e-01 7.2156525757244280e-02 0 0 0 +289 1 2.5000000000000000e+00 4.2000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 8.0744368404029232e-01 -2.6598547494087149e-01 5.2657993146712290e-01 0 0 0 +309 1 2.5000000000000000e+00 4.5000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 5.7886257432716870e-01 -1.5692234237038313e-01 8.0018341554190908e-01 0 0 0 +329 1 2.5000000000000000e+00 4.8000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 3.7026717261459713e-01 -8.7191355151399724e-02 9.2482424734154478e-01 0 0 0 +349 1 2.5000000000000000e+00 5.1000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 2.1884669159068457e-01 -4.8457456104349622e-02 9.7455528346405618e-01 0 0 0 +369 1 2.5000000000000000e+00 5.4000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 1.1365104497068097e-01 -2.8752729368399291e-02 9.9310458690459180e-01 0 0 0 +389 1 2.5000000000000000e+00 5.7000000000000000e+01 2.4000000000000000e+01 0.0000000000000000e+00 3.5058787503171436e-02 -2.0551704657275904e-02 9.9917391321755789e-01 0 0 0 +10 1 2.5000000000000000e+00 0.0000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 -3.7860607272964017e-02 -7.2971667669136089e-03 9.9925638640646097e-01 0 0 0 +30 1 2.5000000000000000e+00 3.0000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 -1.2321728304286257e-01 -1.0293413501576077e-02 9.9232633079951116e-01 0 0 0 +50 1 2.5000000000000000e+00 6.0000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 -2.3902270727461422e-01 -1.7543173966404584e-02 9.7085548999544669e-01 0 0 0 +70 1 2.5000000000000000e+00 9.0000000000000000e+00 2.7000000000000000e+01 0.0000000000000000e+00 -4.0821375936870385e-01 -3.1922103301157141e-02 9.1232806927272625e-01 0 0 0 +90 1 2.5000000000000000e+00 1.2000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -6.4295931380698856e-01 -5.7920936211537787e-02 7.6370706814669798e-01 0 0 0 +110 1 2.5000000000000000e+00 1.5000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -8.9330169771966939e-01 -9.7873033584060035e-02 4.3867179775797044e-01 0 0 0 +130 1 2.5000000000000000e+00 1.8000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -9.8714633419212094e-01 -1.3991724696158003e-01 -7.7235217962726088e-02 0 0 0 +150 1 2.5000000000000000e+00 2.1000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -8.0506391360620255e-01 -1.6077801357100097e-01 -5.7098382232881850e-01 0 0 0 +170 1 2.5000000000000000e+00 2.4000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -4.8338466373268996e-01 -1.6115060626850919e-01 -8.6044741208706443e-01 0 0 0 +190 1 2.5000000000000000e+00 2.7000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 -1.5704482464087621e-01 -1.5704482464087605e-01 -9.7502504896388853e-01 0 0 0 +210 1 2.5000000000000000e+00 3.0000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 1.5704482464087599e-01 -1.5704482464087605e-01 -9.7502504896388842e-01 0 0 0 +230 1 2.5000000000000000e+00 3.3000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 4.8338466373268973e-01 -1.6115060626850916e-01 -8.6044741208706443e-01 0 0 0 +250 1 2.5000000000000000e+00 3.6000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 8.0506391360620255e-01 -1.6077801357100097e-01 -5.7098382232881861e-01 0 0 0 +270 1 2.5000000000000000e+00 3.9000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 9.8714633419212106e-01 -1.3991724696158012e-01 -7.7235217962726269e-02 0 0 0 +290 1 2.5000000000000000e+00 4.2000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 8.9330169771966950e-01 -9.7873033584060062e-02 4.3867179775797038e-01 0 0 0 +310 1 2.5000000000000000e+00 4.5000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 6.4295931380698856e-01 -5.7920936211537821e-02 7.6370706814669798e-01 0 0 0 +330 1 2.5000000000000000e+00 4.8000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 4.0821375936870391e-01 -3.1922103301157183e-02 9.1232806927272614e-01 0 0 0 +350 1 2.5000000000000000e+00 5.1000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 2.3902270727461428e-01 -1.7543173966404597e-02 9.7085548999544657e-01 0 0 0 +370 1 2.5000000000000000e+00 5.4000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 1.2321728304286259e-01 -1.0293413501576086e-02 9.9232633079951105e-01 0 0 0 +390 1 2.5000000000000000e+00 5.7000000000000000e+01 2.7000000000000000e+01 0.0000000000000000e+00 3.7860607272964045e-02 -7.2971667669136028e-03 9.9925638640646086e-01 0 0 0 +11 1 2.5000000000000000e+00 0.0000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 -3.7860607272964017e-02 7.2971667669136028e-03 9.9925638640646086e-01 0 0 0 +31 1 2.5000000000000000e+00 3.0000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 -1.2321728304286254e-01 1.0293413501576089e-02 9.9232633079951105e-01 0 0 0 +51 1 2.5000000000000000e+00 6.0000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 -2.3902270727461422e-01 1.7543173966404594e-02 9.7085548999544657e-01 0 0 0 +71 1 2.5000000000000000e+00 9.0000000000000000e+00 3.0000000000000000e+01 0.0000000000000000e+00 -4.0821375936870374e-01 3.1922103301157183e-02 9.1232806927272625e-01 0 0 0 +91 1 2.5000000000000000e+00 1.2000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -6.4295931380698856e-01 5.7920936211537842e-02 7.6370706814669798e-01 0 0 0 +111 1 2.5000000000000000e+00 1.5000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -8.9330169771966950e-01 9.7873033584060118e-02 4.3867179775797055e-01 0 0 0 +131 1 2.5000000000000000e+00 1.8000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -9.8714633419212083e-01 1.3991724696158012e-01 -7.7235217962726102e-02 0 0 0 +151 1 2.5000000000000000e+00 2.1000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -8.0506391360620255e-01 1.6077801357100108e-01 -5.7098382232881850e-01 0 0 0 +171 1 2.5000000000000000e+00 2.4000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -4.8338466373268996e-01 1.6115060626850930e-01 -8.6044741208706443e-01 0 0 0 +191 1 2.5000000000000000e+00 2.7000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 -1.5704482464087621e-01 1.5704482464087616e-01 -9.7502504896388853e-01 0 0 0 +211 1 2.5000000000000000e+00 3.0000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 1.5704482464087602e-01 1.5704482464087616e-01 -9.7502504896388842e-01 0 0 0 +231 1 2.5000000000000000e+00 3.3000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 4.8338466373268985e-01 1.6115060626850930e-01 -8.6044741208706443e-01 0 0 0 +251 1 2.5000000000000000e+00 3.6000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 8.0506391360620266e-01 1.6077801357100105e-01 -5.7098382232881861e-01 0 0 0 +271 1 2.5000000000000000e+00 3.9000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 9.8714633419212094e-01 1.3991724696158014e-01 -7.7235217962726227e-02 0 0 0 +291 1 2.5000000000000000e+00 4.2000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 8.9330169771966950e-01 9.7873033584060118e-02 4.3867179775797049e-01 0 0 0 +311 1 2.5000000000000000e+00 4.5000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 6.4295931380698867e-01 5.7920936211537849e-02 7.6370706814669809e-01 0 0 0 +331 1 2.5000000000000000e+00 4.8000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 4.0821375936870391e-01 3.1922103301157183e-02 9.1232806927272614e-01 0 0 0 +351 1 2.5000000000000000e+00 5.1000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 2.3902270727461428e-01 1.7543173966404590e-02 9.7085548999544657e-01 0 0 0 +371 1 2.5000000000000000e+00 5.4000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 1.2321728304286261e-01 1.0293413501576086e-02 9.9232633079951116e-01 0 0 0 +391 1 2.5000000000000000e+00 5.7000000000000000e+01 3.0000000000000000e+01 0.0000000000000000e+00 3.7860607272964052e-02 7.2971667669136046e-03 9.9925638640646097e-01 0 0 0 +12 1 2.5000000000000000e+00 0.0000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 -3.5058787503171387e-02 2.0551704657275897e-02 9.9917391321755789e-01 0 0 0 +32 1 2.5000000000000000e+00 3.0000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 -1.1365104497068096e-01 2.8752729368399288e-02 9.9310458690459191e-01 0 0 0 +52 1 2.5000000000000000e+00 6.0000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 -2.1884669159068451e-01 4.8457456104349615e-02 9.7455528346405618e-01 0 0 0 +72 1 2.5000000000000000e+00 9.0000000000000000e+00 3.3000000000000000e+01 0.0000000000000000e+00 -3.7026717261459707e-01 8.7191355151399710e-02 9.2482424734154478e-01 0 0 0 +92 1 2.5000000000000000e+00 1.2000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -5.7886257432716870e-01 1.5692234237038316e-01 8.0018341554190908e-01 0 0 0 +112 1 2.5000000000000000e+00 1.5000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -8.0744368404029210e-01 2.6598547494087149e-01 5.2657993146712301e-01 0 0 0 +132 1 2.5000000000000000e+00 1.8000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -9.1777534868081267e-01 3.9048923819288134e-01 7.2156525757244433e-02 0 0 0 +152 1 2.5000000000000000e+00 2.1000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -7.8303583820847311e-01 4.6907708232882811e-01 -4.0843795968914082e-01 0 0 0 +172 1 2.5000000000000000e+00 2.4000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -4.8741359543183005e-01 4.8741359543182999e-01 -7.2446944309365657e-01 0 0 0 +192 1 2.5000000000000000e+00 2.7000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 -1.6115060626850930e-01 4.8338466373268979e-01 -8.6044741208706432e-01 0 0 0 +212 1 2.5000000000000000e+00 3.0000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 1.6115060626850916e-01 4.8338466373268979e-01 -8.6044741208706443e-01 0 0 0 +232 1 2.5000000000000000e+00 3.3000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 4.8741359543182988e-01 4.8741359543182999e-01 -7.2446944309365657e-01 0 0 0 +252 1 2.5000000000000000e+00 3.6000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 7.8303583820847278e-01 4.6907708232882794e-01 -4.0843795968914076e-01 0 0 0 +272 1 2.5000000000000000e+00 3.9000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 9.1777534868081279e-01 3.9048923819288139e-01 7.2156525757244377e-02 0 0 0 +292 1 2.5000000000000000e+00 4.2000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 8.0744368404029221e-01 2.6598547494087149e-01 5.2657993146712301e-01 0 0 0 +312 1 2.5000000000000000e+00 4.5000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 5.7886257432716870e-01 1.5692234237038316e-01 8.0018341554190908e-01 0 0 0 +332 1 2.5000000000000000e+00 4.8000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 3.7026717261459713e-01 8.7191355151399738e-02 9.2482424734154467e-01 0 0 0 +352 1 2.5000000000000000e+00 5.1000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 2.1884669159068457e-01 4.8457456104349622e-02 9.7455528346405618e-01 0 0 0 +372 1 2.5000000000000000e+00 5.4000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 1.1365104497068099e-01 2.8752729368399295e-02 9.9310458690459180e-01 0 0 0 +392 1 2.5000000000000000e+00 5.7000000000000000e+01 3.3000000000000000e+01 0.0000000000000000e+00 3.5058787503171422e-02 2.0551704657275897e-02 9.9917391321755777e-01 0 0 0 +13 1 2.5000000000000000e+00 0.0000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 -3.0163850736159126e-02 3.0237916900163156e-02 9.9908748890690546e-01 0 0 0 +33 1 2.5000000000000000e+00 3.0000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 -9.7059251840902735e-02 4.1653952417990817e-02 9.9440658177630958e-01 0 0 0 +53 1 2.5000000000000000e+00 6.0000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 -1.8428174194944066e-01 6.8709104650143071e-02 9.8046891767268973e-01 0 0 0 +73 1 2.5000000000000000e+00 9.0000000000000000e+00 3.6000000000000000e+01 0.0000000000000000e+00 -3.0602867088565661e-01 1.2090775615411221e-01 9.4431338394504194e-01 0 0 0 +93 1 2.5000000000000000e+00 1.2000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -4.7013886220911938e-01 2.1357380845070770e-01 8.5636188529416413e-01 0 0 0 +113 1 2.5000000000000000e+00 1.5000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -6.5421949001862323e-01 3.6081689881382251e-01 6.6468641058031896e-01 0 0 0 +133 1 2.5000000000000000e+00 1.8000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -7.6968694425946660e-01 5.4725458628470525e-01 3.2877716713129751e-01 0 0 0 +153 1 2.5000000000000000e+00 2.1000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -7.0472416296125850e-01 7.0472416296125850e-01 -8.2022608329090127e-02 0 0 0 +173 1 2.5000000000000000e+00 2.4000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -4.6907708232882805e-01 7.8303583820847300e-01 -4.0843795968914076e-01 0 0 0 +193 1 2.5000000000000000e+00 2.7000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 -1.6077801357100108e-01 8.0506391360620244e-01 -5.7098382232881861e-01 0 0 0 +213 1 2.5000000000000000e+00 3.0000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 1.6077801357100091e-01 8.0506391360620277e-01 -5.7098382232881861e-01 0 0 0 +233 1 2.5000000000000000e+00 3.3000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 4.6907708232882794e-01 7.8303583820847300e-01 -4.0843795968914076e-01 0 0 0 +253 1 2.5000000000000000e+00 3.6000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 7.0472416296125850e-01 7.0472416296125850e-01 -8.2022608329090210e-02 0 0 0 +273 1 2.5000000000000000e+00 3.9000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 7.6968694425946649e-01 5.4725458628470525e-01 3.2877716713129740e-01 0 0 0 +293 1 2.5000000000000000e+00 4.2000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 6.5421949001862323e-01 3.6081689881382251e-01 6.6468641058031896e-01 0 0 0 +313 1 2.5000000000000000e+00 4.5000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 4.7013886220911949e-01 2.1357380845070775e-01 8.5636188529416413e-01 0 0 0 +333 1 2.5000000000000000e+00 4.8000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 3.0602867088565661e-01 1.2090775615411223e-01 9.4431338394504194e-01 0 0 0 +353 1 2.5000000000000000e+00 5.1000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 1.8428174194944069e-01 6.8709104650143099e-02 9.8046891767268973e-01 0 0 0 +373 1 2.5000000000000000e+00 5.4000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 9.7059251840902763e-02 4.1653952417990830e-02 9.9440658177630947e-01 0 0 0 +393 1 2.5000000000000000e+00 5.7000000000000000e+01 3.6000000000000000e+01 0.0000000000000000e+00 3.0163850736159133e-02 3.0237916900163159e-02 9.9908748890690535e-01 0 0 0 +14 1 2.5000000000000000e+00 0.0000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 -2.4270277420221101e-02 3.5235119566844240e-02 9.9908430073895960e-01 0 0 0 +34 1 2.5000000000000000e+00 3.0000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 -7.7312985281705854e-02 4.7535409319668036e-02 9.9587302763336372e-01 0 0 0 +54 1 2.5000000000000000e+00 6.0000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 -1.4398087111736474e-01 7.6126593015943766e-02 9.8664798717073854e-01 0 0 0 +74 1 2.5000000000000000e+00 9.0000000000000000e+00 3.9000000000000000e+01 0.0000000000000000e+00 -2.3284022614534142e-01 1.2975986317850727e-01 9.6381938504912923e-01 0 0 0 +94 1 2.5000000000000000e+00 1.2000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -3.4758786972735517e-01 2.2234110900479689e-01 9.1090455266450199e-01 0 0 0 +114 1 2.5000000000000000e+00 1.5000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -4.7476254409897917e-01 3.6852592591640326e-01 7.9924287212844314e-01 0 0 0 +134 1 2.5000000000000000e+00 1.8000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -5.6571145299922609e-01 5.6571145299922598e-01 5.9995091790163058e-01 0 0 0 +154 1 2.5000000000000000e+00 2.1000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -5.4725458628470514e-01 7.6968694425946649e-01 3.2877716713129751e-01 0 0 0 +174 1 2.5000000000000000e+00 2.4000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -3.9048923819288139e-01 9.1777534868081279e-01 7.2156525757244475e-02 0 0 0 +194 1 2.5000000000000000e+00 2.7000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 -1.3991724696158014e-01 9.8714633419212094e-01 -7.7235217962726074e-02 0 0 0 +214 1 2.5000000000000000e+00 3.0000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 1.3991724696158006e-01 9.8714633419212106e-01 -7.7235217962726074e-02 0 0 0 +234 1 2.5000000000000000e+00 3.3000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 3.9048923819288128e-01 9.1777534868081290e-01 7.2156525757244516e-02 0 0 0 +254 1 2.5000000000000000e+00 3.6000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 5.4725458628470502e-01 7.6968694425946649e-01 3.2877716713129757e-01 0 0 0 +274 1 2.5000000000000000e+00 3.9000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 5.6571145299922598e-01 5.6571145299922598e-01 5.9995091790163058e-01 0 0 0 +294 1 2.5000000000000000e+00 4.2000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 4.7476254409897917e-01 3.6852592591640337e-01 7.9924287212844292e-01 0 0 0 +314 1 2.5000000000000000e+00 4.5000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 3.4758786972735523e-01 2.2234110900479689e-01 9.1090455266450188e-01 0 0 0 +334 1 2.5000000000000000e+00 4.8000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 2.3284022614534150e-01 1.2975986317850730e-01 9.6381938504912923e-01 0 0 0 +354 1 2.5000000000000000e+00 5.1000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 1.4398087111736474e-01 7.6126593015943780e-02 9.8664798717073843e-01 0 0 0 +374 1 2.5000000000000000e+00 5.4000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 7.7312985281705868e-02 4.7535409319668070e-02 9.9587302763336383e-01 0 0 0 +394 1 2.5000000000000000e+00 5.7000000000000000e+01 3.9000000000000000e+01 0.0000000000000000e+00 2.4270277420221108e-02 3.5235119566844240e-02 9.9908430073895971e-01 0 0 0 +15 1 2.5000000000000000e+00 0.0000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 -1.8429703183501411e-02 3.5634992015801829e-02 9.9919492261750498e-01 0 0 0 +35 1 2.5000000000000000e+00 3.0000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 -5.8031121465001799e-02 4.6947676140268450e-02 9.9721026100143129e-01 0 0 0 +55 1 2.5000000000000000e+00 6.0000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 -1.0567933713226436e-01 7.2649992877525812e-02 9.9174283775491956e-01 0 0 0 +75 1 2.5000000000000000e+00 9.0000000000000000e+00 4.2000000000000000e+01 0.0000000000000000e+00 -1.6561310406555052e-01 1.1922421797550635e-01 9.7895755046370747e-01 0 0 0 +95 1 2.5000000000000000e+00 1.2000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -2.3830565311068272e-01 1.9646003525323200e-01 9.5111191257590177e-01 0 0 0 +115 1 2.5000000000000000e+00 1.5000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -3.1460569929723275e-01 3.1460569929723275e-01 8.9557049300398384e-01 0 0 0 +135 1 2.5000000000000000e+00 1.8000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -3.6852592591640337e-01 4.7476254409897900e-01 7.9924287212844303e-01 0 0 0 +155 1 2.5000000000000000e+00 2.1000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -3.6081689881382245e-01 6.5421949001862312e-01 6.6468641058031908e-01 0 0 0 +175 1 2.5000000000000000e+00 2.4000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -2.6598547494087144e-01 8.0744368404029221e-01 5.2657993146712301e-01 0 0 0 +195 1 2.5000000000000000e+00 2.7000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 -9.7873033584060104e-02 8.9330169771966939e-01 4.3867179775797061e-01 0 0 0 +215 1 2.5000000000000000e+00 3.0000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 9.7873033584060048e-02 8.9330169771966939e-01 4.3867179775797061e-01 0 0 0 +235 1 2.5000000000000000e+00 3.3000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 2.6598547494087144e-01 8.0744368404029221e-01 5.2657993146712312e-01 0 0 0 +255 1 2.5000000000000000e+00 3.6000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 3.6081689881382245e-01 6.5421949001862323e-01 6.6468641058031908e-01 0 0 0 +275 1 2.5000000000000000e+00 3.9000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 3.6852592591640332e-01 4.7476254409897917e-01 7.9924287212844303e-01 0 0 0 +295 1 2.5000000000000000e+00 4.2000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 3.1460569929723275e-01 3.1460569929723275e-01 8.9557049300398373e-01 0 0 0 +315 1 2.5000000000000000e+00 4.5000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 2.3830565311068272e-01 1.9646003525323200e-01 9.5111191257590177e-01 0 0 0 +335 1 2.5000000000000000e+00 4.8000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 1.6561310406555046e-01 1.1922421797550636e-01 9.7895755046370747e-01 0 0 0 +355 1 2.5000000000000000e+00 5.1000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 1.0567933713226434e-01 7.2649992877525826e-02 9.9174283775491967e-01 0 0 0 +375 1 2.5000000000000000e+00 5.4000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 5.8031121465001792e-02 4.6947676140268464e-02 9.9721026100143140e-01 0 0 0 +395 1 2.5000000000000000e+00 5.7000000000000000e+01 4.2000000000000000e+01 0.0000000000000000e+00 1.8429703183501421e-02 3.5634992015801836e-02 9.9919492261750509e-01 0 0 0 +16 1 2.5000000000000000e+00 0.0000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 -1.3362272507461697e-02 3.2364838887478299e-02 9.9938679542868891e-01 0 0 0 +36 1 2.5000000000000000e+00 3.0000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 -4.1569375222726877e-02 4.1631298256624177e-02 9.9826791095830592e-01 0 0 0 +56 1 2.5000000000000000e+00 6.0000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 -7.3954811425103587e-02 6.2196104012276252e-02 9.9532021506285684e-01 0 0 0 +76 1 2.5000000000000000e+00 9.0000000000000000e+00 4.5000000000000000e+01 0.0000000000000000e+00 -1.1214098437153222e-01 9.8127311868331527e-02 9.8883539089662387e-01 0 0 0 +96 1 2.5000000000000000e+00 1.2000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -1.5508313718777622e-01 1.5508313718777625e-01 9.7565282817198595e-01 0 0 0 +116 1 2.5000000000000000e+00 1.5000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -1.9646003525323200e-01 2.3830565311068266e-01 9.5111191257590189e-01 0 0 0 +136 1 2.5000000000000000e+00 1.8000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -2.2234110900479692e-01 3.4758786972735517e-01 9.1090455266450188e-01 0 0 0 +156 1 2.5000000000000000e+00 2.1000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -2.1357380845070770e-01 4.7013886220911938e-01 8.5636188529416413e-01 0 0 0 +176 1 2.5000000000000000e+00 2.4000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -1.5692234237038313e-01 5.7886257432716870e-01 8.0018341554190919e-01 0 0 0 +196 1 2.5000000000000000e+00 2.7000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 -5.7920936211537842e-02 6.4295931380698867e-01 7.6370706814669809e-01 0 0 0 +216 1 2.5000000000000000e+00 3.0000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 5.7920936211537780e-02 6.4295931380698856e-01 7.6370706814669798e-01 0 0 0 +236 1 2.5000000000000000e+00 3.3000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.5692234237038313e-01 5.7886257432716870e-01 8.0018341554190919e-01 0 0 0 +256 1 2.5000000000000000e+00 3.6000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 2.1357380845070764e-01 4.7013886220911938e-01 8.5636188529416402e-01 0 0 0 +276 1 2.5000000000000000e+00 3.9000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 2.2234110900479681e-01 3.4758786972735523e-01 9.1090455266450177e-01 0 0 0 +296 1 2.5000000000000000e+00 4.2000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.9646003525323197e-01 2.3830565311068272e-01 9.5111191257590177e-01 0 0 0 +316 1 2.5000000000000000e+00 4.5000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.5508313718777625e-01 1.5508313718777628e-01 9.7565282817198595e-01 0 0 0 +336 1 2.5000000000000000e+00 4.8000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.1214098437153222e-01 9.8127311868331568e-02 9.8883539089662398e-01 0 0 0 +356 1 2.5000000000000000e+00 5.1000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 7.3954811425103573e-02 6.2196104012276258e-02 9.9532021506285684e-01 0 0 0 +376 1 2.5000000000000000e+00 5.4000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 4.1569375222726877e-02 4.1631298256624191e-02 9.9826791095830603e-01 0 0 0 +396 1 2.5000000000000000e+00 5.7000000000000000e+01 4.5000000000000000e+01 0.0000000000000000e+00 1.3362272507461703e-02 3.2364838887478306e-02 9.9938679542868891e-01 0 0 0 +17 1 2.5000000000000000e+00 0.0000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 -9.3989438861432541e-03 2.6644762521588483e-02 9.9960077855311480e-01 0 0 0 +37 1 2.5000000000000000e+00 3.0000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 -2.8894018478272422e-02 3.3534698701154803e-02 9.9901979944303410e-01 0 0 0 +57 1 2.5000000000000000e+00 6.0000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 -5.0241530269051239e-02 4.8498220596720300e-02 9.9755887607457838e-01 0 0 0 +77 1 2.5000000000000000e+00 9.0000000000000000e+00 4.8000000000000000e+01 0.0000000000000000e+00 -7.3771080474423129e-02 7.3771080474423115e-02 9.9454293792237680e-01 0 0 0 +97 1 2.5000000000000000e+00 1.2000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -9.8127311868331568e-02 1.1214098437153222e-01 9.8883539089662398e-01 0 0 0 +117 1 2.5000000000000000e+00 1.5000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -1.1922421797550634e-01 1.6561310406555049e-01 9.7895755046370736e-01 0 0 0 +137 1 2.5000000000000000e+00 1.8000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -1.2975986317850727e-01 2.3284022614534133e-01 9.6381938504912912e-01 0 0 0 +157 1 2.5000000000000000e+00 2.1000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -1.2090775615411221e-01 3.0602867088565655e-01 9.4431338394504194e-01 0 0 0 +177 1 2.5000000000000000e+00 2.4000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -8.7191355151399738e-02 3.7026717261459713e-01 9.2482424734154467e-01 0 0 0 +197 1 2.5000000000000000e+00 2.7000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 -3.1922103301157183e-02 4.0821375936870380e-01 9.1232806927272625e-01 0 0 0 +217 1 2.5000000000000000e+00 3.0000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 3.1922103301157141e-02 4.0821375936870391e-01 9.1232806927272625e-01 0 0 0 +237 1 2.5000000000000000e+00 3.3000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 8.7191355151399710e-02 3.7026717261459707e-01 9.2482424734154489e-01 0 0 0 +257 1 2.5000000000000000e+00 3.6000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 1.2090775615411221e-01 3.0602867088565661e-01 9.4431338394504205e-01 0 0 0 +277 1 2.5000000000000000e+00 3.9000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 1.2975986317850727e-01 2.3284022614534139e-01 9.6381938504912912e-01 0 0 0 +297 1 2.5000000000000000e+00 4.2000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 1.1922421797550634e-01 1.6561310406555052e-01 9.7895755046370747e-01 0 0 0 +317 1 2.5000000000000000e+00 4.5000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 9.8127311868331568e-02 1.1214098437153222e-01 9.8883539089662398e-01 0 0 0 +337 1 2.5000000000000000e+00 4.8000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 7.3771080474423115e-02 7.3771080474423129e-02 9.9454293792237680e-01 0 0 0 +357 1 2.5000000000000000e+00 5.1000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 5.0241530269051225e-02 4.8498220596720300e-02 9.9755887607457838e-01 0 0 0 +377 1 2.5000000000000000e+00 5.4000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 2.8894018478272426e-02 3.3534698701154796e-02 9.9901979944303410e-01 0 0 0 +397 1 2.5000000000000000e+00 5.7000000000000000e+01 4.8000000000000000e+01 0.0000000000000000e+00 9.3989438861432593e-03 2.6644762521588490e-02 9.9960077855311480e-01 0 0 0 +18 1 2.5000000000000000e+00 0.0000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 -6.5828744882500166e-03 1.9561861499557524e-02 9.9978697697966856e-01 0 0 0 +38 1 2.5000000000000000e+00 3.0000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 -2.0009637034407939e-02 2.4184841732588204e-02 9.9950723251816498e-01 0 0 0 +58 1 2.5000000000000000e+00 6.0000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 -3.4047077037887570e-02 3.4047077037887563e-02 9.9884012388887966e-01 0 0 0 +78 1 2.5000000000000000e+00 9.0000000000000000e+00 5.1000000000000000e+01 0.0000000000000000e+00 -4.8498220596720300e-02 5.0241530269051239e-02 9.9755887607457827e-01 0 0 0 +98 1 2.5000000000000000e+00 1.2000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -6.2196104012276252e-02 7.3954811425103573e-02 9.9532021506285684e-01 0 0 0 +118 1 2.5000000000000000e+00 1.5000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -7.2649992877525812e-02 1.0567933713226434e-01 9.9174283775491956e-01 0 0 0 +138 1 2.5000000000000000e+00 1.8000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -7.6126593015943753e-02 1.4398087111736468e-01 9.8664798717073843e-01 0 0 0 +158 1 2.5000000000000000e+00 2.1000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -6.8709104650143085e-02 1.8428174194944066e-01 9.8046891767268962e-01 0 0 0 +178 1 2.5000000000000000e+00 2.4000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -4.8457456104349608e-02 2.1884669159068451e-01 9.7455528346405618e-01 0 0 0 +198 1 2.5000000000000000e+00 2.7000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 -1.7543173966404604e-02 2.3902270727461422e-01 9.7085548999544669e-01 0 0 0 +218 1 2.5000000000000000e+00 3.0000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 1.7543173966404566e-02 2.3902270727461419e-01 9.7085548999544657e-01 0 0 0 +238 1 2.5000000000000000e+00 3.3000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 4.8457456104349608e-02 2.1884669159068451e-01 9.7455528346405618e-01 0 0 0 +258 1 2.5000000000000000e+00 3.6000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 6.8709104650143071e-02 1.8428174194944066e-01 9.8046891767268962e-01 0 0 0 +278 1 2.5000000000000000e+00 3.9000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 7.6126593015943766e-02 1.4398087111736474e-01 9.8664798717073843e-01 0 0 0 +298 1 2.5000000000000000e+00 4.2000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 7.2649992877525799e-02 1.0567933713226434e-01 9.9174283775491956e-01 0 0 0 +318 1 2.5000000000000000e+00 4.5000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 6.2196104012276245e-02 7.3954811425103587e-02 9.9532021506285684e-01 0 0 0 +338 1 2.5000000000000000e+00 4.8000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 4.8498220596720293e-02 5.0241530269051232e-02 9.9755887607457827e-01 0 0 0 +358 1 2.5000000000000000e+00 5.1000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 3.4047077037887570e-02 3.4047077037887570e-02 9.9884012388887977e-01 0 0 0 +378 1 2.5000000000000000e+00 5.4000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 2.0009637034407935e-02 2.4184841732588200e-02 9.9950723251816487e-01 0 0 0 +398 1 2.5000000000000000e+00 5.7000000000000000e+01 5.1000000000000000e+01 0.0000000000000000e+00 6.5828744882500193e-03 1.9561861499557524e-02 9.9978697697966856e-01 0 0 0 +19 1 2.5000000000000000e+00 0.0000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 -4.8145058779812486e-03 1.1868011343002475e-02 9.9991798205648519e-01 0 0 0 +39 1 2.5000000000000000e+00 3.0000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 -1.4489047587394143e-02 1.4489047587394136e-02 9.9979004545955585e-01 0 0 0 +59 1 2.5000000000000000e+00 6.0000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 -2.4184841732588200e-02 2.0009637034407932e-02 9.9950723251816498e-01 0 0 0 +79 1 2.5000000000000000e+00 9.0000000000000000e+00 5.4000000000000000e+01 0.0000000000000000e+00 -3.3534698701154803e-02 2.8894018478272433e-02 9.9901979944303421e-01 0 0 0 +99 1 2.5000000000000000e+00 1.2000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -4.1631298256624205e-02 4.1569375222726870e-02 9.9826791095830603e-01 0 0 0 +119 1 2.5000000000000000e+00 1.5000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -4.6947676140268450e-02 5.8031121465001771e-02 9.9721026100143129e-01 0 0 0 +139 1 2.5000000000000000e+00 1.8000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -4.7535409319668043e-02 7.7312985281705840e-02 9.9587302763336372e-01 0 0 0 +159 1 2.5000000000000000e+00 2.1000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -4.1653952417990810e-02 9.7059251840902694e-02 9.9440658177630958e-01 0 0 0 +179 1 2.5000000000000000e+00 2.4000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -2.8752729368399278e-02 1.1365104497068095e-01 9.9310458690459180e-01 0 0 0 +199 1 2.5000000000000000e+00 2.7000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 -1.0293413501576094e-02 1.2321728304286254e-01 9.9232633079951105e-01 0 0 0 +219 1 2.5000000000000000e+00 3.0000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 1.0293413501576077e-02 1.2321728304286257e-01 9.9232633079951116e-01 0 0 0 +239 1 2.5000000000000000e+00 3.3000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 2.8752729368399284e-02 1.1365104497068095e-01 9.9310458690459180e-01 0 0 0 +259 1 2.5000000000000000e+00 3.6000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.1653952417990817e-02 9.7059251840902749e-02 9.9440658177630958e-01 0 0 0 +279 1 2.5000000000000000e+00 3.9000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.7535409319668036e-02 7.7312985281705868e-02 9.9587302763336383e-01 0 0 0 +299 1 2.5000000000000000e+00 4.2000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.6947676140268443e-02 5.8031121465001785e-02 9.9721026100143129e-01 0 0 0 +319 1 2.5000000000000000e+00 4.5000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.1631298256624191e-02 4.1569375222726877e-02 9.9826791095830603e-01 0 0 0 +339 1 2.5000000000000000e+00 4.8000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 3.3534698701154803e-02 2.8894018478272433e-02 9.9901979944303410e-01 0 0 0 +359 1 2.5000000000000000e+00 5.1000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 2.4184841732588204e-02 2.0009637034407932e-02 9.9950723251816498e-01 0 0 0 +379 1 2.5000000000000000e+00 5.4000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 1.4489047587394145e-02 1.4489047587394140e-02 9.9979004545955585e-01 0 0 0 +399 1 2.5000000000000000e+00 5.7000000000000000e+01 5.4000000000000000e+01 0.0000000000000000e+00 4.8145058779812486e-03 1.1868011343002480e-02 9.9991798205648519e-01 0 0 0 +20 1 2.5000000000000000e+00 0.0000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 -3.9693242391277937e-03 3.9693242391277764e-03 9.9998424434096445e-01 0 0 0 +40 1 2.5000000000000000e+00 3.0000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 -1.1868011343002482e-02 4.8145058779812460e-03 9.9991798205648519e-01 0 0 0 +60 1 2.5000000000000000e+00 6.0000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 -1.9561861499557517e-02 6.5828744882500097e-03 9.9978697697966856e-01 0 0 0 +80 1 2.5000000000000000e+00 9.0000000000000000e+00 5.7000000000000000e+01 0.0000000000000000e+00 -2.6644762521588487e-02 9.3989438861432437e-03 9.9960077855311491e-01 0 0 0 +100 1 2.5000000000000000e+00 1.2000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -3.2364838887478306e-02 1.3362272507461690e-02 9.9938679542868891e-01 0 0 0 +120 1 2.5000000000000000e+00 1.5000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -3.5634992015801822e-02 1.8429703183501404e-02 9.9919492261750509e-01 0 0 0 +140 1 2.5000000000000000e+00 1.8000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -3.5235119566844240e-02 2.4270277420221090e-02 9.9908430073895971e-01 0 0 0 +160 1 2.5000000000000000e+00 2.1000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -3.0237916900163146e-02 3.0163850736159105e-02 9.9908748890690546e-01 0 0 0 +180 1 2.5000000000000000e+00 2.4000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -2.0551704657275894e-02 3.5058787503171394e-02 9.9917391321755789e-01 0 0 0 +200 1 2.5000000000000000e+00 2.7000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 -7.2971667669136028e-03 3.7860607272964010e-02 9.9925638640646086e-01 0 0 0 +220 1 2.5000000000000000e+00 3.0000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 7.2971667669136037e-03 3.7860607272964024e-02 9.9925638640646097e-01 0 0 0 +240 1 2.5000000000000000e+00 3.3000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 2.0551704657275890e-02 3.5058787503171394e-02 9.9917391321755777e-01 0 0 0 +260 1 2.5000000000000000e+00 3.6000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.0237916900163159e-02 3.0163850736159115e-02 9.9908748890690535e-01 0 0 0 +280 1 2.5000000000000000e+00 3.9000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.5235119566844234e-02 2.4270277420221094e-02 9.9908430073895960e-01 0 0 0 +300 1 2.5000000000000000e+00 4.2000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.5634992015801836e-02 1.8429703183501414e-02 9.9919492261750498e-01 0 0 0 +320 1 2.5000000000000000e+00 4.5000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.2364838887478299e-02 1.3362272507461701e-02 9.9938679542868891e-01 0 0 0 +340 1 2.5000000000000000e+00 4.8000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 2.6644762521588480e-02 9.3989438861432611e-03 9.9960077855311480e-01 0 0 0 +360 1 2.5000000000000000e+00 5.1000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 1.9561861499557527e-02 6.5828744882500097e-03 9.9978697697966845e-01 0 0 0 +380 1 2.5000000000000000e+00 5.4000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 1.1868011343002492e-02 4.8145058779812391e-03 9.9991798205648519e-01 0 0 0 +400 1 2.5000000000000000e+00 5.7000000000000000e+01 5.7000000000000000e+01 0.0000000000000000e+00 3.9693242391277937e-03 3.9693242391277851e-03 9.9998424434096445e-01 0 0 0 + +Velocities + +1 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +21 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +41 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +61 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +81 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +101 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +121 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +141 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +161 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +181 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +201 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +221 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +241 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +261 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +281 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +301 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +321 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +341 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +361 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +381 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +2 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +22 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +42 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +62 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +82 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +102 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +122 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +142 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +162 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +182 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +202 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +222 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +242 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +262 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +282 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +302 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +322 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +342 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +362 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +382 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +3 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +23 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +43 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +63 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +83 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +103 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +123 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +143 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +163 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +183 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +203 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +223 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +243 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +263 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +283 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +303 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +323 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +343 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +363 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +383 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +4 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +24 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +44 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +64 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +84 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +104 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +124 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +144 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +164 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +184 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +204 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +224 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +244 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +264 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +284 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +304 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +324 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +344 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +364 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +384 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +5 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +25 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +45 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +65 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +85 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +105 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +125 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +145 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +165 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +185 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +205 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +225 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +245 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +265 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +285 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +305 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +325 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +345 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +365 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +385 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +6 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +26 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +46 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +66 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +86 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +106 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +126 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +146 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +166 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +186 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +206 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +226 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +246 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +266 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +286 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +306 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +326 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +346 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +366 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +386 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +7 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +27 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +47 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +67 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +87 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +107 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +127 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +147 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +167 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +187 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +207 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +227 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +247 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +267 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +287 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +307 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +327 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +347 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +367 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +387 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +8 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +28 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +48 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +68 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +88 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +108 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +128 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +148 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +168 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +188 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +208 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +228 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +248 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +268 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +288 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +308 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +328 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +348 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +368 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +388 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +9 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +29 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +49 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +69 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +89 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +109 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +129 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +149 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +169 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +189 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +209 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +229 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +249 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +269 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +289 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +309 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +329 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +349 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +369 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +389 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +10 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +30 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +50 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +70 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +90 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +110 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +130 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +150 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +170 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +190 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +210 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +230 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +250 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +270 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +290 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +310 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +330 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +350 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +370 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +390 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +11 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +31 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +51 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +71 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +91 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +111 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +131 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +151 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +171 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +191 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +211 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +231 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +251 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +271 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +291 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +311 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +331 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +351 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +371 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +391 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +12 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +32 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +52 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +72 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +92 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +112 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +132 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +152 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +172 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +192 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +212 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +232 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +252 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +272 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +292 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +312 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +332 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +352 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +372 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +392 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +13 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +33 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +53 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +73 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +93 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +113 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +133 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +153 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +173 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +193 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +213 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +233 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +253 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +273 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +293 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +313 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +333 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +353 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +373 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +393 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +14 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +34 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +54 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +74 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +94 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +114 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +134 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +154 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +174 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +194 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +214 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +234 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +254 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +274 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +294 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +314 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +334 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +354 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +374 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +394 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +15 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +35 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +55 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +75 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +95 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +115 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +135 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +155 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +175 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +195 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +215 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +235 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +255 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +275 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +295 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +315 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +335 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +355 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +375 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +395 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +16 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +36 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +56 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +76 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +96 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +116 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +136 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +156 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +176 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +196 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +216 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +236 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +256 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +276 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +296 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +316 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +336 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +356 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +376 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +396 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +17 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +37 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +57 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +77 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +97 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +117 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +137 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +157 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +177 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +197 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +217 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +237 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +257 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +277 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +297 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +317 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +337 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +357 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +377 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +397 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +18 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +38 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +58 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +78 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +98 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +118 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +138 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +158 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +178 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +198 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +218 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +238 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +258 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +278 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +298 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +318 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +338 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +358 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +378 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +398 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +19 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +39 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +59 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +79 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +99 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +119 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +139 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +159 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +179 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +199 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +219 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +239 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +259 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +279 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +299 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +319 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +339 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +359 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +379 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +399 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +20 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +40 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +60 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +80 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +100 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +120 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +140 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +160 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +180 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +200 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +220 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +240 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +260 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +280 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +300 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +320 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +340 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +360 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +380 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 +400 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 5dcd27ef2b..d981962a70 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -283,7 +283,7 @@ void NEB_spin::run() fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " - "GradV0dottan ... GradVNdottan\n"); + "GradV0dottan DN0 ... GradVNdottan DNN\n"); } else { fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " @@ -296,7 +296,7 @@ void NEB_spin::run() fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " - "GradV0dottan ... GradVNdottan\n"); + "GradV0dottan DN0 ... GradVNdottan DNN\n"); } else { fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT RD1 PE1 RD2 PE2 ... " @@ -368,7 +368,7 @@ void NEB_spin::run() fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " - "GradV0dottan ... GradVNdottan\n"); + "GradV0dottan DN0... GradVNdottan DNN\n"); } else { fprintf(uscreen,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc " @@ -381,7 +381,7 @@ void NEB_spin::run() fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc EBF EBR RDT " "RD1 PE1 RD2 PE2 ... RDN PEN " - "GradV0dottan ... GradVNdottan\n"); + "GradV0dottan DN0 ... GradVNdottan DNN\n"); } else { fprintf(ulogfile,"Step MaxReplicaTorque MaxAtomTorque " "GradV0 GradV1 GradVc " @@ -873,8 +873,9 @@ void NEB_spin::print_status() for (int i = 0; i < nreplica; i++) fprintf(uscreen,"%12.8g %12.8g ",rdist[i],all[i][0]); if (verbose) { - for (int i = 0; i < nreplica; i++) - fprintf(uscreen,"%12.8g ",all[i][5]); + for (int i = 0; i < nreplica-1; i++) + fprintf(uscreen,"%12.8g %12.8g ",all[i][2],all[i][5]); + fprintf(uscreen,"%12.8g %12.8g ",NAN,all[nreplica-1][5]); } fprintf(uscreen,"\n"); } @@ -888,8 +889,9 @@ void NEB_spin::print_status() for (int i = 0; i < nreplica; i++) fprintf(ulogfile,"%12.8g %12.8g ",rdist[i],all[i][0]); if (verbose) { - for (int i = 0; i < nreplica; i++) - fprintf(ulogfile,"%12.8g ",all[i][5]); + for (int i = 0; i < nreplica-1; i++) + fprintf(ulogfile,"%12.8g %12.8g ",all[i][2],all[i][5]); + fprintf(ulogfile,"%12.8g %12.8g ",NAN,all[nreplica-1][5]); } fprintf(ulogfile,"\n"); fflush(ulogfile); From b1badb6555f595d5bd8a44597ed2a18552b1ef26 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Mon, 1 Apr 2019 22:09:58 -0400 Subject: [PATCH 0406/1242] 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 0407/1242] 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 0408/1242] 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 0409/1242] 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 d3ea115436d0f795b2b6a7a369558fd15cc0a5c7 Mon Sep 17 00:00:00 2001 From: "Dan S. Bolintineanu" Date: Mon, 1 Apr 2019 22:13:49 -0600 Subject: [PATCH 0410/1242] Tweaks to doc page --- doc/src/pair_granular.txt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/doc/src/pair_granular.txt b/doc/src/pair_granular.txt index 7a58435a83..fc235ed301 100644 --- a/doc/src/pair_granular.txt +++ b/doc/src/pair_granular.txt @@ -346,16 +346,17 @@ 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. 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: +see discussion above. To match the Mindlin solution, one should set \(k_t = 8G^*\), where +\(G^*\) is the effective shear modulus, which relates to material properties according to: + \begin\{equation\} -1/G = 2(2-\nu_i)(1+\nu_i)/E_i + 2(2-\nu_j)(1+\nu_j)/E_j +1/G^* = 2(2-\nu_i)(1+\nu_i)/E_i + 2(2-\nu_j)(1+\nu_j)/E_j \end\{equation\} +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}). + 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\} From d1cb8970d541c9e2c85e778fea0d1114a5175d92 Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Tue, 2 Apr 2019 09:29:27 +0300 Subject: [PATCH 0411/1242] fix elstop: Remove unused includes --- src/USER-MISC/fix_elstop.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/USER-MISC/fix_elstop.cpp b/src/USER-MISC/fix_elstop.cpp index 842c2f4e1a..ac73753a62 100644 --- a/src/USER-MISC/fix_elstop.cpp +++ b/src/USER-MISC/fix_elstop.cpp @@ -27,10 +27,7 @@ #include "region.h" #include "group.h" #include "force.h" -#include "pair.h" #include "fix.h" -#include "compute.h" -#include "modify.h" #include "memory.h" #include "comm.h" #include "error.h" From 91f3a948510bf75128c8765e5aa28fee6b6bc4d6 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Tue, 2 Apr 2019 05:49:25 -0400 Subject: [PATCH 0412/1242] 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 0413/1242] 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 0414/1242] 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 0415/1242] 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 0416/1242] 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 0417/1242] 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 0418/1242] 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 0419/1242] 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 0420/1242] 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 0421/1242] 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 0422/1242] 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 0423/1242] 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 0424/1242] 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 0425/1242] 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 0426/1242] 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 0427/1242] 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 0428/1242] 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 0429/1242] 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 0430/1242] 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 0431/1242] 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 0432/1242] 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 0433/1242] 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 0434/1242] 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 0435/1242] 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 0436/1242] 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 0437/1242] 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 0438/1242] 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 0439/1242] 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 0440/1242] 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 From f2f49e60bf42dd1ce1391e69c747c478fc03f288 Mon Sep 17 00:00:00 2001 From: mkanski Date: Wed, 3 Apr 2019 18:12:12 +0200 Subject: [PATCH 0441/1242] Make some errors more elaborate + change some error->all to error->one --- src/USER-REAXC/pair_reaxc.cpp | 1 + src/USER-REAXC/reaxc_ffield.cpp | 17 +++++++++++------ src/USER-REAXC/reaxc_forces.cpp | 2 +- src/USER-REAXC/reaxc_init_md.cpp | 29 +++++++---------------------- src/USER-REAXC/reaxc_list.cpp | 2 +- src/USER-REAXC/reaxc_tool_box.cpp | 6 +++--- src/USER-REAXC/reaxc_traj.cpp | 4 ++-- src/USER-REAXC/reaxc_types.h | 6 ++---- 8 files changed, 28 insertions(+), 39 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 8b36019881..18e7ef2f04 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -431,6 +431,7 @@ void PairReaxC::setup( ) int *num_hbonds = fix_reax->num_hbonds; control->vlist_cut = neighbor->cutneighmax; + control->me = comm->me; // determine the local and total capacity diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 36b7105ce8..13e928ad08 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -61,7 +61,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, n = atoi(tmp[0]); if (n < 1) { if (me == 0) - control->error_ptr->warning( FLERR, "Number of globals in ffield file is 0" ); + control->error_ptr->warning( FLERR, "Number of globals in ffield file is 0. The file will not be read." ); fclose(fp); free(s); free(tmp); @@ -141,6 +141,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, reax->gp.vdw_type = 0; + char errmsg[1024]; for( i = 0; i < reax->num_atom_types; i++ ) { /* line one */ @@ -152,7 +153,8 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); if (c < 9) { - control->error_ptr->all(FLERR,"Inconsistent ffield file"); + snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); + control->error_ptr->all(FLERR, errmsg); } for( j = 0; j < (int)(strlen(tmp[0])); ++j ) @@ -174,7 +176,8 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - control->error_ptr->all(FLERR,"Inconsistent ffield file"); + snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); + control->error_ptr->all(FLERR, errmsg); } val = atof(tmp[0]); reax->sbp[i].alpha = val; @@ -192,7 +195,8 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - control->error_ptr->all(FLERR,"Inconsistent ffield file"); + snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); + control->error_ptr->all(FLERR, errmsg); } val = atof(tmp[0]); reax->sbp[i].r_pi_pi = val; @@ -210,7 +214,8 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity check */ if (c < 8) { - control->error_ptr->all(FLERR,"Inconsistent ffield file"); + snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); + control->error_ptr->all(FLERR, errmsg); } val = atof(tmp[0]); reax->sbp[i].p_ovun2 = val; @@ -287,7 +292,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, } } else { char errmsg[256]; - snprintf(errmsg, 256, "Inconsistent vdWaals-parameters " + snprintf(errmsg, 256, "Inconsistent vdWaals-parameters: " "No shielding or inner-wall set for element %s", reax->sbp[i].name); control->error_ptr->all(FLERR, errmsg); diff --git a/src/USER-REAXC/reaxc_forces.cpp b/src/USER-REAXC/reaxc_forces.cpp index 8c602e9156..186cde681a 100644 --- a/src/USER-REAXC/reaxc_forces.cpp +++ b/src/USER-REAXC/reaxc_forces.cpp @@ -168,7 +168,7 @@ void Validate_Lists( reax_system *system, storage * /*workspace*/, reax_list **l char errmsg[256]; snprintf(errmsg, 256, "step%d-hbondchk failed: H=%d end(H)=%d str(H+1)=%d\n", step, Hindex, End_Index(Hindex,hbonds), comp ); - system->error_ptr->all(FLERR, errmsg); + system->error_ptr->one(FLERR, errmsg); } } } diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 8ac9f0e53c..c1239e0cbb 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -223,49 +223,34 @@ void Initialize( reax_system *system, control_params *control, if (Init_MPI_Datatypes(system, workspace, mpi_data, comm, msg) == FAILURE) { - - snprintf(errmsg, 128, "Could not create datatypes on thread %d", - system->my_rank); - control->error_ptr->one(FLERR,errmsg); + control->error_ptr->one(FLERR,"Could not create datatypes"); } if (Init_System(system, control, msg) == FAILURE) { - snprintf(errmsg, 128, "System could not be initialized on thread %d", - system->my_rank); - control->error_ptr->one(FLERR,errmsg); + control->error_ptr->one(FLERR,"System could not be initialized"); } if (Init_Simulation_Data( system, control, data, msg ) == FAILURE) { - snprintf(errmsg, 128, "Sim_data could not be initialized on thread %d", - system->my_rank); - control->error_ptr->one(FLERR,errmsg); + control->error_ptr->one(FLERR,"Sim_data could not be initialized"); } if (Init_Workspace( system, control, workspace, msg ) == FAILURE) { - snprintf(errmsg, 128, "Workspace could not be initialized on thread %d", - system->my_rank); - control->error_ptr->one(FLERR,errmsg); + control->error_ptr->one(FLERR,"Workspace could not be initialized"); } if (Init_Lists( system, control, data, workspace, lists, mpi_data, msg ) == FAILURE) { - snprintf(errmsg, 128, "System could not be initialized on thread %d", - system->my_rank); - control->error_ptr->one(FLERR,errmsg); + control->error_ptr->one(FLERR,"Lists could not be initialized"); } if (Init_Output_Files(system,control,out_control,mpi_data,msg)== FAILURE) { - snprintf(errmsg, 128, "Could not open output files on thread %d", - system->my_rank); - control->error_ptr->one(FLERR,errmsg); + control->error_ptr->one(FLERR,"Could not open output files"); } if (control->tabulate) { if (Init_Lookup_Tables( system, control, workspace, mpi_data, msg ) == FAILURE) { - snprintf(errmsg, 128, "Lookup table could not be created on thread %d", - system->my_rank); - control->error_ptr->one(FLERR,errmsg); + control->error_ptr->one(FLERR,"Lookup table could not be created"); } } diff --git a/src/USER-REAXC/reaxc_list.cpp b/src/USER-REAXC/reaxc_list.cpp index 2e86c3c06b..cd4f815286 100644 --- a/src/USER-REAXC/reaxc_list.cpp +++ b/src/USER-REAXC/reaxc_list.cpp @@ -91,7 +91,7 @@ int Make_List(int n, int num_intrs, int type, reax_list *l ) default: char errmsg[128]; snprintf(errmsg, 128, "No %d list type defined", l->type); - l->error_ptr->all(FLERR,errmsg); + l->error_ptr->one(FLERR,errmsg); } return SUCCESS; diff --git a/src/USER-REAXC/reaxc_tool_box.cpp b/src/USER-REAXC/reaxc_tool_box.cpp index df8d7c85bf..b6058b2516 100644 --- a/src/USER-REAXC/reaxc_tool_box.cpp +++ b/src/USER-REAXC/reaxc_tool_box.cpp @@ -66,7 +66,7 @@ void *smalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, const char *name ) if (n <= 0) { snprintf(errmsg, 256, "Trying to allocate %ld bytes for array %s. " "returning NULL.", n, name); - error_ptr->warning(FLERR,errmsg); + error_ptr->one(FLERR,errmsg); return NULL; } @@ -89,14 +89,14 @@ void *scalloc( LAMMPS_NS::Error *error_ptr, rc_bigint n, rc_bigint size, const c if (n <= 0) { snprintf(errmsg, 256, "Trying to allocate %ld elements for array %s. " "returning NULL.\n", n, name ); - error_ptr->warning(FLERR,errmsg); + error_ptr->one(FLERR,errmsg); return NULL; } if (size <= 0) { snprintf(errmsg, 256, "Elements size for array %s is %ld. " "returning NULL", name, size ); - error_ptr->warning(FLERR,errmsg); + error_ptr->one(FLERR,errmsg); return NULL; } diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index d25221512e..5adc0cfbb9 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -531,7 +531,7 @@ int Write_Atoms( reax_system *system, control_params * /*control*/, p_atom->f[0], p_atom->f[1], p_atom->f[2], p_atom->q ); break; default: - system->error_ptr->all(FLERR,"Write_traj_atoms: unknown atom trajectory format"); + system->error_ptr->one(FLERR,"Write_traj_atoms: unknown atom trajectory format"); } strncpy( out_control->buffer + i*line_len, out_control->line, line_len+1 ); @@ -617,7 +617,7 @@ int Write_Bonds(reax_system *system, control_params *control, reax_list *bonds, bo_ij->bo_data.BO_pi, bo_ij->bo_data.BO_pi2 ); break; default: - system->error_ptr->all(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); + system->error_ptr->one(FLERR, "Write_traj_bonds: FATAL! invalid bond_info option"); } strncpy( out_control->buffer + my_bonds*line_len, out_control->line, line_len+1 ); diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index d390768ac6..cdc2916a66 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -395,8 +395,6 @@ typedef struct double ghost_cutoff; } boundary_cutoff; -using LAMMPS_NS::Pair; - struct _reax_system { reax_interaction reax_param; @@ -414,8 +412,8 @@ struct _reax_system boundary_cutoff bndry_cuts; reax_atom *my_atoms; - class LAMMPS_NS::Error *error_ptr; - class Pair *pair_ptr; + class LAMMPS_NS::Error *error_ptr; + class LAMMPS_NS::Pair *pair_ptr; int my_bonds; int mincap; double safezone, saferzone; From 1a105253c13937857fd24766b1d24ec8c35f289d Mon Sep 17 00:00:00 2001 From: mkanski Date: Wed, 3 Apr 2019 18:24:38 +0200 Subject: [PATCH 0442/1242] Check the MPI rank differently --- src/USER-REAXC/pair_reaxc.cpp | 1 - src/USER-REAXC/reaxc_init_md.cpp | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 18e7ef2f04..8b36019881 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -431,7 +431,6 @@ void PairReaxC::setup( ) int *num_hbonds = fix_reax->num_hbonds; control->vlist_cut = neighbor->cutneighmax; - control->me = comm->me; // determine the local and total capacity diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index c1239e0cbb..dfd92ec7a3 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -91,13 +91,13 @@ void Init_Taper( control_params *control, storage *workspace ) swa = control->nonb_low; swb = control->nonb_cut; - if (fabs( swa ) > 0.01 && control->me == 0) + if (fabs( swa ) > 0.01 && control->my_rank == 0) control->error_ptr->warning( FLERR, "Non-zero lower Taper-radius cutoff" ); if (swb < 0) { control->error_ptr->all(FLERR,"Negative upper Taper-radius cutoff"); } - else if( swb < 5 && control->me == 0) { + else if( swb < 5 && control->my_rank == 0) { char errmsg[256]; snprintf(errmsg, 256, "Very low Taper-radius cutoff: %f", swb ); control->error_ptr->warning( FLERR, errmsg ); From d7a5bf4e164bd0c7ea9e18812685584e8fcc54c3 Mon Sep 17 00:00:00 2001 From: mkanski Date: Wed, 3 Apr 2019 18:52:14 +0200 Subject: [PATCH 0443/1242] Repair last commit --- src/USER-REAXC/pair_reaxc.cpp | 1 + src/USER-REAXC/reaxc_init_md.cpp | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 8b36019881..1f30cdad43 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -91,6 +91,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) memory->smalloc(sizeof(mpi_datatypes),"reax:mpi"); MPI_Comm_rank(world,&system->my_rank); + control->me = system->my_rank; system->my_coords[0] = 0; system->my_coords[1] = 0; diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index dfd92ec7a3..c1239e0cbb 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -91,13 +91,13 @@ void Init_Taper( control_params *control, storage *workspace ) swa = control->nonb_low; swb = control->nonb_cut; - if (fabs( swa ) > 0.01 && control->my_rank == 0) + if (fabs( swa ) > 0.01 && control->me == 0) control->error_ptr->warning( FLERR, "Non-zero lower Taper-radius cutoff" ); if (swb < 0) { control->error_ptr->all(FLERR,"Negative upper Taper-radius cutoff"); } - else if( swb < 5 && control->my_rank == 0) { + else if( swb < 5 && control->me == 0) { char errmsg[256]; snprintf(errmsg, 256, "Very low Taper-radius cutoff: %f", swb ); control->error_ptr->warning( FLERR, errmsg ); From e45e92b1cbf0cb4823d80eed07d6049c136ee61a Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 3 Apr 2019 11:24:37 -0600 Subject: [PATCH 0444/1242] Commit JT 040319 - improved examples - start rework gneb init. (Rodrigues' formula) --- examples/SPIN/gneb/README | 7 +- examples/SPIN/gneb/iron/in.gneb.iron | 2 +- examples/SPIN/gneb/skyrmion/in.gneb.skyrmion | 16 +- src/SPIN/neb_spin.cpp | 152 ++++++++++--------- 4 files changed, 89 insertions(+), 88 deletions(-) diff --git a/examples/SPIN/gneb/README b/examples/SPIN/gneb/README index 7d388d898e..6f5db6d388 100644 --- a/examples/SPIN/gneb/README +++ b/examples/SPIN/gneb/README @@ -1,5 +1,10 @@ +Perform geodesic NEB calculations for spin configurations. +The two examples are: +- the magnetic switching of an iron nanoisland +- the collapse of a magnetic skyrmion + Run those examples as: -mpirun -np 4 lmp_mpi -in in.gneb.iron -partition 4x1 +mpirun -np 3 lmp_mpi -in in.gneb.iron -partition 3x1 You should be able to use any number of replicas >= 3. diff --git a/examples/SPIN/gneb/iron/in.gneb.iron b/examples/SPIN/gneb/iron/in.gneb.iron index 4cfbd723b7..c794292cfb 100644 --- a/examples/SPIN/gneb/iron/in.gneb.iron +++ b/examples/SPIN/gneb/iron/in.gneb.iron @@ -1,4 +1,3 @@ -# bcc iron in a 3d periodic box units metal dimension 3 @@ -11,6 +10,7 @@ atom_modify map array read_data initial.iron_spin # setting mass, mag. moments, and interactions for bcc iron +# (mass not necessary for fixed lattice calculation) mass 1 55.845 diff --git a/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion b/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion index aab6376e98..cbab56631b 100644 --- a/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion +++ b/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion @@ -1,4 +1,3 @@ -# bcc iron in a 3d periodic box units metal dimension 3 @@ -8,17 +7,12 @@ atom_style spin # necessary for the serial algorithm (sametag) atom_modify map array -#lattice sc 3.0 -#region box block 0.0 20.0 0.0 20.0 0.0 1.0 -#create_box 1 box -#create_atoms 1 box - read_data initial.skyrmion # setting mass, mag. moments, and interactions for bcc iron +# (mass not necessary for fixed lattice calculation) mass 1 55.845 -#set group all spin 2.2 -1.0 0.0 0.0 pair_style hybrid/overlay spin/exchange 3.1 spin/dmi 3.1 pair_coeff * * spin/exchange exchange 3.1 0.01593 0.06626915552 1.211 @@ -31,10 +25,8 @@ fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 anisotropy 5e-05 0.0 0.0 1.0 fix_modify 1 energy yes fix 2 all langevin/spin 0.0 0.0 21 fix 3 all neb/spin 1.0 -#fix 4 all nve/spin lattice no timestep 0.0001 -#run 0 compute out_mag all spin variable magx equal c_out_mag[1] @@ -49,10 +41,8 @@ thermo_modify format float %20.15g compute outsp all property/atom spx spy spz sp fmx fmy fmz variable u universe 1 2 3 4 -#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] dump 1 all custom 1 dump.$u 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 -neb/spin 1.0e-16 1.0e-16 1000 1000 10 final final.skyrmion -#neb/spin 1.0e-16 1.0e-16 10 10 10 final final.skyrmion +min_modify alpha_damp 1.0 discrete_factor 10.0 +neb/spin 1.0e-12 1.0e-12 10000 10000 10 final final.skyrmion diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index d981962a70..69c59e0484 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -637,52 +637,9 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) // initial, final and inter ang. values - double itheta,iphi,ftheta,fphi,ktheta,kphi; - double spix,spiy,spiz,spfx,spfy,spfz; - double spkx,spky,spkz,iknorm; - - spix = spi[0]; - spiy = spi[1]; - spiz = spi[2]; - - spfx = sploc[0]; - spfy = sploc[1]; - spfz = sploc[2]; - - iphi = itheta = fphi = ftheta = 0.0; - - iphi = acos(spiz); - if (sin(iphi) != 0.0) - itheta = acos(spix/sin(iphi)); - - fphi = acos(spfz); - if (sin(fphi) != 0.0) - ftheta = acos(spfx/sin(fphi)); - - kphi = iphi + fraction*(fphi-iphi); - ktheta = itheta + fraction*(ftheta-itheta); - - spkx = cos(ktheta)*sin(kphi); - spky = sin(ktheta)*sin(kphi); - spkz = cos(kphi); - - double knormsq = spkx*spkx + spky*spky + spkz*spkz; - if (knormsq != 0.0) - iknorm = 1.0/sqrt(knormsq); - - spkx *= iknorm; - spky *= iknorm; - spkz *= iknorm; - - //sploc[0] = spkx; - //sploc[1] = spky; - //sploc[2] = spkz; - - //double kx,ky,kz; + //double itheta,iphi,ftheta,fphi,ktheta,kphi; //double spix,spiy,spiz,spfx,spfy,spfz; - //double kcrossx,kcrossy,kcrossz,knormsq; - //double spkx,spky,spkz; - //double sdot,omega,iknorm; + //double spkx,spky,spkz,iknorm; //spix = spi[0]; //spiy = spi[1]; @@ -691,40 +648,89 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) //spfx = sploc[0]; //spfy = sploc[1]; //spfz = sploc[2]; - // - //kx = spiy*spfz - spiz*spfy; - //ky = spiz*spfx - spix*spfz; - //kz = spix*spfy - spiy*spfx; - //knormsq = kx*kx+ky*ky+kz*kz; - // - //if (knormsq != 0.0) { + //iphi = itheta = fphi = ftheta = 0.0; + + //iphi = acos(spiz); + //if (sin(iphi) != 0.0) + // itheta = acos(spix/sin(iphi)); + + //fphi = acos(spfz); + //if (sin(fphi) != 0.0) + // ftheta = acos(spfx/sin(fphi)); + + //kphi = iphi + fraction*(fphi-iphi); + //ktheta = itheta + fraction*(ftheta-itheta); + + //spkx = cos(ktheta)*sin(kphi); + //spky = sin(ktheta)*sin(kphi); + //spkz = cos(kphi); + + //double knormsq = spkx*spkx + spky*spky + spkz*spkz; + //if (knormsq != 0.0) // iknorm = 1.0/sqrt(knormsq); - // kx *= iknorm; - // ky *= iknorm; - // kz *= iknorm; - //} - // - //kcrossx = ky*spiz - kz*spiy; - //kcrossy = kz*spix - kx*spiz; - //kcrossz = kx*spiy - ky*spix; - - //sdot = spix*spfx + spiy*spfy + spiz*spfz; - - //omega = acos(sdot); - //omega *= fraction; - - //spkx = spix*cos(omega) + kcrossx*sin(omega); - //spky = spiy*cos(omega) + kcrossy*sin(omega); - //spkz = spiz*cos(omega) + kcrossz*sin(omega); - // - //iknorm = 1.0/sqrt(spkx*spkx+spky*spky+spkz*spkz); - //if (iknorm == 0.0) - // error->all(FLERR,"Incorrect rotation operation"); //spkx *= iknorm; //spky *= iknorm; //spkz *= iknorm; + + //sploc[0] = spkx; + //sploc[1] = spky; + //sploc[2] = spkz; + + double kx,ky,kz; + double spix,spiy,spiz,spfx,spfy,spfz; + double kcrossx,kcrossy,kcrossz,knormsq; + double kdots; + double spkx,spky,spkz; + double sdot,omega,iknorm,isnorm; + + spix = spi[0]; + spiy = spi[1]; + spiz = spi[2]; + + spfx = sploc[0]; + spfy = sploc[1]; + spfz = sploc[2]; + + kx = spiy*spfz - spiz*spfy; + ky = spiz*spfx - spix*spfz; + kz = spix*spfy - spiy*spfx; + + knormsq = kx*kx+ky*ky+kz*kz; + + if (knormsq != 0.0) { + iknorm = 1.0/sqrt(knormsq); + kx *= iknorm; + ky *= iknorm; + kz *= iknorm; + } + + kcrossx = ky*spiz - kz*spiy; + kcrossy = kz*spix - kx*spiz; + kcrossz = kx*spiy - ky*spix; + + kdots = kx*spix + ky*spiz + kz*spiz; + sdot = spix*spfx + spiy*spfy + spiz*spfz; + + omega = acos(sdot); + omega *= fraction; + + spkx = spix*cos(omega) + kcrossx*sin(omega); + spky = spiy*cos(omega) + kcrossy*sin(omega); + spkz = spiz*cos(omega) + kcrossz*sin(omega); + + spkx += kx*kdots*(1.0-cos(omega)); + spky += ky*kdots*(1.0-cos(omega)); + spkz += kz*kdots*(1.0-cos(omega)); + + isnorm = 1.0/sqrt(spkx*spkx+spky*spky+spkz*spkz); + if (isnorm == 0.0) + error->all(FLERR,"Incorrect rotation operation"); + + spkx *= isnorm; + spky *= isnorm; + spkz *= isnorm; sploc[0] = spkx; sploc[1] = spky; From d4a495151e53744ecafa1c40f1f4dd894447c2e1 Mon Sep 17 00:00:00 2001 From: mkanski Date: Wed, 3 Apr 2019 19:40:40 +0200 Subject: [PATCH 0445/1242] Simplify access to error in reax/c/omp --- src/USER-OMP/pair_reaxc_omp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 9e198186fd..92ba31048d 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -113,7 +113,7 @@ PairReaxCOMP::~PairReaxCOMP() if (setup_flag) { reax_list * bonds = lists+BONDS; for (int i=0; inum_intrs; ++i) - sfree(LAMMPS_NS::Pointers::lmp->error, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); + sfree(error, bonds->select.bond_list[i].bo_data.CdboReduction, "CdboReduction"); } memory->destroy(num_nbrs_offset); From 8820467a8bb76a3405ea89623cdd930847526798 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Wed, 3 Apr 2019 15:15:40 -0400 Subject: [PATCH 0446/1242] fix wrong column size assignment bug when using optional arguments in some local computes --- src/BODY/compute_body_local.cpp | 5 +++-- src/RIGID/compute_rigid_local.cpp | 7 ++++--- src/compute_improper_local.cpp | 6 +++--- src/compute_pair_local.cpp | 6 +++--- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/BODY/compute_body_local.cpp b/src/BODY/compute_body_local.cpp index df8a76d0fe..20f7d76708 100644 --- a/src/BODY/compute_body_local.cpp +++ b/src/BODY/compute_body_local.cpp @@ -39,8 +39,6 @@ ComputeBodyLocal::ComputeBodyLocal(LAMMPS *lmp, int narg, char **arg) : local_flag = 1; nvalues = narg - 3; - if (nvalues == 1) size_local_cols = 0; - else size_local_cols = nvalues; which = new int[nvalues]; index = new int[nvalues]; @@ -66,6 +64,9 @@ ComputeBodyLocal::ComputeBodyLocal(LAMMPS *lmp, int narg, char **arg) : error->all(FLERR,"Invalid index in compute body/local command"); } + if (nvalues == 1) size_local_cols = 0; + else size_local_cols = nvalues; + nmax = 0; vector = NULL; array = NULL; diff --git a/src/RIGID/compute_rigid_local.cpp b/src/RIGID/compute_rigid_local.cpp index bcb778ab86..ec2799b6bc 100644 --- a/src/RIGID/compute_rigid_local.cpp +++ b/src/RIGID/compute_rigid_local.cpp @@ -40,8 +40,6 @@ ComputeRigidLocal::ComputeRigidLocal(LAMMPS *lmp, int narg, char **arg) : local_flag = 1; nvalues = narg - 4; - if (nvalues == 1) size_local_cols = 0; - else size_local_cols = nvalues; int n = strlen(arg[3]) + 1; idrigid = new char[n]; @@ -88,7 +86,10 @@ ComputeRigidLocal::ComputeRigidLocal(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Invalid keyword in compute rigid/local command"); } - ncount = nmax = 0; + if (nvalues == 1) size_local_cols = 0; + else size_local_cols = nvalues; + +ncount = nmax = 0; vlocal = NULL; alocal = NULL; } diff --git a/src/compute_improper_local.cpp b/src/compute_improper_local.cpp index f54cb67535..2861850c79 100644 --- a/src/compute_improper_local.cpp +++ b/src/compute_improper_local.cpp @@ -46,9 +46,6 @@ ComputeImproperLocal::ComputeImproperLocal(LAMMPS *lmp, int narg, char **arg) : local_flag = 1; nvalues = narg - 3; - if (nvalues == 1) size_local_cols = 0; - else size_local_cols = nvalues; - cflag = -1; nvalues = 0; @@ -57,6 +54,9 @@ ComputeImproperLocal::ComputeImproperLocal(LAMMPS *lmp, int narg, char **arg) : else error->all(FLERR,"Invalid keyword in compute improper/local command"); } + if (nvalues == 1) size_local_cols = 0; + else size_local_cols = nvalues; + nmax = 0; vlocal = NULL; alocal = NULL; diff --git a/src/compute_pair_local.cpp b/src/compute_pair_local.cpp index e4cbabfd3d..c356a08be9 100644 --- a/src/compute_pair_local.cpp +++ b/src/compute_pair_local.cpp @@ -43,9 +43,6 @@ ComputePairLocal::ComputePairLocal(LAMMPS *lmp, int narg, char **arg) : local_flag = 1; nvalues = narg - 3; - if (nvalues == 1) size_local_cols = 0; - else size_local_cols = nvalues; - pstyle = new int[nvalues]; pindex = new int[nvalues]; @@ -96,6 +93,9 @@ ComputePairLocal::ComputePairLocal(LAMMPS *lmp, int narg, char **arg) : for (int i = 0; i < nvalues; i++) if (pstyle[i] != DIST) singleflag = 1; + if (nvalues == 1) size_local_cols = 0; + else size_local_cols = nvalues; + nmax = 0; vlocal = NULL; alocal = NULL; From 0d78c7b43d6b462b62effac2b0463c9b3a37a2d7 Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Thu, 4 Apr 2019 09:57:15 +0300 Subject: [PATCH 0447/1242] fix elstop: Rename to fix electron/stopping --- doc/src/Commands_fix.txt | 2 +- doc/src/fix.txt | 2 +- ...x_elstop.txt => fix_electron_stopping.txt} | 28 +++---- doc/src/fixes.txt | 2 +- doc/src/lammps.book | 2 +- doc/utils/sphinx-config/false_positives.txt | 1 - .../Si.Si.elstop | 0 .../misc/{elstop => electron_stopping}/Si.sw | 0 .../{elstop => electron_stopping}/in.elstop | 4 +- .../in.elstop.only | 6 +- .../log.20Mar19.elstop.g++.1 | 30 ++++---- .../log.20Mar19.elstop.g++.4 | 30 ++++---- .../log.20Mar19.elstop.only.g++.1 | 32 ++++---- .../log.20Mar19.elstop.only.g++.4 | 34 ++++----- src/USER-MISC/README | 2 +- ...x_elstop.cpp => fix_electron_stopping.cpp} | 75 ++++++++++--------- .../{fix_elstop.h => fix_electron_stopping.h} | 38 +++++----- 17 files changed, 143 insertions(+), 145 deletions(-) rename doc/src/{fix_elstop.txt => fix_electron_stopping.txt} (87%) rename examples/USER/misc/{elstop => electron_stopping}/Si.Si.elstop (100%) rename examples/USER/misc/{elstop => electron_stopping}/Si.sw (100%) rename examples/USER/misc/{elstop => electron_stopping}/in.elstop (87%) rename examples/USER/misc/{elstop => electron_stopping}/in.elstop.only (79%) rename examples/USER/misc/{elstop => electron_stopping}/log.20Mar19.elstop.g++.1 (97%) rename examples/USER/misc/{elstop => electron_stopping}/log.20Mar19.elstop.g++.4 (97%) rename examples/USER/misc/{elstop => electron_stopping}/log.20Mar19.elstop.only.g++.1 (89%) rename examples/USER/misc/{elstop => electron_stopping}/log.20Mar19.elstop.only.g++.4 (89%) rename src/USER-MISC/{fix_elstop.cpp => fix_electron_stopping.cpp} (75%) rename src/USER-MISC/{fix_elstop.h => fix_electron_stopping.h} (66%) diff --git a/doc/src/Commands_fix.txt b/doc/src/Commands_fix.txt index ad884f7bd8..0406c12ca1 100644 --- a/doc/src/Commands_fix.txt +++ b/doc/src/Commands_fix.txt @@ -61,7 +61,7 @@ OPT. "edpd/source"_fix_dpd_source.html, "efield"_fix_efield.html, "ehex"_fix_ehex.html, -"elstop"_fix_elstop.html, +"electron/stopping"_fix_electron_stopping.html, "enforce2d (k)"_fix_enforce2d.html, "eos/cv"_fix_eos_cv.html, "eos/table"_fix_eos_table.html, diff --git a/doc/src/fix.txt b/doc/src/fix.txt index fa34dc17de..39f4405a0b 100644 --- a/doc/src/fix.txt +++ b/doc/src/fix.txt @@ -199,7 +199,7 @@ accelerated styles exist. "edpd/source"_fix_dpd_source.html - "efield"_fix_efield.html - impose electric field on system "ehex"_fix_ehex.html - enhanced heat exchange algorithm -"elstop"_fix_elstop.html - electronic stopping power as a friction force +"electron/stopping"_fix_electron_stopping.html - electronic stopping power as a friction force "enforce2d"_fix_enforce2d.html - zero out z-dimension velocity and force "eos/cv"_fix_eos_cv.html - "eos/table"_fix_eos_table.html - diff --git a/doc/src/fix_elstop.txt b/doc/src/fix_electron_stopping.txt similarity index 87% rename from doc/src/fix_elstop.txt rename to doc/src/fix_electron_stopping.txt index 53779e0953..096629c330 100644 --- a/doc/src/fix_elstop.txt +++ b/doc/src/fix_electron_stopping.txt @@ -6,14 +6,14 @@ :line -fix elstop command :h3 +fix electron/stopping command :h3 [Syntax:] -fix ID group-ID elstop Ecut file keyword value ... :pre +fix ID group-ID electron/stopping Ecut file keyword value ... :pre ID, group-ID are documented in "fix"_fix.html command :ulb,l -elstop = style name of this fix command :l +electron/stopping = style name of this fix command :l Ecut = minimum kinetic energy for electronic stopping (energy units) :l file = name of the file containing the electronic stopping power table :l zero or more keyword/value pairs may be appended to args :l @@ -21,14 +21,14 @@ keyword = {region} or {minneigh} :l {region} value = region-ID region-ID = region, whose atoms will be affected by this fix {minneigh} value = minneigh - minneigh = minimum number of neighbors for atoms to have elstop applied :pre + minneigh = minimum number of neighbors an atom to have stopping applied :pre :ule [Examples:] -fix el all elstop 10.0 elstop-table.txt -fix el all elstop 10.0 elstop-table.txt minneigh 3 -fix el mygroup elstop 1.0 elstop-table.txt region bulk :pre +fix el all electron/stopping 10.0 elstop-table.txt +fix el all electron/stopping 10.0 elstop-table.txt minneigh 3 +fix el mygroup electron/stopping 1.0 elstop-table.txt region bulk :pre [Description:] @@ -48,9 +48,9 @@ to each atom as: \vec\{F\}_i = \vec\{F\}^0_i - \frac\{\vec\{v\}_i\}\{\|\vec\{v\}_i\|\} \cdot S_e \end\{equation\} -where \(\vec\{F\}_i\) is the resulting total force on the atom. \(\vec\{F\}^0_i\) -is the original force applied to the atom, \(\vec\{v\}_i\) is its velocity and -\(S_e\) is the stopping power of the ion. +where \(\vec\{F\}_i\) is the resulting total force on the atom. +\(\vec\{F\}^0_i\) is the original force applied to the atom, \(\vec\{v\}_i\) is +its velocity and \(S_e\) is the stopping power of the ion. NOTE: In addition to electronic stopping, atomic cascades and irradiation simulations require the use of an adaptive timestep (see @@ -79,10 +79,10 @@ in bulk material. An alternative is to disable the check for neighbors by setting {minneigh} to zero and using the {region} keyword. This is necessary when running simulations of cluster bombardment. -If the {region} keyword is used, the atom must also be in the specified geometric -"region"_region.html in order to have electronic stopping applied to it. This is -useful if the position of the bulk material is fixed. By default the electronic -stopping is applied everywhere in the simulation cell. +If the {region} keyword is used, the atom must also be in the specified +geometric "region"_region.html in order to have electronic stopping applied to +it. This is useful if the position of the bulk material is fixed. By default +the electronic stopping is applied everywhere in the simulation cell. :line diff --git a/doc/src/fixes.txt b/doc/src/fixes.txt index 7bbf269a2c..d77acf946d 100644 --- a/doc/src/fixes.txt +++ b/doc/src/fixes.txt @@ -40,7 +40,7 @@ Fixes :h1 fix_dt_reset fix_efield fix_ehex - fix_elstop + fix_electron_stopping fix_enforce2d fix_eos_cv fix_eos_table diff --git a/doc/src/lammps.book b/doc/src/lammps.book index 692ffcd712..6a2ca03ba8 100644 --- a/doc/src/lammps.book +++ b/doc/src/lammps.book @@ -264,7 +264,7 @@ fix_drude_transform.html fix_dt_reset.html fix_efield.html fix_ehex.html -fix_elstop.html +fix_electron_stopping.html fix_enforce2d.html fix_eos_cv.html fix_eos_table.html diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 65d0d16908..f168ff038a 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -692,7 +692,6 @@ elong Elsevier Elsner Elstner -elstop elt emacs emax diff --git a/examples/USER/misc/elstop/Si.Si.elstop b/examples/USER/misc/electron_stopping/Si.Si.elstop similarity index 100% rename from examples/USER/misc/elstop/Si.Si.elstop rename to examples/USER/misc/electron_stopping/Si.Si.elstop diff --git a/examples/USER/misc/elstop/Si.sw b/examples/USER/misc/electron_stopping/Si.sw similarity index 100% rename from examples/USER/misc/elstop/Si.sw rename to examples/USER/misc/electron_stopping/Si.sw diff --git a/examples/USER/misc/elstop/in.elstop b/examples/USER/misc/electron_stopping/in.elstop similarity index 87% rename from examples/USER/misc/elstop/in.elstop rename to examples/USER/misc/electron_stopping/in.elstop index e31e6d8a65..beaffbb821 100644 --- a/examples/USER/misc/elstop/in.elstop +++ b/examples/USER/misc/electron_stopping/in.elstop @@ -1,4 +1,4 @@ -# Test case / example for the electronic stopping fix elstop +# Test case / example for fix electron/stopping # Perfect Si lattice with one primary knock-on atom. # # Also uses fix dt/reset, as one should when energies are high @@ -26,7 +26,7 @@ pair_style sw pair_coeff * * Si.sw Si fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 -fix fel all elstop 1.0 Si.Si.elstop +fix fel all electron/stopping 1.0 Si.Si.elstop fix fnve all nve thermo 10 diff --git a/examples/USER/misc/elstop/in.elstop.only b/examples/USER/misc/electron_stopping/in.elstop.only similarity index 79% rename from examples/USER/misc/elstop/in.elstop.only rename to examples/USER/misc/electron_stopping/in.elstop.only index 1d09fa11f9..3e9650802c 100644 --- a/examples/USER/misc/elstop/in.elstop.only +++ b/examples/USER/misc/electron_stopping/in.elstop.only @@ -1,6 +1,6 @@ -# Test case / example for the electronic stopping fix elstop +# Test case / example for fix electron/stopping # One fast atom, no other interactions. -# Elstop only applied in a smaller box in the middle. +# Stopping only applied in a smaller box in the middle. # # Also uses fix dt/reset, as one should when energies are high # enough to require electronic stopping. @@ -25,7 +25,7 @@ pair_style zero 1 pair_coeff * * 1 fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 -fix fel all elstop 1.0 Si.Si.elstop minneigh 0 region rsmallbox +fix fel all electron/stopping 1.0 Si.Si.elstop minneigh 0 region rsmallbox fix fnve all nve compute ek all ke/atom diff --git a/examples/USER/misc/elstop/log.20Mar19.elstop.g++.1 b/examples/USER/misc/electron_stopping/log.20Mar19.elstop.g++.1 similarity index 97% rename from examples/USER/misc/elstop/log.20Mar19.elstop.g++.1 rename to examples/USER/misc/electron_stopping/log.20Mar19.elstop.g++.1 index 3547ced959..cbe70373af 100644 --- a/examples/USER/misc/elstop/log.20Mar19.elstop.g++.1 +++ b/examples/USER/misc/electron_stopping/log.20Mar19.elstop.g++.1 @@ -1,7 +1,7 @@ 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 -# Test case / example for the electronic stopping fix elstop +# Test case / example for fix electron/stopping # Perfect Si lattice with one primary knock-on atom. # # Also uses fix dt/reset, as one should when energies are high @@ -23,7 +23,7 @@ mass 1 28.0855 create_atoms 1 box Created 32000 atoms - Time spent = 0.00365901 secs + create_atoms CPU = 0.00282311 secs velocity all create 300 42534 mom yes rot yes @@ -36,7 +36,7 @@ pair_coeff * * Si.sw Si Reading potential file Si.sw with DATE: 2007-06-11 fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 -fix fel all elstop 1.0 Si.Si.elstop +fix fel all electron/stopping 1.0 Si.Si.elstop fix fnve all nve thermo 10 @@ -58,7 +58,7 @@ Neighbor list info ... pair build: full/bin/atomonly stencil: full/bin/3d bin: standard - (2) fix elstop, occasional, copy from (1) + (2) fix electron/stopping, occasional, copy from (1) attributes: full, newton on pair build: copy stencil: none @@ -566,20 +566,20 @@ Step Time Dt f_fel 4980 0.014568876 3.9720495e-08 6777.8926 4990 0.014569265 3.7726941e-08 6778.0636 5000 0.014569634 3.5910753e-08 6778.2261 -Loop time of 27.2739 on 1 procs for 5000 steps with 32000 atoms +Loop time of 24.155 on 1 procs for 5000 steps with 32000 atoms -Performance: 0.001 ns/day, 42193.880 hours/ns, 183.326 timesteps/s -96.6% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 0.001 ns/day, 37368.951 hours/ns, 206.996 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 | 17.626 | 17.626 | 17.626 | 0.0 | 64.62 -Neigh | 1.5828 | 1.5828 | 1.5828 | 0.0 | 5.80 -Comm | 0.78596 | 0.78596 | 0.78596 | 0.0 | 2.88 -Output | 0.0082562 | 0.0082562 | 0.0082562 | 0.0 | 0.03 -Modify | 6.414 | 6.414 | 6.414 | 0.0 | 23.52 -Other | | 0.8573 | | | 3.14 +Pair | 15.795 | 15.795 | 15.795 | 0.0 | 65.39 +Neigh | 1.5182 | 1.5182 | 1.5182 | 0.0 | 6.29 +Comm | 0.58555 | 0.58555 | 0.58555 | 0.0 | 2.42 +Output | 0.0064323 | 0.0064323 | 0.0064323 | 0.0 | 0.03 +Modify | 5.619 | 5.619 | 5.619 | 0.0 | 23.26 +Other | | 0.6313 | | | 2.61 Nlocal: 32000 ave 32000 max 32000 min Histogram: 1 0 0 0 0 0 0 0 0 0 @@ -594,4 +594,4 @@ Total # of neighbors = 576016 Ave neighs/atom = 18.0005 Neighbor list builds = 68 Dangerous builds = 42 -Total wall time: 0:00:27 +Total wall time: 0:00:24 diff --git a/examples/USER/misc/elstop/log.20Mar19.elstop.g++.4 b/examples/USER/misc/electron_stopping/log.20Mar19.elstop.g++.4 similarity index 97% rename from examples/USER/misc/elstop/log.20Mar19.elstop.g++.4 rename to examples/USER/misc/electron_stopping/log.20Mar19.elstop.g++.4 index 4b06000522..e0f45ef460 100644 --- a/examples/USER/misc/elstop/log.20Mar19.elstop.g++.4 +++ b/examples/USER/misc/electron_stopping/log.20Mar19.elstop.g++.4 @@ -1,7 +1,7 @@ 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 -# Test case / example for the electronic stopping fix elstop +# Test case / example for fix electron/stopping # Perfect Si lattice with one primary knock-on atom. # # Also uses fix dt/reset, as one should when energies are high @@ -23,7 +23,7 @@ mass 1 28.0855 create_atoms 1 box Created 32000 atoms - Time spent = 0.000838995 secs + create_atoms CPU = 0.000856161 secs velocity all create 300 42534 mom yes rot yes @@ -36,7 +36,7 @@ pair_coeff * * Si.sw Si Reading potential file Si.sw with DATE: 2007-06-11 fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 -fix fel all elstop 1.0 Si.Si.elstop +fix fel all electron/stopping 1.0 Si.Si.elstop fix fnve all nve thermo 10 @@ -58,7 +58,7 @@ Neighbor list info ... pair build: full/bin/atomonly stencil: full/bin/3d bin: standard - (2) fix elstop, occasional, copy from (1) + (2) fix electron/stopping, occasional, copy from (1) attributes: full, newton on pair build: copy stencil: none @@ -566,20 +566,20 @@ Step Time Dt f_fel 4980 0.014615386 1.0814135e-07 6805.2899 4990 0.014616494 1.1414984e-07 6805.7869 5000 0.014617666 1.2114278e-07 6806.313 -Loop time of 20.4871 on 4 procs for 5000 steps with 32000 atoms +Loop time of 9.26846 on 4 procs for 5000 steps with 32000 atoms -Performance: 0.003 ns/day, 9395.278 hours/ns, 244.056 timesteps/s -80.0% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 0.006 ns/day, 4250.474 hours/ns, 539.464 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 | 5.3304 | 5.3747 | 5.4481 | 1.9 | 26.23 -Neigh | 0.47764 | 0.49529 | 0.50484 | 1.5 | 2.42 -Comm | 7.3264 | 7.6698 | 8.0174 | 11.5 | 37.44 -Output | 0.020597 | 0.064879 | 0.11197 | 13.7 | 0.32 -Modify | 4.3321 | 4.7499 | 5.1576 | 18.4 | 23.18 -Other | | 2.132 | | | 10.41 +Pair | 4.6281 | 4.7789 | 5.1937 | 11.0 | 51.56 +Neigh | 0.40488 | 0.41576 | 0.43895 | 2.1 | 4.49 +Comm | 0.8478 | 1.2799 | 1.4349 | 22.1 | 13.81 +Output | 0.0048099 | 0.016429 | 0.050251 | 15.2 | 0.18 +Modify | 2.1042 | 2.1347 | 2.1706 | 1.6 | 23.03 +Other | | 0.6427 | | | 6.93 Nlocal: 8000 ave 8033 max 7977 min Histogram: 1 0 1 1 0 0 0 0 0 1 @@ -594,4 +594,4 @@ Total # of neighbors = 576008 Ave neighs/atom = 18.0003 Neighbor list builds = 67 Dangerous builds = 38 -Total wall time: 0:00:20 +Total wall time: 0:00:09 diff --git a/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.1 b/examples/USER/misc/electron_stopping/log.20Mar19.elstop.only.g++.1 similarity index 89% rename from examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.1 rename to examples/USER/misc/electron_stopping/log.20Mar19.elstop.only.g++.1 index e586fb5afb..a3370204b7 100644 --- a/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.1 +++ b/examples/USER/misc/electron_stopping/log.20Mar19.elstop.only.g++.1 @@ -1,9 +1,9 @@ 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 -# Test case / example for the electronic stopping fix elstop +# Test case / example for fix electron/stopping # One fast atom, no other interactions. -# Elstop only applied in a smaller box in the middle. +# Stopping only applied in a smaller box in the middle. # # Also uses fix dt/reset, as one should when energies are high # enough to require electronic stopping. @@ -26,14 +26,14 @@ mass 1 28.0855 create_atoms 1 single 0 0 0 Created 1 atoms - Time spent = 3.09944e-06 secs + create_atoms CPU = 4.05312e-06 secs velocity all set 1120 1620 389 pair_style zero 1 pair_coeff * * 1 fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 -fix fel all elstop 1.0 Si.Si.elstop minneigh 0 region rsmallbox +fix fel all electron/stopping 1.0 Si.Si.elstop minneigh 0 region rsmallbox fix fnve all nve compute ek all ke/atom @@ -45,8 +45,6 @@ thermo_style custom step time dt f_fel c_ektot #dump mydump all custom 200 elstop.only.dump id x y z vx vy vz fx fy fz c_ek run 10000 -WARNING: More than one compute ke/atom (src/compute_ke_atom.cpp:55) -WARNING: More than one compute ke/atom (src/compute_ke_atom.cpp:55) Neighbor list info ... update every 1 steps, delay 10 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -59,7 +57,7 @@ Neighbor list info ... pair build: half/bin/atomonly/newton stencil: half/bin/3d/newton bin: standard - (2) fix elstop, occasional + (2) fix electron/stopping, occasional attributes: full, newton on pair build: full/bin/atomonly stencil: full/bin/3d @@ -167,20 +165,20 @@ Step Time Dt f_fel c_ektot 9800 0.57677384 6.0949329e-05 1947.6558 3917.8967 9900 0.58286878 6.0949329e-05 1947.6558 3917.8967 10000 0.58896371 6.0949329e-05 1947.6558 3917.8967 -Loop time of 1.81749 on 1 procs for 10000 steps with 1 atoms +Loop time of 1.25184 on 1 procs for 10000 steps with 1 atoms -Performance: 28.974 ns/day, 0.828 hours/ns, 5502.087 timesteps/s -95.8% CPU use with 1 MPI tasks x 1 OpenMP threads +Performance: 42.066 ns/day, 0.571 hours/ns, 7988.216 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.00068855 | 0.00068855 | 0.00068855 | 0.0 | 0.04 -Neigh | 1.777 | 1.777 | 1.777 | 0.0 | 97.77 -Comm | 0.028521 | 0.028521 | 0.028521 | 0.0 | 1.57 -Output | 0.0020428 | 0.0020428 | 0.0020428 | 0.0 | 0.11 -Modify | 0.0063827 | 0.0063827 | 0.0063827 | 0.0 | 0.35 -Other | | 0.002891 | | | 0.16 +Pair | 0.0005827 | 0.0005827 | 0.0005827 | 0.0 | 0.05 +Neigh | 1.2134 | 1.2134 | 1.2134 | 0.0 | 96.93 +Comm | 0.02822 | 0.02822 | 0.02822 | 0.0 | 2.25 +Output | 0.0017159 | 0.0017159 | 0.0017159 | 0.0 | 0.14 +Modify | 0.0052147 | 0.0052147 | 0.0052147 | 0.0 | 0.42 +Other | | 0.002664 | | | 0.21 Nlocal: 1 ave 1 max 1 min Histogram: 1 0 0 0 0 0 0 0 0 0 diff --git a/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.4 b/examples/USER/misc/electron_stopping/log.20Mar19.elstop.only.g++.4 similarity index 89% rename from examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.4 rename to examples/USER/misc/electron_stopping/log.20Mar19.elstop.only.g++.4 index 5ed0d86f1c..e8bd45b20f 100644 --- a/examples/USER/misc/elstop/log.20Mar19.elstop.only.g++.4 +++ b/examples/USER/misc/electron_stopping/log.20Mar19.elstop.only.g++.4 @@ -1,9 +1,9 @@ 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 -# Test case / example for the electronic stopping fix elstop +# Test case / example for fix electron/stopping # One fast atom, no other interactions. -# Elstop only applied in a smaller box in the middle. +# Stopping only applied in a smaller box in the middle. # # Also uses fix dt/reset, as one should when energies are high # enough to require electronic stopping. @@ -26,14 +26,14 @@ mass 1 28.0855 create_atoms 1 single 0 0 0 Created 1 atoms - Time spent = 2.00272e-05 secs + create_atoms CPU = 1.19209e-05 secs velocity all set 1120 1620 389 pair_style zero 1 pair_coeff * * 1 fix fdt all dt/reset 1 NULL 0.001 0.1 emax 20.0 -fix fel all elstop 1.0 Si.Si.elstop minneigh 0 region rsmallbox +fix fel all electron/stopping 1.0 Si.Si.elstop minneigh 0 region rsmallbox fix fnve all nve compute ek all ke/atom @@ -45,8 +45,6 @@ thermo_style custom step time dt f_fel c_ektot #dump mydump all custom 200 elstop.only.dump id x y z vx vy vz fx fy fz c_ek run 10000 -WARNING: More than one compute ke/atom (src/compute_ke_atom.cpp:55) -WARNING: More than one compute ke/atom (src/compute_ke_atom.cpp:55) Neighbor list info ... update every 1 steps, delay 10 steps, check yes max neighbors/atom: 2000, page size: 100000 @@ -59,7 +57,7 @@ Neighbor list info ... pair build: half/bin/atomonly/newton stencil: half/bin/3d/newton bin: standard - (2) fix elstop, occasional + (2) fix electron/stopping, occasional attributes: full, newton on pair build: full/bin/atomonly stencil: full/bin/3d @@ -167,20 +165,20 @@ Step Time Dt f_fel c_ektot 9800 0.57677384 6.0949329e-05 1947.6558 3917.8967 9900 0.58286878 6.0949329e-05 1947.6558 3917.8967 10000 0.58896371 6.0949329e-05 1947.6558 3917.8967 -Loop time of 3.82192 on 4 procs for 10000 steps with 1 atoms +Loop time of 1.38891 on 4 procs for 10000 steps with 1 atoms -Performance: 13.778 ns/day, 1.742 hours/ns, 2616.487 timesteps/s -76.8% CPU use with 4 MPI tasks x 1 OpenMP threads +Performance: 37.915 ns/day, 0.633 hours/ns, 7199.876 timesteps/s +94.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.0006454 | 0.00077975 | 0.001003 | 0.0 | 0.02 -Neigh | 1.3094 | 1.3771 | 1.441 | 4.0 | 36.03 -Comm | 0.13665 | 0.16207 | 0.20281 | 6.1 | 4.24 -Output | 0.036584 | 0.046189 | 0.060792 | 4.2 | 1.21 -Modify | 2.1326 | 2.212 | 2.3096 | 4.3 | 57.88 -Other | | 0.02382 | | | 0.62 +Pair | 0.0004971 | 0.00060463 | 0.00069618 | 0.0 | 0.04 +Neigh | 1.1005 | 1.1507 | 1.2839 | 7.2 | 82.85 +Comm | 0.025918 | 0.026382 | 0.027041 | 0.3 | 1.90 +Output | 0.0016336 | 0.005001 | 0.01507 | 8.2 | 0.36 +Modify | 0.059378 | 0.20196 | 0.25453 | 18.3 | 14.54 +Other | | 0.00422 | | | 0.30 Nlocal: 0.25 ave 1 max 0 min Histogram: 3 0 0 0 0 0 0 0 0 1 @@ -195,4 +193,4 @@ Total # of neighbors = 0 Ave neighs/atom = 0 Neighbor list builds = 960 Dangerous builds = 568 -Total wall time: 0:00:03 +Total wall time: 0:00:01 diff --git a/src/USER-MISC/README b/src/USER-MISC/README index 43deda0bdb..2ecbdc4128 100644 --- a/src/USER-MISC/README +++ b/src/USER-MISC/README @@ -45,7 +45,7 @@ dihedral_style table/cut, Mike Salerno, ksalerno@pha.jhu.edu, 11 May 18 fix addtorque, Laurent Joly (U Lyon), ljoly.ulyon at gmail.com, 8 Aug 11 fix ave/correlate/long, Jorge Ramirez (UPM Madrid), jorge.ramirez at upm.es, 21 Oct 2015 fix bond/react, Jacob Gissinger (CU Boulder), info at disarmmd.org, 24 Feb 2018 -fix elstop, Konstantin Avchaciov, k.avchachov at gmail.com, 26 Feb 2019 +fix electron/stopping, Konstantin Avchaciov, k.avchachov at gmail.com, 26 Feb 2019 fix ffl, David Wilkins (EPFL Lausanne), david.wilkins @ epfl.ch, 28 Sep 2018 fix filter/corotate, Lukas Fath (KIT), lukas.fath at kit.edu, 15 Mar 2017 fix flow/gauss, Joel Eaves (CU Boulder), Joel.Eaves@Colorado.edu, 23 Aug 2016 diff --git a/src/USER-MISC/fix_elstop.cpp b/src/USER-MISC/fix_electron_stopping.cpp similarity index 75% rename from src/USER-MISC/fix_elstop.cpp rename to src/USER-MISC/fix_electron_stopping.cpp index ac73753a62..0831ebcf89 100644 --- a/src/USER-MISC/fix_elstop.cpp +++ b/src/USER-MISC/fix_electron_stopping.cpp @@ -19,7 +19,7 @@ #include #include #include -#include "fix_elstop.h" +#include "fix_electron_stopping.h" #include "mpi.h" #include "atom.h" #include "update.h" @@ -42,7 +42,7 @@ using namespace FixConst; /* ---------------------------------------------------------------------- */ -FixElstop::FixElstop(LAMMPS *lmp, int narg, char **arg) : +FixElectronStopping::FixElectronStopping(LAMMPS *lmp, int narg, char **arg) : Fix(lmp, narg, arg) { scalar_flag = 1; // Has compute_scalar @@ -51,16 +51,17 @@ FixElstop::FixElstop(LAMMPS *lmp, int narg, char **arg) : nevery = 1; // Run fix every step - // args: 0 = fix ID, 1 = group ID, 2 = "elstop" + // args: 0 = fix ID, 1 = group ID, 2 = "electron/stopping" // 3 = Ecut, 4 = file path // optional rest: "region" // "minneigh" - if (narg < 5) - error->all(FLERR, "Illegal fix elstop command: too few arguments"); + if (narg < 5) error->all(FLERR, + "Illegal fix electron/stopping command: too few arguments"); Ecut = force->numeric(FLERR, arg[3]); - if (Ecut <= 0.0) error->all(FLERR, "Illegal fix elstop command: Ecut <= 0"); + if (Ecut <= 0.0) error->all(FLERR, + "Illegal fix electron/stopping command: Ecut <= 0"); int iarg = 5; iregion = -1; @@ -69,27 +70,28 @@ FixElstop::FixElstop(LAMMPS *lmp, int narg, char **arg) : while (iarg < narg) { if (strcmp(arg[iarg], "region") == 0) { - if (iregion >= 0) - error->all(FLERR, "Illegal fix elstop command: region given twice"); - if (iarg+2 > narg) - error->all(FLERR, "Illegal fix elstop command: region name missing"); + if (iregion >= 0) error->all(FLERR, + "Illegal fix electron/stopping command: region given twice"); + if (iarg+2 > narg) error->all(FLERR, + "Illegal fix electron/stopping command: region name missing"); iregion = domain->find_region(arg[iarg+1]); - if (iregion < 0) - error->all(FLERR, "Region ID for fix elstop does not exist"); + if (iregion < 0) error->all(FLERR, + "Region ID for fix electron/stopping does not exist"); iarg += 2; } else if (strcmp(arg[iarg], "minneigh") == 0) { - if (minneighflag) - error->all(FLERR, "Illegal fix elstop command: minneigh given twice"); + if (minneighflag) error->all(FLERR, + "Illegal fix electron/stopping command: minneigh given twice"); minneighflag = true; - if (iarg+2 > narg) - error->all(FLERR, "Illegal fix elstop command: minneigh number missing"); + if (iarg+2 > narg) error->all(FLERR, + "Illegal fix electron/stopping command: minneigh number missing"); minneigh = force->inumeric(FLERR, arg[iarg+1]); - if (minneigh < 0) - error->all(FLERR, "Illegal fix elstop command: minneigh < 0"); + if (minneigh < 0) error->all(FLERR, + "Illegal fix electron/stopping command: minneigh < 0"); iarg += 2; } - else error->all(FLERR, "Illegal fix elstop command: unknown argument"); + else error->all(FLERR, + "Illegal fix electron/stopping command: unknown argument"); } @@ -98,7 +100,7 @@ FixElstop::FixElstop(LAMMPS *lmp, int narg, char **arg) : const int ncol = atom->ntypes + 1; if (comm->me == 0) { maxlines = 300; - memory->create(elstop_ranges, ncol, maxlines, "elstop:tabs"); + memory->create(elstop_ranges, ncol, maxlines, "electron/stopping:table"); read_table(arg[4]); } @@ -106,21 +108,21 @@ FixElstop::FixElstop(LAMMPS *lmp, int narg, char **arg) : MPI_Bcast(&table_entries, 1 , MPI_INT, 0, world); if (comm->me != 0) - memory->create(elstop_ranges, ncol, maxlines, "elstop:tabs"); + memory->create(elstop_ranges, ncol, maxlines, "electron/stopping:table"); MPI_Bcast(&elstop_ranges[0][0], ncol*maxlines, MPI_DOUBLE, 0, world); } /* ---------------------------------------------------------------------- */ -FixElstop::~FixElstop() +FixElectronStopping::~FixElectronStopping() { memory->destroy(elstop_ranges); } /* ---------------------------------------------------------------------- */ -int FixElstop::setmask() +int FixElectronStopping::setmask() { int mask = 0; mask |= POST_FORCE; @@ -129,7 +131,7 @@ int FixElstop::setmask() /* ---------------------------------------------------------------------- */ -void FixElstop::init() +void FixElectronStopping::init() { SeLoss_sync_flag = 0; SeLoss = 0.0; @@ -145,14 +147,14 @@ void FixElstop::init() /* ---------------------------------------------------------------------- */ -void FixElstop::init_list(int /*id*/, NeighList *ptr) +void FixElectronStopping::init_list(int /*id*/, NeighList *ptr) { list = ptr; } /* ---------------------------------------------------------------------- */ -void FixElstop::post_force(int /*vflag*/) +void FixElectronStopping::post_force(int /*vflag*/) { SeLoss_sync_flag = 0; @@ -183,8 +185,8 @@ void FixElstop::post_force(int /*vflag*/) if (energy < Ecut) continue; if (energy < elstop_ranges[0][0]) continue; - if (energy > elstop_ranges[0][table_entries - 1]) - error->one(FLERR, "Atom kinetic energy too high for fix elstop"); + if (energy > elstop_ranges[0][table_entries - 1]) error->one(FLERR, + "Atom kinetic energy too high for fix electron/stopping"); if (iregion >= 0) { // Only apply in the given region @@ -207,7 +209,7 @@ void FixElstop::post_force(int /*vflag*/) double E_lo = elstop_ranges[0][idown]; double E_hi = elstop_ranges[0][iup]; - // Get elstop with a simple linear interpolation + // Get electronic stopping with a simple linear interpolation double Se = (Se_hi - Se_lo) / (E_hi - E_lo) * (energy - E_lo) + Se_lo; double vabs = sqrt(v2); @@ -223,7 +225,7 @@ void FixElstop::post_force(int /*vflag*/) /* ---------------------------------------------------------------------- */ -double FixElstop::compute_scalar() +double FixElectronStopping::compute_scalar() { // only sum across procs when changed since last call @@ -236,7 +238,7 @@ double FixElstop::compute_scalar() /* ---------------------------------------------------------------------- */ -void FixElstop::read_table(const char *file) +void FixElectronStopping::read_table(const char *file) { char line[MAXLINE]; @@ -266,30 +268,31 @@ void FixElstop::read_table(const char *file) } if (i != ncol || pch != NULL) // too short or too long - error->one(FLERR, "fix elstop: Invalid table line"); + error->one(FLERR, "fix electron/stopping: Invalid table line"); if (l >= 1 && elstop_ranges[0][l] <= elstop_ranges[0][l-1]) - error->one(FLERR, "fix elstop: Energies must be in ascending order"); + error->one(FLERR, + "fix electron/stopping: Energies must be in ascending order"); l++; } table_entries = l; if (table_entries == 0) - error->one(FLERR, "Did not find any data in elstop table file"); + error->one(FLERR, "Did not find any data in electron/stopping table file"); fclose(fp); } /* ---------------------------------------------------------------------- */ -void FixElstop::grow_table() +void FixElectronStopping::grow_table() { const int ncol = atom->ntypes + 1; int new_maxlines = 2 * maxlines; double **new_array; - memory->create(new_array, ncol, new_maxlines, "elstop:tabscopy"); + memory->create(new_array, ncol, new_maxlines, "electron/stopping:table"); for (int i = 0; i < ncol; i++) memcpy(new_array[i], elstop_ranges[i], maxlines*sizeof(double)); diff --git a/src/USER-MISC/fix_elstop.h b/src/USER-MISC/fix_electron_stopping.h similarity index 66% rename from src/USER-MISC/fix_elstop.h rename to src/USER-MISC/fix_electron_stopping.h index afb9fd813a..f0f47698c6 100644 --- a/src/USER-MISC/fix_elstop.h +++ b/src/USER-MISC/fix_electron_stopping.h @@ -18,22 +18,22 @@ #ifdef FIX_CLASS -FixStyle(elstop,FixElstop) +FixStyle(electron/stopping,FixElectronStopping) #else -#ifndef LMP_FIX_ELSTOP_H -#define LMP_FIX_ELSTOP_H +#ifndef LMP_FIX_ELECTRON_STOPPING_H +#define LMP_FIX_ELECTRON_STOPPING_H #include "fix.h" namespace LAMMPS_NS { -class FixElstop : public Fix { +class FixElectronStopping : public Fix { public: - FixElstop(class LAMMPS *, int, char **); - ~FixElstop(); + FixElectronStopping(class LAMMPS *, int, char **); + ~FixElectronStopping(); int setmask(); void init(); void post_force(int); @@ -72,33 +72,33 @@ 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: Region ID for fix elstop does not exist +E: Region ID for fix electron/stopping does not exist Self-explanatory. -E: Atom kinetic energy too high for fix elstop +E: Atom kinetic energy too high for fix electron/stopping -The group given in the fix elstop command includes an atom that has -a kinetic energy higher than the largest energy in the elstop table. -Reconsider whether the table is physically applicable to your system. +The group given in the fix electron/stopping command includes an atom +that has a kinetic energy higher than the largest energy in the stopping +table. Reconsider whether the table is physically applicable to your system. E: Cannot open stopping range table ... -The file containing the elstop table could not be opened. Chck the -given path and the file's permissions. +The file containing the electronic stopping table could not be opened. +Check the given path and the file's permissions. -E: fix elstop: Invalid table line +E: fix electron/stopping: Invalid table line -A line in the elstop table file contained too many or too few columns. +A line in the stopping table file contained too many or too few columns. -E: fix elstop: Energies must be in ascending order +E: fix electron/stopping: Energies must be in ascending order -The first column in the elstop table must be sorted from the smallest +The first column in the stopping table must be sorted from the smallest energy to the largest. -E: Did not find any data in elstop table file +E: Did not find any data in electronic stopping table file -Parsing the elstop table file produced no lines that were identifiable +Parsing the stopping table file produced no lines that were identifiable as energies/stopping powers. Most likely the file is empty or contains only comments. From 6ff1fee6d656a084c95a70f372a5b46c79c3df0e Mon Sep 17 00:00:00 2001 From: mkanski Date: Thu, 4 Apr 2019 09:54:39 +0200 Subject: [PATCH 0448/1242] more simplifications --- src/USER-REAXC/pair_reaxc.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index c87bb410ce..6bb2b9a197 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -109,8 +109,8 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) system->bndry_cuts.ghost_cutoff = 0; system->my_atoms = NULL; system->pair_ptr = this; - system->error_ptr = this->lmp->error; - control->error_ptr = this->lmp->error; + system->error_ptr = error; + control->error_ptr = error; system->omp_active = 0; @@ -447,7 +447,7 @@ void PairReaxC::setup( ) if(!Make_List(system->total_cap, num_nbrs, TYP_FAR_NEIGHBOR, lists+FAR_NBRS)) error->one(FLERR,"Pair reax/c problem in far neighbor list"); - (lists+FAR_NBRS)->error_ptr=lmp->error; + (lists+FAR_NBRS)->error_ptr=error; write_reax_lists(); Initialize( system, control, data, workspace, &lists, out_control, From da77dde04de70a75a215a7bd0044e757d189352a Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Thu, 4 Apr 2019 14:32:49 +0300 Subject: [PATCH 0449/1242] MC/fix_bond_break: Use TAGINT_FORMAT where appropriate --- src/MC/fix_bond_break.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/MC/fix_bond_break.cpp b/src/MC/fix_bond_break.cpp index a1c9bb3ab0..05edc0509e 100644 --- a/src/MC/fix_bond_break.cpp +++ b/src/MC/fix_bond_break.cpp @@ -800,26 +800,27 @@ void FixBondBreak::print_bb() for (int i = 0; i < atom->nlocal; i++) { printf("TAG " TAGINT_FORMAT ": %d nbonds: ",atom->tag[i],atom->num_bond[i]); for (int j = 0; j < atom->num_bond[i]; j++) { - printf(" %d",atom->bond_atom[i][j]); + printf(" " TAGINT_FORMAT, atom->bond_atom[i][j]); } printf("\n"); printf("TAG " TAGINT_FORMAT ": %d nangles: ",atom->tag[i],atom->num_angle[i]); for (int j = 0; j < atom->num_angle[i]; j++) { - printf(" %d %d %d,",atom->angle_atom1[i][j], - atom->angle_atom2[i][j],atom->angle_atom3[i][j]); + printf(" " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT ",", + atom->angle_atom1[i][j],atom->angle_atom2[i][j], + atom->angle_atom3[i][j]); } printf("\n"); printf("TAG " TAGINT_FORMAT ": %d ndihedrals: ",atom->tag[i],atom->num_dihedral[i]); for (int j = 0; j < atom->num_dihedral[i]; j++) { - printf(" %d %d %d %d,",atom->dihedral_atom1[i][j], - atom->dihedral_atom2[i][j],atom->dihedral_atom3[i][j], - atom->dihedral_atom4[i][j]); + printf(" " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT ",", + atom->dihedral_atom1[i][j],atom->dihedral_atom2[i][j], + atom->dihedral_atom3[i][j],atom->dihedral_atom4[i][j]); } printf("\n"); printf("TAG " TAGINT_FORMAT ": %d %d %d nspecial: ",atom->tag[i], atom->nspecial[i][0],atom->nspecial[i][1],atom->nspecial[i][2]); for (int j = 0; j < atom->nspecial[i][2]; j++) { - printf(" %d",atom->special[i][j]); + printf(" " TAGINT_FORMAT, atom->special[i][j]); } printf("\n"); } @@ -830,7 +831,7 @@ void FixBondBreak::print_bb() void FixBondBreak::print_copy(const char *str, tagint m, int n1, int n2, int n3, int *v) { - printf("%s %i: %d %d %d nspecial: ",str,m,n1,n2,n3); + printf("%s " TAGINT_FORMAT ": %d %d %d nspecial: ",str,m,n1,n2,n3); for (int j = 0; j < n3; j++) printf(" %d",v[j]); printf("\n"); } From 66794692201d4345cde7aaa5573b4cf4f06cdea7 Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Thu, 4 Apr 2019 15:35:44 +0300 Subject: [PATCH 0450/1242] USER-MANIFOLD: Use TAGINT_FORMAT where appropriate --- src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp b/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp index 794a324f03..de134e32ed 100644 --- a/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp +++ b/src/USER-MANIFOLD/fix_nve_manifold_rattle.cpp @@ -559,7 +559,8 @@ void FixNVEManifoldRattle::rattle_manifold_x(double *x, double *v, if (iters >= max_iter && res > tolerance) { char msg[2048]; - sprintf(msg,"Failed to constrain atom %d (x = (%f, %f, %f)! res = %e, iters = %d\n", + sprintf(msg,"Failed to constrain atom " TAGINT_FORMAT + " (x = (%f, %f, %f)! res = %e, iters = %d\n", tagi, x[0], x[1], x[2], res, iters); error->one(FLERR,msg); } @@ -652,7 +653,8 @@ void FixNVEManifoldRattle::rattle_manifold_v(double *v, double *f, if (iters >= max_iter && res >= tolerance) { char msg[2048]; - sprintf(msg,"Failed to constrain atom %d (x = (%f, %f, %f)! res = %e, iters = %d\n", + sprintf(msg,"Failed to constrain atom " TAGINT_FORMAT + " (x = (%f, %f, %f)! res = %e, iters = %d\n", tagi, x[0], x[1], x[2], res, iters); error->all(FLERR,msg); } From 2aa7a150b48fbbf080087000d9f7096d8d449e42 Mon Sep 17 00:00:00 2001 From: Risto Toijala Date: Thu, 4 Apr 2019 15:38:53 +0300 Subject: [PATCH 0451/1242] USER-SMD: Use TAGINT_FORMAT where appropriate --- src/USER-SMD/pair_smd_tlsph.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/USER-SMD/pair_smd_tlsph.cpp b/src/USER-SMD/pair_smd_tlsph.cpp index ac67a3279a..1d7bbca780 100644 --- a/src/USER-SMD/pair_smd_tlsph.cpp +++ b/src/USER-SMD/pair_smd_tlsph.cpp @@ -308,7 +308,7 @@ void PairTlsph::PreCompute() { */ if ((detF[i] < DETF_MIN) || (detF[i] > DETF_MAX) || (numNeighsRefConfig[i] == 0)) { - printf("deleting particle [%d] because det(F)=%f is outside stable range %f -- %f \n", tag[i], + printf("deleting particle [" TAGINT_FORMAT "] because det(F)=%f is outside stable range %f -- %f \n", tag[i], Fincr[i].determinant(), DETF_MIN, DETF_MAX); printf("nn = %d, damage=%f\n", numNeighsRefConfig[i], damage[i]); From 8c03f510203f3aebd9b2e44854b904477711d438 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 09:01:39 -0400 Subject: [PATCH 0452/1242] fix 32-bit/64-bit overflow issue in expression --- src/irregular.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/irregular.cpp b/src/irregular.cpp index 848d853f2a..1865f9cbf6 100644 --- a/src/irregular.cpp +++ b/src/irregular.cpp @@ -921,7 +921,7 @@ void Irregular::exchange_data(char *sendbuf, int nbytes, char *recvbuf) // post all receives, starting after self copies - bigint offset = num_self*nbytes; + bigint offset = num_self*(bigint)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]); @@ -964,13 +964,6 @@ 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 - // DEBUG lines - - //bigint irregular_bytes = 2*nprocs*sizeof(int); - //irregular_bytes += maxindex*sizeof(int); - //irregular_bytes += maxbuf; } /* ---------------------------------------------------------------------- From 88d160f86eba2ae19322a8335fafc1228650f3c4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 09:13:18 -0400 Subject: [PATCH 0453/1242] avoid segfault in Special::angle_trim() if only angles or only dihedrals are defined --- src/special.cpp | 201 ++++++++++++++++++++++++++---------------------- 1 file changed, 107 insertions(+), 94 deletions(-) diff --git a/src/special.cpp b/src/special.cpp index 7f855163e0..903794c0f6 100644 --- a/src/special.cpp +++ b/src/special.cpp @@ -821,21 +821,26 @@ 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 (num_angle) { + 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++; + + if (num_dihedral) { + 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++; + } } } @@ -852,51 +857,55 @@ 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 (num_angle) { + 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_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 (num_dihedral) { + 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_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++; + } } } } @@ -932,56 +941,60 @@ void Special::angle_trim() // 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; + if (num_angle) { + 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_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 (num_dihedral) { + 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_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; + } + } } } } @@ -1012,7 +1025,7 @@ void Special::angle_trim() memory->destroy(flag); - // if no angles or dihedrals are defined, delete all 1-3 neighs + // if no angles or dihedrals are defined, delete all 1-3 neighs } else { for (i = 0; i < nlocal; i++) nspecial[i][1] = 0; From a9c376f20d735cccf3527fe42ea57988ed4e9286 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 09:38:28 -0400 Subject: [PATCH 0454/1242] use tagint instead of int when communicating atom ids --- src/USER-MISC/fix_pimd.cpp | 8 ++++---- src/USER-MISC/fix_pimd.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/USER-MISC/fix_pimd.cpp b/src/USER-MISC/fix_pimd.cpp index eba8ed5d0c..3929d47d6b 100644 --- a/src/USER-MISC/fix_pimd.cpp +++ b/src/USER-MISC/fix_pimd.cpp @@ -637,14 +637,14 @@ void FixPIMD::comm_exec(double **ptr) if(nsend > max_nsend) { max_nsend = nsend+200; - tag_send = (int*) memory->srealloc(tag_send, sizeof(int)*max_nsend, "FixPIMD:tag_send"); + tag_send = (tagint*) memory->srealloc(tag_send, sizeof(tagint)*max_nsend, "FixPIMD:tag_send"); buf_send = (double*) memory->srealloc(buf_send, sizeof(double)*max_nsend*3, "FixPIMD:x_send"); } // send tags - MPI_Sendrecv( atom->tag, nlocal, MPI_INT, plan_send[iplan], 0, - tag_send, nsend, MPI_INT, plan_recv[iplan], 0, universe->uworld, MPI_STATUS_IGNORE); + MPI_Sendrecv( atom->tag, nlocal, MPI_LMP_TAGINT, plan_send[iplan], 0, + tag_send, nsend, MPI_LMP_TAGINT, plan_recv[iplan], 0, universe->uworld, MPI_STATUS_IGNORE); // wrap positions @@ -661,7 +661,7 @@ void FixPIMD::comm_exec(double **ptr) sprintf(error_line, "Atom " TAGINT_FORMAT " is missing at world [%d] " "rank [%d] required by rank [%d] (" TAGINT_FORMAT ", " - TAGINT_FORMAT ", " TAGINT_FORMAT ").\n",tag_send[i], + TAGINT_FORMAT ", " TAGINT_FORMAT ").\n", tag_send[i], universe->iworld, comm->me, plan_recv[iplan], atom->tag[0], atom->tag[1], atom->tag[2]); diff --git a/src/USER-MISC/fix_pimd.h b/src/USER-MISC/fix_pimd.h index 411fa42c81..c298af0b69 100644 --- a/src/USER-MISC/fix_pimd.h +++ b/src/USER-MISC/fix_pimd.h @@ -68,7 +68,7 @@ class FixPIMD : public Fix { /* inter-partition communication */ int max_nsend; - int* tag_send; + tagint* tag_send; double *buf_send; int max_nlocal; From 50427ce05df76592752414c7c22194f245a112bb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 09:38:53 -0400 Subject: [PATCH 0455/1242] flag intended fallthrough cases for GNU compilers --- src/hashlittle.cpp | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp index 0abcd2bcc5..38f192ad76 100644 --- a/src/hashlittle.cpp +++ b/src/hashlittle.cpp @@ -23,6 +23,16 @@ # endif #endif +// declaration to indicate intended fallthrough cases in switch statements +// and thus silence the warnings produced by g++ -Wextra + +#if defined(__GNUC__) +#define _fallthrough __attribute__ ((fallthrough)) +#else +#define _fallthrough +#endif + + #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) /* @@ -291,17 +301,17 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval) /*-------------------------------- 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 12: c+=((uint32_t)k[11])<<24; _fallthrough; + case 11: c+=((uint32_t)k[10])<<16; _fallthrough; + case 10: c+=((uint32_t)k[9])<<8; _fallthrough; + case 9 : c+=k[8]; _fallthrough; + case 8 : b+=((uint32_t)k[7])<<24; _fallthrough; + case 7 : b+=((uint32_t)k[6])<<16; _fallthrough; + case 6 : b+=((uint32_t)k[5])<<8; _fallthrough; + case 5 : b+=k[4]; _fallthrough; + case 4 : a+=((uint32_t)k[3])<<24; _fallthrough; + case 3 : a+=((uint32_t)k[2])<<16; _fallthrough; + case 2 : a+=((uint32_t)k[1])<<8; _fallthrough; case 1 : a+=k[0]; break; case 0 : return c; From 81dd96f970250616d4663a0f824bf100a1008f47 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 12:42:54 -0400 Subject: [PATCH 0456/1242] print more meaningful error message when trying to access individual data from a local array produced by a compute */local --- src/variable.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/variable.cpp b/src/variable.cpp index c0e4dae7d0..ed3b41bd00 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -1578,6 +1578,8 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) newtree->nextra = 0; treestack[ntreestack++] = newtree; + } else if (nbracket == 1 && compute->local_flag) { + print_var_error(FLERR,"Cannot access local data via indexing",ivar); } else print_var_error(FLERR, "Mismatched compute in variable formula",ivar); From 265ad4512dfa6f8be1cb0f28abfb4b9d3ffbf4d4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 13:18:27 -0400 Subject: [PATCH 0457/1242] add sanity check on plumed pre-installed path location --- lib/plumed/Install.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/plumed/Install.py b/lib/plumed/Install.py index 70296b35d3..2ae5aadd03 100644 --- a/lib/plumed/Install.py +++ b/lib/plumed/Install.py @@ -75,6 +75,8 @@ if pathflag: if not os.path.isdir(plumedpath): sys.exit("Plumed2 path %s does not exist" % plumedpath) homedir = fullpath(plumedpath) + if not os.path.isdir(os.path.join(homedir, 'include', 'plumed', 'core')): + sys.exit("No Plumed2 installation found at %s" % plumedpath) # download and unpack plumed2 tarball From c52a330a79b674c28cced21879a562fb180c896f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 14:04:12 -0400 Subject: [PATCH 0458/1242] update USER-PLUMED support for version 2.5.1 and fix bug in Install.py script --- cmake/CMakeLists.txt | 11 +++++------ lib/plumed/Install.py | 6 ++++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index fd93814574..b9a93a110e 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -367,7 +367,7 @@ if(PKG_KSPACE) endif() endif() -if(PKG_MSCG OR PKG_USER-ATC OR PKG_USER-AWPMD OR PKG_USER-QUIP OR PKG_LATTE) +if(PKG_MSCG OR PKG_USER-ATC OR PKG_USER-AWPMD OR PKG_USER-PLUMED OR PKG_USER-QUIP OR PKG_LATTE) find_package(LAPACK) find_package(BLAS) if(NOT LAPACK_FOUND OR NOT BLAS_FOUND) @@ -577,8 +577,8 @@ if(PKG_USER-PLUMED) message(STATUS "PLUMED download requested - we will build our own") include(ExternalProject) ExternalProject_Add(plumed_build - URL https://github.com/plumed/plumed2/releases/download/v2.4.4/plumed-src-2.4.4.tgz - URL_MD5 71ed465bdc7c2059e282dbda8d564e71 + URL https://github.com/plumed/plumed2/releases/download/v2.5.1/plumed-src-2.5.1.tgz + URL_MD5 c2a7b519e32197a120cdf47e0f194f81 BUILD_IN_SOURCE 1 CONFIGURE_COMMAND /configure --prefix= ${CONFIGURE_REQUEST_PIC} @@ -593,10 +593,9 @@ if(PKG_USER-PLUMED) list(APPEND LAMMPS_DEPS plumed_build) if(PLUMED_MODE STREQUAL "STATIC") add_definitions(-D__PLUMED_WRAPPER_CXX=1) - list(APPEND LAMMPS_LINK_LIBS ${PLUMED_INSTALL_DIR}/lib/plumed/obj/kernel.o - "${PLUMED_INSTALL_DIR}/lib/plumed/obj/PlumedStatic.o" ${GSL_LIBRARIES} ${CMAKE_DL_LIBS}) + list(APPEND LAMMPS_LINK_LIBS ${PLUMED_INSTALL_DIR}/lib/libplumed.a ${GSL_LIBRARIES} ${LAPACK_LIBRARIES} ${CMAKE_DL_LIBS}) elseif(PLUMED_MODE STREQUAL "SHARED") - list(APPEND LAMMPS_LINK_LIBS ${PLUMED_INSTALL_DIR}/lib/libplumed.so ${CMAKE_DL_LIBS}) + list(APPEND LAMMPS_LINK_LIBS ${PLUMED_INSTALL_DIR}/lib/libplumed.so ${PLUMED_INSTALL_DIR}/lib/libplumedKernel.so ${CMAKE_DL_LIBS}) elseif(PLUMED_MODE STREQUAL "RUNTIME") add_definitions(-D__PLUMED_HAS_DLOPEN=1 -D__PLUMED_DEFAULT_KERNEL=${PLUMED_INSTALL_DIR}/lib/libplumedKernel.so) list(APPEND LAMMPS_LINK_LIBS ${PLUMED_INSTALL_DIR}/lib/libplumedWrapper.a -rdynamic ${CMAKE_DL_LIBS}) diff --git a/lib/plumed/Install.py b/lib/plumed/Install.py index 2ae5aadd03..3623a8cff0 100644 --- a/lib/plumed/Install.py +++ b/lib/plumed/Install.py @@ -17,7 +17,7 @@ parser = ArgumentParser(prog='Install.py', # settings -version = "2.4.4" +version = "2.5.1" mode = "static" # help message @@ -43,6 +43,7 @@ checksums = { \ '2.4.3' : 'b1be7c48971627febc11c61b70767fc5', \ '2.4.4' : '71ed465bdc7c2059e282dbda8d564e71', \ '2.5.0' : '6224cd089493661e19ceacccd35cf911', \ + '2.5.1' : 'c2a7b519e32197a120cdf47e0f194f81', \ } # parse and process arguments @@ -67,6 +68,7 @@ if not args.build and not args.path: buildflag = args.build pathflag = args.path is not None plumedpath = args.path +mode = args.mode homepath = fullpath('.') homedir = "%s/plumed2" % (homepath) @@ -129,7 +131,7 @@ if os.path.isfile("Makefile.lammps.%s" % mode): lines1 = open(plumedinc, 'r').readlines() lines2 = open("Makefile.lammps.%s" % mode, 'r').readlines() fp = open("Makefile.lammps", 'w') - fp.write(os.path.join("PLUMED_LIBDIR=", homedir, "lib\n")) + fp.write("PLUMED_LIBDIR=" + os.path.join(homedir, "lib\n")) for line in lines1: fp.write(line) for line in lines2: From 78bab6ee395f39fad5374dfdd90d4953353b7c8c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 16:36:57 -0400 Subject: [PATCH 0459/1242] make format macros in USER-REAXC compatible with -DLAMMPS_BIGBIG --- src/USER-REAXC/reaxc_traj.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/USER-REAXC/reaxc_traj.h b/src/USER-REAXC/reaxc_traj.h index 72c56637eb..b04a190965 100644 --- a/src/USER-REAXC/reaxc_traj.h +++ b/src/USER-REAXC/reaxc_traj.h @@ -42,7 +42,7 @@ #define SCI_LINE "%-37s%-24g\n" #define REAL3_LINE "%-32s%9.3f,%9.3f,%9.3f\n" -#define INIT_DESC "%9d%3d%9s%10.3f\n" //AtomID - AtomType, AtomName, AtomMass +#define INIT_DESC TAGINT_FORMAT "%3d%9s%10.3f\n" //AtomID - AtomType, AtomName, AtomMass #define INIT_DESC_LEN 32 #define SIZE_INFO_LINE2 "%-10d%-10d\n" @@ -51,21 +51,21 @@ #define SIZE_INFO_LINE3 "%-10d%-10d%-10d\n" #define SIZE_INFO_LEN3 31 -#define ATOM_BASIC "%9d%10.3f%10.3f%10.3f%10.3f\n" //AtomID AtomType (X Y Z) Charge +#define ATOM_BASIC TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f\n" //AtomID AtomType (X Y Z) Charge #define ATOM_BASIC_LEN 50 -#define ATOM_wV "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) Charge +#define ATOM_wV TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) Charge #define ATOM_wV_LEN 80 -#define ATOM_wF "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Fx Fy Fz) Charge +#define ATOM_wF TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Fx Fy Fz) Charge #define ATOM_wF_LEN 80 -#define ATOM_FULL "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) (Fx Fy Fz) Charge +#define ATOM_FULL TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) (Fx Fy Fz) Charge #define ATOM_FULL_LEN 110 -#define BOND_BASIC "%9d%9d%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO +#define BOND_BASIC TAGINT_FORMAT " " TAGINT_FORMAT " %10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO #define BOND_BASIC_LEN 39 -#define BOND_FULL "%9d%9d%10.3f%10.3f%10.3f%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO BOs BOpi BOpi2 +#define BOND_FULL TAGINT_FORMAT " " TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO BOs BOpi BOpi2 #define BOND_FULL_LEN 69 -#define ANGLE_BASIC "%9d%9d%9d%10.3f\n" // Atom1 Atom2 Atom3 Theta +#define ANGLE_BASIC TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " %10.3f\n" // Atom1 Atom2 Atom3 Theta #define ANGLE_BASIC_LEN 38 enum ATOM_LINE_OPTS { OPT_NOATOM = 0, OPT_ATOM_BASIC = 4, OPT_ATOM_wF = 5, OPT_ATOM_wV = 6, OPT_ATOM_FULL = 7, NR_OPT_ATOM = 8 }; From ab5c3b038623b2e77a24470fc3eca9e3eb53eff4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 16:51:37 -0400 Subject: [PATCH 0460/1242] protect against possible buffer overflow --- src/KSPACE/fix_tune_kspace.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/KSPACE/fix_tune_kspace.cpp b/src/KSPACE/fix_tune_kspace.cpp index 3e90988cba..0c726985dc 100644 --- a/src/KSPACE/fix_tune_kspace.cpp +++ b/src/KSPACE/fix_tune_kspace.cpp @@ -99,8 +99,8 @@ void FixTuneKspace::init() error->all(FLERR,"Cannot use fix tune/kspace with dipole long-range solver"); double old_acc = force->kspace->accuracy/force->kspace->two_charge_force; - char old_acc_str[12]; - sprintf(old_acc_str,"%g",old_acc); + char old_acc_str[16]; + snprintf(old_acc_str,16,"%g",old_acc); strcpy(new_acc_str,old_acc_str); int itmp; @@ -210,8 +210,8 @@ void FixTuneKspace::store_old_kspace_settings() strcpy(old_kspace_style,force->kspace_style); strcpy(new_kspace_style,old_kspace_style); double old_acc = force->kspace->accuracy_relative; - char old_acc_str[12]; - sprintf(old_acc_str,"%g",old_acc); + char old_acc_str[16]; + snprintf(old_acc_str,16,"%g",old_acc); strcpy(new_pair_style,force->pair_style); strcpy(base_pair_style,force->pair_style); char *trunc; From 4003387fb10e73badd1709fd709fe182d5991999 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 16:51:59 -0400 Subject: [PATCH 0461/1242] dead code removal --- src/REPLICA/fix_hyper_global.cpp | 2 -- src/REPLICA/fix_hyper_local.cpp | 8 ++------ src/REPLICA/hyper.cpp | 2 +- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/REPLICA/fix_hyper_global.cpp b/src/REPLICA/fix_hyper_global.cpp index 6924fe2d93..0c76b29911 100644 --- a/src/REPLICA/fix_hyper_global.cpp +++ b/src/REPLICA/fix_hyper_global.cpp @@ -191,8 +191,6 @@ void FixHyperGlobal::pre_neighbor() 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; diff --git a/src/REPLICA/fix_hyper_local.cpp b/src/REPLICA/fix_hyper_local.cpp index dc7a0b94b9..a6db4419f0 100644 --- a/src/REPLICA/fix_hyper_local.cpp +++ b/src/REPLICA/fix_hyper_local.cpp @@ -353,8 +353,6 @@ void FixHyperLocal::pre_neighbor() 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; @@ -407,7 +405,7 @@ void FixHyperLocal::pre_neighbor() 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 delx,dely,delz; double r,r0,estrain,emax,ebias,vbias,fbias,fbiasr; double halfstrain,selfstrain; int *ilist,*jlist,*numneigh,**firstneigh; @@ -811,7 +809,7 @@ void FixHyperLocal::min_pre_neighbor() void FixHyperLocal::build_bond_list(int natom) { int i,j,ii,jj,m,n,iold,jold,ilocal,jlocal,inum,jnum,nbond; - tagint itag,jtag; + tagint jtag; double xtmp,ytmp,ztmp,delx,dely,delz,rsq,distsq,oldcoeff; int *ilist,*jlist,*numneigh,**firstneigh; @@ -1006,7 +1004,6 @@ void FixHyperLocal::build_bond_list(int natom) ytmp = x[i][1]; ztmp = x[i][2]; - itag = tag[i]; tagold[i] = tag[i]; jlist = firstneigh[i]; @@ -1420,7 +1417,6 @@ double FixHyperLocal::compute_vector(int i) } if (i == 4) { - const int nlocal = atom->nlocal; bigint allneigh,thisneigh; thisneigh = listfull->ipage->ndatum; MPI_Allreduce(&thisneigh,&allneigh,1,MPI_LMP_BIGINT,MPI_SUM,world); diff --git a/src/REPLICA/hyper.cpp b/src/REPLICA/hyper.cpp index 5d820b2e27..00b91684e9 100644 --- a/src/REPLICA/hyper.cpp +++ b/src/REPLICA/hyper.cpp @@ -268,7 +268,7 @@ void Hyper::command(int narg, char **arg) double nnewbond,avenbias,avebiascoeff,minbiascoeff,maxbiascoeff; double maxbondperatom,neighbondperbond,avebiasnow; double tbondbuild,rmaxever,rmaxeverbig,allghost_toofar; - double lostbond,lostbondcoeff,biasoverlap; + double biasoverlap; if (hyperenable) { t_hyper = fix_hyper->query(1); From df94e80bb1be510b9c6df8a73059719ae30f8c35 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 16:52:08 -0400 Subject: [PATCH 0462/1242] silence compiler warnings --- src/USER-COLVARS/fix_colvars.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/USER-COLVARS/fix_colvars.cpp b/src/USER-COLVARS/fix_colvars.cpp index 0e4e151c3d..545ceb7b0e 100644 --- a/src/USER-COLVARS/fix_colvars.cpp +++ b/src/USER-COLVARS/fix_colvars.cpp @@ -645,7 +645,7 @@ void FixColvars::setup(int vflag) /* ---------------------------------------------------------------------- */ /* Main colvars handler: * Send coodinates and add colvar forces to atoms. */ -void FixColvars::post_force(int vflag) +void FixColvars::post_force(int /*vflag*/) { // some housekeeping: update status of the proxy as needed. if (me == 0) { @@ -816,7 +816,7 @@ void FixColvars::min_post_force(int vflag) } /* ---------------------------------------------------------------------- */ -void FixColvars::post_force_respa(int vflag, int ilevel, int iloop) +void FixColvars::post_force_respa(int vflag, int ilevel, int /*iloop*/) { /* only process colvar forces on the outmost RESPA level. */ if (ilevel == nlevels_respa-1) post_force(vflag); From dbbf198edb4edf36a06550ea20a1a3bf02784864 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 17:10:27 -0400 Subject: [PATCH 0463/1242] more accurate matching of styles using utils::strmatch() --- src/info.cpp | 3 ++- src/respa.cpp | 3 ++- src/velocity.cpp | 9 +++++---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/info.cpp b/src/info.cpp index 3d8a8d7b9e..ac2ee4a96d 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -42,6 +42,7 @@ #include "variable.h" #include "update.h" #include "error.h" +#include "utils.h" #include #include @@ -397,7 +398,7 @@ void Info::command(int narg, char **arg) fprintf(out,"Atoms = " BIGINT_FORMAT ", types = %d, style = %s\n", atom->natoms, atom->ntypes, force->pair_style); - if (force->pair && strstr(force->pair_style,"hybrid")) { + if (force->pair && utils::strmatch(force->pair_style,"^hybrid")) { PairHybrid *hybrid = (PairHybrid *)force->pair; fprintf(out,"Hybrid sub-styles:"); for (int i=0; i < hybrid->nstyles; ++i) diff --git a/src/respa.cpp b/src/respa.cpp index 26bae5a1cb..6fa9959d78 100644 --- a/src/respa.cpp +++ b/src/respa.cpp @@ -38,6 +38,7 @@ #include "timer.h" #include "memory.h" #include "error.h" +#include "utils.h" #include "pair_hybrid.h" using namespace LAMMPS_NS; @@ -120,7 +121,7 @@ Respa::Respa(LAMMPS *lmp, int narg, char **arg) : iarg += 2; } else if (strcmp(arg[iarg],"hybrid") == 0) { // the hybrid keyword requires a hybrid pair style - if (!strstr(force->pair_style,"hybrid")) + if (!utils::strmatch(force->pair_style,"^hybrid")) error->all(FLERR,"Illegal run_style respa command"); PairHybrid *hybrid = (PairHybrid *) force->pair; nhybrid_styles = hybrid->nstyles; diff --git a/src/velocity.cpp b/src/velocity.cpp index 6d6027cc3c..32b08708cf 100644 --- a/src/velocity.cpp +++ b/src/velocity.cpp @@ -33,6 +33,7 @@ #include "comm.h" #include "memory.h" #include "error.h" +#include "utils.h" using namespace LAMMPS_NS; @@ -709,19 +710,19 @@ void Velocity::zero(int /*narg*/, char **arg) { if (strcmp(arg[0],"linear") == 0) { if (rfix < 0) zero_momentum(); - else if (strcmp(modify->fix[rfix]->style,"rigid/small") == 0) { + else if (utils::strmatch(modify->fix[rfix]->style,"^rigid/small")) { modify->fix[rfix]->setup_pre_neighbor(); modify->fix[rfix]->zero_momentum(); - } else if (strstr(modify->fix[rfix]->style,"rigid")) { + } else if (utils::strmatch(modify->fix[rfix]->style,"^rigid")) { modify->fix[rfix]->zero_momentum(); } else error->all(FLERR,"Velocity rigid used with non-rigid fix-ID"); } else if (strcmp(arg[0],"angular") == 0) { if (rfix < 0) zero_rotation(); - else if (strcmp(modify->fix[rfix]->style,"rigid/small") == 0) { + else if (utils::strmatch(modify->fix[rfix]->style,"^rigid/small")) { modify->fix[rfix]->setup_pre_neighbor(); modify->fix[rfix]->zero_rotation(); - } else if (strstr(modify->fix[rfix]->style,"rigid")) { + } else if (utils::strmatch(modify->fix[rfix]->style,"^rigid")) { modify->fix[rfix]->zero_rotation(); } else error->all(FLERR,"Velocity rigid used with non-rigid fix-ID"); From e359e80118890a6330bb3c3c93e1d6637e16d5ed Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Thu, 4 Apr 2019 22:39:58 -0400 Subject: [PATCH 0464/1242] fix bug reported in issue #1410 --- src/variable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/variable.cpp b/src/variable.cpp index ed3b41bd00..56b66cad0d 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -2181,7 +2181,7 @@ double Variable::evaluate(char *str, Tree **tree, int ivar) if (tree) { Tree *newtree = new Tree(); newtree->type = opprevious; - if (opprevious == UNARY) { + if ((opprevious == UNARY) || (opprevious == NOT)) { newtree->first = treestack[--ntreestack]; newtree->second = NULL; newtree->nextra = 0; From f4159ff5929b1d5ce62a75fd4afe315271160266 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 05:53:19 -0400 Subject: [PATCH 0465/1242] implement different -DLAMMPS_BIGBIG workaround without breaking format --- src/USER-REAXC/reaxc_traj.h | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/src/USER-REAXC/reaxc_traj.h b/src/USER-REAXC/reaxc_traj.h index b04a190965..4966bf11d8 100644 --- a/src/USER-REAXC/reaxc_traj.h +++ b/src/USER-REAXC/reaxc_traj.h @@ -42,7 +42,11 @@ #define SCI_LINE "%-37s%-24g\n" #define REAL3_LINE "%-32s%9.3f,%9.3f,%9.3f\n" -#define INIT_DESC TAGINT_FORMAT "%3d%9s%10.3f\n" //AtomID - AtomType, AtomName, AtomMass +#if defined(LAMMPS_BIGBIG) +#define INIT_DESC "%9ld%3d%9s%10.3f\n" //AtomID - AtomType, AtomName, AtomMass +#else +#define INIT_DESC "%9d%3d%9s%10.3f\n" //AtomID - AtomType, AtomName, AtomMass +#endif #define INIT_DESC_LEN 32 #define SIZE_INFO_LINE2 "%-10d%-10d\n" @@ -51,21 +55,33 @@ #define SIZE_INFO_LINE3 "%-10d%-10d%-10d\n" #define SIZE_INFO_LEN3 31 -#define ATOM_BASIC TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f\n" //AtomID AtomType (X Y Z) Charge +#if defined(LAMMPS_BIGBIG) +#define ATOM_BASIC "%9ld%10.3f%10.3f%10.3f%10.3f\n" //AtomID AtomType (X Y Z) Charge +#define ATOM_wV "%9ld%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) Charge +#define ATOM_wF "%9ld%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Fx Fy Fz) Charge +#define ATOM_FULL "%9ld%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) (Fx Fy Fz) Charge +#else +#define ATOM_BASIC "%9d%10.3f%10.3f%10.3f%10.3f\n" //AtomID AtomType (X Y Z) Charge +#define ATOM_wV "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) Charge +#define ATOM_wF "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Fx Fy Fz) Charge +#define ATOM_FULL "%9d%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) (Fx Fy Fz) Charge +#endif #define ATOM_BASIC_LEN 50 -#define ATOM_wV TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) Charge #define ATOM_wV_LEN 80 -#define ATOM_wF TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Fx Fy Fz) Charge #define ATOM_wF_LEN 80 -#define ATOM_FULL TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f%10.3f\n" //AtomID (X Y Z) (Vx Vy Vz) (Fx Fy Fz) Charge #define ATOM_FULL_LEN 110 -#define BOND_BASIC TAGINT_FORMAT " " TAGINT_FORMAT " %10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO +#if defined(LAMMPS_BIGBIG) +#define BOND_BASIC "%9ld%9ld%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO +#define BOND_FULL "%9ld%9ld%10.3f%10.3f%10.3f%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO BOs BOpi BOpi2 +#define ANGLE_BASIC "%9ld%9ld%9ld%10.3f\n" // Atom1 Atom2 Atom3 Theta +#else +#define BOND_BASIC "%9d%9d%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO +#define BOND_FULL "%9d%9d%10.3f%10.3f%10.3f%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO BOs BOpi BOpi2 +#define ANGLE_BASIC "%9d%9d%9d%10.3f\n" // Atom1 Atom2 Atom3 Theta +#endif #define BOND_BASIC_LEN 39 -#define BOND_FULL TAGINT_FORMAT " " TAGINT_FORMAT " %10.3f%10.3f%10.3f%10.3f%10.3f\n" // Atom1 Atom2 Dist Total_BO BOs BOpi BOpi2 #define BOND_FULL_LEN 69 - -#define ANGLE_BASIC TAGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " %10.3f\n" // Atom1 Atom2 Atom3 Theta #define ANGLE_BASIC_LEN 38 enum ATOM_LINE_OPTS { OPT_NOATOM = 0, OPT_ATOM_BASIC = 4, OPT_ATOM_wF = 5, OPT_ATOM_wV = 6, OPT_ATOM_FULL = 7, NR_OPT_ATOM = 8 }; From 4f026b9b3830afdbf2ede14fe9d6001be56e5604 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 06:11:06 -0400 Subject: [PATCH 0466/1242] remove trailing whitespace --- src/USER-REAXC/fix_reaxc.cpp | 2 +- src/USER-REAXC/reaxc_ffield.cpp | 4 ++-- src/USER-REAXC/reaxc_init_md.cpp | 8 ++++---- src/USER-REAXC/reaxc_reset_tools.cpp | 4 ++-- src/USER-REAXC/reaxc_types.h | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/USER-REAXC/fix_reaxc.cpp b/src/USER-REAXC/fix_reaxc.cpp index 361733f3ca..dc67ad6ffb 100644 --- a/src/USER-REAXC/fix_reaxc.cpp +++ b/src/USER-REAXC/fix_reaxc.cpp @@ -41,7 +41,7 @@ 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; diff --git a/src/USER-REAXC/reaxc_ffield.cpp b/src/USER-REAXC/reaxc_ffield.cpp index 13e928ad08..9534637645 100644 --- a/src/USER-REAXC/reaxc_ffield.cpp +++ b/src/USER-REAXC/reaxc_ffield.cpp @@ -151,7 +151,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, /* Sanity checks */ if (c == 2 && !lgflag) control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); - + if (c < 9) { snprintf (errmsg, 1024, "Missing parameter(s) in line %s", s); control->error_ptr->all(FLERR, errmsg); @@ -320,7 +320,7 @@ char Read_Force_Field( FILE *fp, reax_interaction *reax, if (c == 2 && !lgflag) { control->error_ptr->all(FLERR, "Force field file requires using 'lgvdw yes'"); } - + l = atoi(tmp[0]); /* a line of comments */ diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index c1239e0cbb..39b31c38b5 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -236,21 +236,21 @@ void Initialize( reax_system *system, control_params *control, if (Init_Workspace( system, control, workspace, msg ) == FAILURE) { - control->error_ptr->one(FLERR,"Workspace could not be initialized"); + control->error_ptr->one(FLERR,"Workspace could not be initialized"); } if (Init_Lists( system, control, data, workspace, lists, mpi_data, msg ) == FAILURE) { - control->error_ptr->one(FLERR,"Lists could not be initialized"); + control->error_ptr->one(FLERR,"Lists could not be initialized"); } if (Init_Output_Files(system,control,out_control,mpi_data,msg)== FAILURE) { - control->error_ptr->one(FLERR,"Could not open output files"); + control->error_ptr->one(FLERR,"Could not open output files"); } if (control->tabulate) { if (Init_Lookup_Tables( system, control, workspace, mpi_data, msg ) == FAILURE) { - control->error_ptr->one(FLERR,"Lookup table could not be created"); + control->error_ptr->one(FLERR,"Lookup table could not be created"); } } diff --git a/src/USER-REAXC/reaxc_reset_tools.cpp b/src/USER-REAXC/reaxc_reset_tools.cpp index 5439ee33a4..e00656694c 100644 --- a/src/USER-REAXC/reaxc_reset_tools.cpp +++ b/src/USER-REAXC/reaxc_reset_tools.cpp @@ -144,7 +144,7 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, if (total_bonds >= bonds->num_intrs * DANGER_ZONE) { workspace->realloc.bonds = 1; if (total_bonds >= bonds->num_intrs) { - char errmsg[256]; + char errmsg[256]; snprintf(errmsg, 256, "Not enough space for bonds! total=%d allocated=%d\n", total_bonds, bonds->num_intrs); control->error_ptr->one(FLERR, errmsg); @@ -170,7 +170,7 @@ void Reset_Neighbor_Lists( reax_system *system, control_params *control, if (total_hbonds >= hbonds->num_intrs * 0.90/*DANGER_ZONE*/) { workspace->realloc.hbonds = 1; if (total_hbonds >= hbonds->num_intrs) { - char errmsg[256]; + char errmsg[256]; snprintf(errmsg, 256, "Not enough space for hbonds! total=%d allocated=%d\n", total_hbonds, hbonds->num_intrs); control->error_ptr->one(FLERR, errmsg); diff --git a/src/USER-REAXC/reaxc_types.h b/src/USER-REAXC/reaxc_types.h index cdc2916a66..b05f655040 100644 --- a/src/USER-REAXC/reaxc_types.h +++ b/src/USER-REAXC/reaxc_types.h @@ -491,7 +491,7 @@ typedef struct int lgflag; int enobondsflag; class LAMMPS_NS::Error *error_ptr; - int me; + int me; } control_params; From 42e8a7613e144e86b8ce0eac302b5fc87323779e Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 06:29:38 -0400 Subject: [PATCH 0467/1242] stop with error or print a warning when the system or atom ids get to large for reax/c pair styles --- src/USER-OMP/pair_reaxc_omp.cpp | 9 +++++++++ src/USER-REAXC/pair_reaxc.cpp | 11 +++++++++-- src/USER-REAXC/reaxc_io_tools.cpp | 6 ++---- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 92ba31048d..81e890538a 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -343,6 +343,15 @@ void PairReaxCOMP::init_style( ) if (force->newton_pair == 0) error->all(FLERR,"Pair style reax/c/omp requires newton pair on"); + if ((atom->map_max_tag > 99999999) && (comm->me == 0)) + error->warning(FLERR,"Some Atom-IDs are too large. Pair style reax/c/omp " + "native output files may get misformatted or corrupted"); + + // because system->bigN is an int, we cannot have more atoms than MAXSMALLINT + + if (atom->natoms > MAXSMALLINT) + error->all(FLERR,"Too many atoms for pair style reax/c/omp"); + // need a half neighbor list w/ Newton off and ghost neighbors // built whenever re-neighboring occurs diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 6bb2b9a197..3164280872 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -90,8 +90,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) mpi_data = (mpi_datatypes *) memory->smalloc(sizeof(mpi_datatypes),"reax:mpi"); - MPI_Comm_rank(world,&system->my_rank); - control->me = system->my_rank; + control->me = system->my_rank = comm->me; system->my_coords[0] = 0; system->my_coords[1] = 0; @@ -383,6 +382,14 @@ void PairReaxC::init_style( ) error->all(FLERR,"Pair style reax/c requires atom IDs"); if (force->newton_pair == 0) error->all(FLERR,"Pair style reax/c requires newton pair on"); + if ((atom->map_max_tag > 99999999) && (comm->me == 0)) + error->warning(FLERR,"Some Atom-IDs are too large. Pair style reax/c " + "native output files may get misformatted or corrupted"); + + // because system->bigN is an int, we cannot have more atoms than MAXSMALLINT + + if (atom->natoms > MAXSMALLINT) + error->all(FLERR,"Too many atoms for pair style reax/c"); // need a half neighbor list w/ Newton off and ghost neighbors // built whenever re-neighboring occurs diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index f71fcbec8e..a4f0db7c7d 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -55,8 +55,7 @@ int Init_Output_Files( reax_system *system, control_params *control, sprintf( temp, "%s.pot", control->sim_name ); if ((out_control->pot = fopen( temp, "w" )) != NULL) { fflush( out_control->pot ); - } - else { + } else { strcpy( msg, "init_out_controls: .pot file could not be opened\n" ); return FAILURE; } @@ -74,8 +73,7 @@ int Init_Output_Files( reax_system *system, control_params *control, "step", "Pint/norm[x]", "Pint/norm[y]", "Pint/norm[z]", "Pext/Ptot[x]", "Pext/Ptot[y]", "Pext/Ptot[z]", "Pkin/V" ); fflush( out_control->prs ); - } - else { + } else { strcpy(msg,"init_out_controls: .prs file couldn't be opened\n"); return FAILURE; } From 8b2a8ad08bd1a2cb22ff3465db810c4735025753 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 06:32:59 -0400 Subject: [PATCH 0468/1242] fix stupid typo --- src/USER-OMP/pair_reaxc_omp.cpp | 2 +- src/USER-REAXC/pair_reaxc.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 81e890538a..a98f7c89d9 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -343,7 +343,7 @@ void PairReaxCOMP::init_style( ) if (force->newton_pair == 0) error->all(FLERR,"Pair style reax/c/omp requires newton pair on"); - if ((atom->map_max_tag > 99999999) && (comm->me == 0)) + if ((atom->map_tag_max > 99999999) && (comm->me == 0)) error->warning(FLERR,"Some Atom-IDs are too large. Pair style reax/c/omp " "native output files may get misformatted or corrupted"); diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index 3164280872..a65c738766 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -382,7 +382,7 @@ void PairReaxC::init_style( ) error->all(FLERR,"Pair style reax/c requires atom IDs"); if (force->newton_pair == 0) error->all(FLERR,"Pair style reax/c requires newton pair on"); - if ((atom->map_max_tag > 99999999) && (comm->me == 0)) + if ((atom->map_tag_max > 99999999) && (comm->me == 0)) error->warning(FLERR,"Some Atom-IDs are too large. Pair style reax/c " "native output files may get misformatted or corrupted"); From 383e206cc22fd91f0ed30318b9c8cd0055b8ab42 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 08:00:04 -0400 Subject: [PATCH 0469/1242] the GCC folks did it again. :-( --- src/hashlittle.cpp | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/hashlittle.cpp b/src/hashlittle.cpp index 38f192ad76..f612be9eeb 100644 --- a/src/hashlittle.cpp +++ b/src/hashlittle.cpp @@ -23,16 +23,6 @@ # endif #endif -// declaration to indicate intended fallthrough cases in switch statements -// and thus silence the warnings produced by g++ -Wextra - -#if defined(__GNUC__) -#define _fallthrough __attribute__ ((fallthrough)) -#else -#define _fallthrough -#endif - - #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) /* @@ -301,17 +291,17 @@ uint32_t hashlittle( const void *key, size_t length, uint32_t initval) /*-------------------------------- last block: affect all 32 bits of (c) */ switch(length) /* all the case statements fall through */ { - case 12: c+=((uint32_t)k[11])<<24; _fallthrough; - case 11: c+=((uint32_t)k[10])<<16; _fallthrough; - case 10: c+=((uint32_t)k[9])<<8; _fallthrough; - case 9 : c+=k[8]; _fallthrough; - case 8 : b+=((uint32_t)k[7])<<24; _fallthrough; - case 7 : b+=((uint32_t)k[6])<<16; _fallthrough; - case 6 : b+=((uint32_t)k[5])<<8; _fallthrough; - case 5 : b+=k[4]; _fallthrough; - case 4 : a+=((uint32_t)k[3])<<24; _fallthrough; - case 3 : a+=((uint32_t)k[2])<<16; _fallthrough; - case 2 : a+=((uint32_t)k[1])<<8; _fallthrough; + case 12: c+=((uint32_t)k[11])<<24; /* fall through */ + case 11: c+=((uint32_t)k[10])<<16; /* fall through */ + case 10: c+=((uint32_t)k[9])<<8; /* fall through */ + case 9 : c+=k[8]; /* fall through */ + case 8 : b+=((uint32_t)k[7])<<24; /* fall through */ + case 7 : b+=((uint32_t)k[6])<<16; /* fall through */ + case 6 : b+=((uint32_t)k[5])<<8; /* fall through */ + case 5 : b+=k[4]; /* fall through */ + case 4 : a+=((uint32_t)k[3])<<24; /* fall through */ + case 3 : a+=((uint32_t)k[2])<<16; /* fall through */ + case 2 : a+=((uint32_t)k[1])<<8; /* fall through */ case 1 : a+=k[0]; break; case 0 : return c; From 5d3801cb1259ffc50b39a27e08842c9f0488b9de Mon Sep 17 00:00:00 2001 From: Evangelos Voyiatzis Date: Fri, 5 Apr 2019 15:50:58 +0200 Subject: [PATCH 0470/1242] Include info for COMPASS in the Howto section --- doc/src/Howto_bioFF.txt | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/doc/src/Howto_bioFF.txt b/doc/src/Howto_bioFF.txt index deb5b31441..ee53420723 100644 --- a/doc/src/Howto_bioFF.txt +++ b/doc/src/Howto_bioFF.txt @@ -7,12 +7,12 @@ Documentation"_ld - "LAMMPS Commands"_lc :c :line -CHARMM, AMBER, and DREIDING force fields :h3 +CHARMM, AMBER, COMPASS and DREIDING force fields :h3 A force field has 2 parts: the formulas that define it and the coefficients used for a particular system. Here we only discuss formulas implemented in LAMMPS that correspond to formulas commonly -used in the CHARMM, AMBER, and DREIDING force fields. Setting +used in the CHARMM, AMBER, COMPASS and DREIDING force fields. Setting coefficients is done in the input data file via the "read_data"_read_data.html command or in the input script with commands like "pair_coeff"_pair_coeff.html or @@ -50,6 +50,28 @@ older {charmm} styles. See discussion of the differences on the "pair charmm"_pair_charmm.html and "dihedral charmm"_dihedral_charmm.html doc pages. +COMPASS is a general force field for atomistic simulation of +common organic molecules, inorganic small molecules, and polymers which +was developed using ab initio and empirical parametrization techniques. +See the "Tools"_Tools.html doc page for the msi2lmp tool for creating +LAMMPS template input and data files from BIOVIA’s Materias Studio files. +See "(Sun)"_#howto-Sun for a description of the COMPASS force field. + +These style choices compute force field formulas that are consistent +with the COMPASS force field. See each command's +documentation for the formula it computes. + +"bond_style"_bond_class2.html class2 +"angle_style"_angle_class2.html class2 +"dihedral_style"_dihedral_class2.html class2 +"improper_style"_improper_class2.html class2 :ul + +"pair_style"_pair_class2.html lj/class2 +"pair_style"_pair_class2.html lj/class2/coul/cut +"pair_style"_pair_class2.html lj/class2/coul/long :ul + +"special_bonds"_special_bonds.html lj/coul 0 0 1 :ul + DREIDING is a generic force field developed by the "Goddard group"_http://www.wag.caltech.edu at Caltech and is useful for predicting structures and dynamics of organic, biological and @@ -100,6 +122,9 @@ Fischer, Gao, Guo, Ha, et al, J Phys Chem, 102, 3586 (1998). [(Cornell)] Cornell, Cieplak, Bayly, Gould, Merz, Ferguson, Spellmeyer, Fox, Caldwell, Kollman, JACS 117, 5179-5197 (1995). +:link(howto-Sun) +[(Sun)] Sun, J. Phys. Chem. B, 102, 7338–7364 (1998). + :link(howto-Mayo) [(Mayo)] Mayo, Olfason, Goddard III, J Phys Chem, 94, 8897-8909 (1990). From 85a0461a48b16c1f383b7cfeb6fc1a69fa9a8bc2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 10:53:23 -0400 Subject: [PATCH 0471/1242] reword and reformat text in Howto_bioFF.txt a little bit. add warnings about msi2lmp's age and lack of maintenance --- doc/src/Howto_bioFF.txt | 78 ++++++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 36 deletions(-) diff --git a/doc/src/Howto_bioFF.txt b/doc/src/Howto_bioFF.txt index ee53420723..b6995920ae 100644 --- a/doc/src/Howto_bioFF.txt +++ b/doc/src/Howto_bioFF.txt @@ -7,29 +7,31 @@ Documentation"_ld - "LAMMPS Commands"_lc :c :line -CHARMM, AMBER, COMPASS and DREIDING force fields :h3 +CHARMM, AMBER, COMPASS, and DREIDING force fields :h3 A force field has 2 parts: the formulas that define it and the coefficients used for a particular system. Here we only discuss formulas implemented in LAMMPS that correspond to formulas commonly -used in the CHARMM, AMBER, COMPASS and DREIDING force fields. Setting -coefficients is done in the input data file via the -"read_data"_read_data.html command or in the input script with +used in the CHARMM, AMBER, COMPASS, and DREIDING force fields. Setting +coefficients is done either from special sections in an input data file +via the "read_data"_read_data.html command or in the input script with commands like "pair_coeff"_pair_coeff.html or -"bond_coeff"_bond_coeff.html. See the "Tools"_Tools.html doc page for -additional tools that can use CHARMM or AMBER to assign force field -coefficients and convert their output into LAMMPS input. +"bond_coeff"_bond_coeff.html and so on. See the "Tools"_Tools.html doc +page for additional tools that can use CHARMM, AMBER, or Materials +Studio generated files to assign force field coefficients and convert +their output into LAMMPS input. See "(MacKerell)"_#howto-MacKerell for a description of the CHARMM force -field. See "(Cornell)"_#howto-Cornell for a description of the AMBER force -field. +field. See "(Cornell)"_#howto-Cornell for a description of the AMBER +force field. See "(Sun)"_#howto-Sun for a description of the COMPASS +force field. :link(charmm,http://www.scripps.edu/brooks) :link(amber,http://amber.scripps.edu) -These style choices compute force field formulas that are consistent -with common options in CHARMM or AMBER. See each command's -documentation for the formula it computes. +The interaction styles listed below compute force field formulas that +are consistent with common options in CHARMM or AMBER. See each +command's documentation for the formula it computes. "bond_style"_bond_harmonic.html harmonic "angle_style"_angle_charmm.html charmm @@ -44,21 +46,26 @@ documentation for the formula it computes. "special_bonds"_special_bonds.html charmm "special_bonds"_special_bonds.html amber :ul -NOTE: For CHARMM, newer {charmmfsw} or {charmmfsh} styles were -released in March 2017. We recommend they be used instead of the -older {charmm} styles. See discussion of the differences on the "pair -charmm"_pair_charmm.html and "dihedral charmm"_dihedral_charmm.html -doc pages. +NOTE: For CHARMM, newer {charmmfsw} or {charmmfsh} styles were released +in March 2017. We recommend they be used instead of the older {charmm} +styles. See discussion of the differences on the "pair +charmm"_pair_charmm.html and "dihedral charmm"_dihedral_charmm.html doc +pages. -COMPASS is a general force field for atomistic simulation of -common organic molecules, inorganic small molecules, and polymers which -was developed using ab initio and empirical parametrization techniques. -See the "Tools"_Tools.html doc page for the msi2lmp tool for creating -LAMMPS template input and data files from BIOVIA’s Materias Studio files. -See "(Sun)"_#howto-Sun for a description of the COMPASS force field. +COMPASS is a general force field for atomistic simulation of common +organic molecules, inorganic small molecules, and polymers which was +developed using ab initio and empirical parameterization techniques. +See the "Tools"_Tools.html doc page for the msi2lmp tool for creating +LAMMPS template input and data files from BIOVIA’s Materials Studio +files. Please note that the msi2lmp tool is very old and largely +unmaintained, so it does not support all features of Materials Studio +provided force field files, especially additions during the last decade. +You should watch the output carefully and compare results, where +possible. See "(Sun)"_#howto-Sun for a description of the COMPASS force +field. -These style choices compute force field formulas that are consistent -with the COMPASS force field. See each command's +These interaction styles listed below compute force field formulas that +are consistent with the COMPASS force field. See each command's documentation for the formula it computes. "bond_style"_bond_class2.html class2 @@ -74,20 +81,19 @@ documentation for the formula it computes. DREIDING is a generic force field developed by the "Goddard group"_http://www.wag.caltech.edu at Caltech and is useful for -predicting structures and dynamics of organic, biological and -main-group inorganic molecules. The philosophy in DREIDING is to use -general force constants and geometry parameters based on simple -hybridization considerations, rather than individual force constants -and geometric parameters that depend on the particular combinations of -atoms involved in the bond, angle, or torsion terms. DREIDING has an -"explicit hydrogen bond term"_pair_hbond_dreiding.html to describe -interactions involving a hydrogen atom on very electronegative atoms -(N, O, F). +predicting structures and dynamics of organic, biological and main-group +inorganic molecules. The philosophy in DREIDING is to use general force +constants and geometry parameters based on simple hybridization +considerations, rather than individual force constants and geometric +parameters that depend on the particular combinations of atoms involved +in the bond, angle, or torsion terms. DREIDING has an "explicit hydrogen +bond term"_pair_hbond_dreiding.html to describe interactions involving a +hydrogen atom on very electronegative atoms (N, O, F). See "(Mayo)"_#howto-Mayo for a description of the DREIDING force field -These style choices compute force field formulas that are consistent -with the DREIDING force field. See each command's +The interaction styles listed below compute force field formulas that +are consistent with the DREIDING force field. See each command's documentation for the formula it computes. "bond_style"_bond_harmonic.html harmonic From 2757e4e6e6e6ffb61493ae439f2a90efcdac8ae5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 10:53:41 -0400 Subject: [PATCH 0472/1242] two more false positives --- doc/utils/sphinx-config/false_positives.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 8c2ff43c3c..91ae3d6a6c 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1134,6 +1134,7 @@ infty inhomogeneities inhomogeneous init +initio initializations InP inregion @@ -2809,6 +2810,7 @@ unimodal unitless Universite unix +unmaintained unoptimized unpadded unphysical From 2e1da2958da1cf362a2185ed51db8902607a1218 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 11:04:11 -0400 Subject: [PATCH 0473/1242] resolve toctree and paper anchor issues --- doc/src/Howto.txt | 2 +- doc/src/Howto_tip3p.txt | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/doc/src/Howto.txt b/doc/src/Howto.txt index 36f6be7194..0df417af75 100644 --- a/doc/src/Howto.txt +++ b/doc/src/Howto.txt @@ -148,7 +148,7 @@ END_RST --> -"CHARMM, AMBER, and DREIDING force fields"_Howto_bioFF.html +"CHARMM, AMBER, COMPASS, and DREIDING force fields"_Howto_bioFF.html "TIP3P water model"_Howto_tip3p.html "TIP4P water model"_Howto_tip4p.html "SPC water model"_Howto_spc.html :all(b) diff --git a/doc/src/Howto_tip3p.txt b/doc/src/Howto_tip3p.txt index 942b42aea1..a34577c5e1 100644 --- a/doc/src/Howto_tip3p.txt +++ b/doc/src/Howto_tip3p.txt @@ -10,7 +10,7 @@ Documentation"_ld - "LAMMPS Commands"_lc :c TIP3P water model :h3 The TIP3P water model as implemented in CHARMM -"(MacKerell)"_#howto-MacKerell specifies a 3-site rigid water molecule with +"(MacKerell)"_#howto-tip3p specifies a 3-site rigid water molecule with charges and Lennard-Jones parameters assigned to each of the 3 atoms. In LAMMPS the "fix shake"_fix_shake.html command can be used to hold the two O-H bonds and the H-O-H angle rigid. A bond style of @@ -60,6 +60,10 @@ models"_http://en.wikipedia.org/wiki/Water_model. :line +:link(howto-tip3p) +[(MacKerell)] MacKerell, Bashford, Bellott, Dunbrack, Evanseck, Field, +Fischer, Gao, Guo, Ha, et al, J Phys Chem, 102, 3586 (1998). + :link(Jorgensen1) [(Jorgensen)] Jorgensen, Chandrasekhar, Madura, Impey, Klein, J Chem Phys, 79, 926 (1983). From 175f3ee648bf805e233c327eff93a402495e1b80 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Fri, 5 Apr 2019 10:14:45 -0500 Subject: [PATCH 0474/1242] Fix pointer assignment in pair_kim Bug only affects cases where neighbor list needs to be stripped. Thanks to Mingjian Wen (@mjwen) for finding and reporting this. --- src/KIM/pair_kim.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 84842f87cc..ea5f24a67e 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -481,7 +481,7 @@ void PairKIM::init_style() for (int i = 0; i < kim_number_of_neighbor_lists; ++i) { lmps_stripped_neigh_ptr[i] - = &(lmps_stripped_neigh_list[(i-1)*(neighbor->oneatom)]); + = &(lmps_stripped_neigh_list[i*(neighbor->oneatom)]); } } From 815ad4dab2b9782b11073816b4f84848013ac7b7 Mon Sep 17 00:00:00 2001 From: oywg11 Date: Fri, 5 Apr 2019 22:04:45 +0300 Subject: [PATCH 0475/1242] fix a bug in ILP --- doc/src/pair_ilp_graphene_hbn.txt | 19 ++++-- doc/src/pair_kolmogorov_crespi_full.txt | 14 +++-- src/USER-MISC/pair_ilp_graphene_hbn.cpp | 58 ++++++++++++------- src/USER-MISC/pair_kolmogorov_crespi_full.cpp | 36 ++++++++---- 4 files changed, 85 insertions(+), 42 deletions(-) diff --git a/doc/src/pair_ilp_graphene_hbn.txt b/doc/src/pair_ilp_graphene_hbn.txt index 76dda14ec6..5c44128edb 100644 --- a/doc/src/pair_ilp_graphene_hbn.txt +++ b/doc/src/pair_ilp_graphene_hbn.txt @@ -47,11 +47,16 @@ equation can be found in "(Leven1)"_#Leven1 and "(Maaravi)"_#Maaravi2. It is important to include all the pairs to build the neighbor list for calculating the normals. -NOTE: This potential is intended for interactions between two different -layers of graphene or hexagonal boron nitride. Therefore, to avoid -interaction within the same layers, each layer should have a separate -molecule id and is recommended to use "full" atom style in the data -file. +NOTE: This potential (ILP) is intended for interlayer interactions between two +different layers of graphene, hexagonal boron nitride (h-BN) and their heterojunctions. +To perform a realistic simulation, this potential must be used in combination with +intralyer potential, such as "AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential. +To keep the intralayer properties unaffected, the interlayer interaction +within the same layers should be avoided. Hence, each atom has to have a layer +identifier such that atoms residing on the same layer interact via the +appropriate intra-layer potential and atoms residing on different layers +interact via the ILP. Here, the molecule id is chosen as the layer identifier, +thus a data file with the "full" atom style is required to use this potential. The parameter file (e.g. BNCH.ILP), is intended for use with {metal} "units"_units.html, with energies in meV. Two additional parameters, @@ -62,6 +67,10 @@ list for calculating the normals for each atom pair. NOTE: The parameters presented in the parameter file (e.g. BNCH.ILP), are fitted with taper function by setting the cutoff equal to 16.0 Angstrom. Using different cutoff or taper function should be careful. +The parameters for atoms pairs between Boron and Nitrogen are fitted with +a screened Coulomb interaction "coul/shield"_pair_coul_shield.html. Therefore, +to simulated the properties of h-BN correclty, this potential must be used in +combination with the pair style "coul/shield"_pair_coul_shield.html. NOTE: Two new sets of parameters of ILP for two-dimensional hexagonal Materials are presented in "(Ouyang)"_#Ouyang. These parameters provide diff --git a/doc/src/pair_kolmogorov_crespi_full.txt b/doc/src/pair_kolmogorov_crespi_full.txt index 6d76a24bdb..c14bfc6511 100644 --- a/doc/src/pair_kolmogorov_crespi_full.txt +++ b/doc/src/pair_kolmogorov_crespi_full.txt @@ -42,10 +42,16 @@ the last term in the equation for {Vij} above. This is essential only when the tapper function is turned off. The formula of taper function can be found in pair style "ilp/graphene/hbn"_pair_ilp_graphene_hbn.html. -NOTE: This potential is intended for interactions between two different -graphene layers. Therefore, to avoid interaction within the same layers, -each layer should have a separate molecule id and is recommended to use -"full" atom style in the data file. +NOTE: This potential (ILP) is intended for interlayer interactions between two +different layers of graphene. To perform a realistic simulation, this potential +must be used in combination with intralyer potential, such as +"AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential. +To keep the intralayer properties unaffected, the interlayer interaction +within the same layers should be avoided. Hence, each atom has to have a layer +identifier such that atoms residing on the same layer interact via the +appropriate intra-layer potential and atoms residing on different layers +interact via the ILP. Here, the molecule id is chosen as the layer identifier, +thus a data file with the "full" atom style is required to use this potential. The parameter file (e.g. CH.KC), is intended for use with {metal} "units"_units.html, with energies in meV. Two additional parameters, {S}, diff --git a/src/USER-MISC/pair_ilp_graphene_hbn.cpp b/src/USER-MISC/pair_ilp_graphene_hbn.cpp index d1b8a3be38..c7d1c9c721 100644 --- a/src/USER-MISC/pair_ilp_graphene_hbn.cpp +++ b/src/USER-MISC/pair_ilp_graphene_hbn.cpp @@ -111,7 +111,7 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) tagint itag,jtag; double prodnorm1,prodnorm2,fkcx,fkcy,fkcz; double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair,fpair1,fpair2; - double rsq,r,Rcut,rhosq1,rhosq2,exp0,exp1,exp2,r2inv,r6inv,r8inv,Tap,dTap,Vkc; + double rsq,r,Rcut,rhosq1,rhosq2,exp0,exp1,exp2,r2inv,r6inv,r8inv,Tap,dTap,Vilp; double frho1,frho2,TSvdw,TSvdw2inv,Erep,fsum,rdsq1,rdsq2; int *ilist,*jlist,*numneigh,**firstneigh; int *ILP_neighs_i,*ILP_neighs_j; @@ -131,6 +131,10 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) double fp2[3] = {0.0, 0.0, 0.0}; double fprod1[3] = {0.0, 0.0, 0.0}; double fprod2[3] = {0.0, 0.0, 0.0}; + double fk[3] = {0.0, 0.0, 0.0}; + double fl[3] = {0.0, 0.0, 0.0}; + double delkj[3] = {0.0, 0.0, 0.0}; + double delli[3] = {0.0, 0.0, 0.0}; inum = list->inum; ilist = list->ilist; @@ -213,7 +217,7 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) frho1 = exp1*p.C; frho2 = exp2*p.C; Erep = p.epsilon + frho1 + frho2; - Vkc = -p.C6*r6inv/TSvdw + exp0*Erep; + Vilp = -p.C6*r6inv/TSvdw + exp0*Erep; // derivatives fpair = -6.0*p.C6*r8inv/TSvdw + p.d/p.seff*p.C6*(TSvdw-1.0)*TSvdw2inv*r8inv*r + p.lambda*exp0/r*Erep; @@ -240,9 +244,9 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) fprod2[0] = prodnorm2*dprodnorm2[0]*fpair2; fprod2[1] = prodnorm2*dprodnorm2[1]*fpair2; fprod2[2] = prodnorm2*dprodnorm2[2]*fpair2; - fkcx = (delx*fsum - fp1[0] - fp2[0])*Tap - Vkc*dTap*delx/r; - fkcy = (dely*fsum - fp1[1] - fp2[1])*Tap - Vkc*dTap*dely/r; - fkcz = (delz*fsum - fp1[2] - fp2[2])*Tap - Vkc*dTap*delz/r; + fkcx = (delx*fsum - fp1[0] - fp2[0])*Tap - Vilp*dTap*delx/r; + fkcy = (dely*fsum - fp1[1] - fp2[1])*Tap - Vilp*dTap*dely/r; + fkcz = (delz*fsum - fp1[2] - fp2[2])*Tap - Vilp*dTap*delz/r; f[i][0] += fkcx - fprod1[0]*Tap; f[i][1] += fkcy - fprod1[1]*Tap; @@ -260,9 +264,16 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) dprodnorm1[0] = dnormal[0][0][kk][i]*delx + dnormal[1][0][kk][i]*dely + dnormal[2][0][kk][i]*delz; dprodnorm1[1] = dnormal[0][1][kk][i]*delx + dnormal[1][1][kk][i]*dely + dnormal[2][1][kk][i]*delz; dprodnorm1[2] = dnormal[0][2][kk][i]*delx + dnormal[1][2][kk][i]*dely + dnormal[2][2][kk][i]*delz; - f[k][0] += (-prodnorm1*dprodnorm1[0]*fpair1)*Tap; - f[k][1] += (-prodnorm1*dprodnorm1[1]*fpair1)*Tap; - f[k][2] += (-prodnorm1*dprodnorm1[2]*fpair1)*Tap; + fk[0] = (-prodnorm1*dprodnorm1[0]*fpair1)*Tap; + fk[1] = (-prodnorm1*dprodnorm1[1]*fpair1)*Tap; + fk[2] = (-prodnorm1*dprodnorm1[2]*fpair1)*Tap; + f[k][0] += fk[0]; + f[k][1] += fk[1]; + f[k][2] += fk[2]; + delkj[0] = x[k][0] - x[j][0]; + delkj[1] = x[k][1] - x[j][1]; + delkj[2] = x[k][2] - x[j][2]; + if (evflag) ev_tally_xyz(k,j,nlocal,newton_pair,0.0,0.0,fk[0],fk[1],fk[2],delkj[0],delkj[1],delkj[2]); } // calculate the forces acted on the neighbors of atom j from atom i @@ -274,20 +285,24 @@ void PairILPGrapheneHBN::compute(int eflag, int vflag) dprodnorm2[0] = dnormal[0][0][ll][j]*delx + dnormal[1][0][ll][j]*dely + dnormal[2][0][ll][j]*delz; dprodnorm2[1] = dnormal[0][1][ll][j]*delx + dnormal[1][1][ll][j]*dely + dnormal[2][1][ll][j]*delz; dprodnorm2[2] = dnormal[0][2][ll][j]*delx + dnormal[1][2][ll][j]*dely + dnormal[2][2][ll][j]*delz; - f[l][0] += (-prodnorm2*dprodnorm2[0]*fpair2)*Tap; - f[l][1] += (-prodnorm2*dprodnorm2[1]*fpair2)*Tap; - f[l][2] += (-prodnorm2*dprodnorm2[2]*fpair2)*Tap; + fl[0] = (-prodnorm2*dprodnorm2[0]*fpair2)*Tap; + fl[1] = (-prodnorm2*dprodnorm2[1]*fpair2)*Tap; + fl[2] = (-prodnorm2*dprodnorm2[2]*fpair2)*Tap; + f[l][0] += fl[0]; + f[l][1] += fl[1]; + f[l][2] += fl[2]; + delli[0] = x[l][0] - x[i][0]; + delli[1] = x[l][1] - x[i][1]; + delli[2] = x[l][2] - x[i][2]; + if (evflag) ev_tally_xyz(l,i,nlocal,newton_pair,0.0,0.0,fl[0],fl[1],fl[2],delli[0],delli[1],delli[2]); } if (eflag) { - if (tap_flag) evdwl = Tap*Vkc; - else evdwl = Vkc - offset[itype][jtype]; + if (tap_flag) evdwl = Tap*Vilp; + else evdwl = Vilp - offset[itype][jtype]; } - if (evflag){ - ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0, - fkcx,fkcy,fkcz,delx,dely,delz); - } + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0.0,fkcx,fkcy,fkcz,delx,dely,delz); } } } @@ -723,7 +738,6 @@ void PairILPGrapheneHBN::ILP_neigh() ILP_firstneigh[i] = neighptr; ILP_numneigh[i] = n; - if (n == 0) error->all(FLERR,"Could not build neighbor list to calculate normals, please check your configuration"); if (n > 3) error->all(FLERR,"There are too many neighbors for some atoms, please check your configuration"); ipage->vgot(n); if (ipage->status()) @@ -1010,7 +1024,7 @@ double PairILPGrapheneHBN::single(int /*i*/, int /*j*/, int itype, int jtype, do double &fforce) { double r,r2inv,r6inv,r8inv,forcelj,philj,fpair; - double Tap,dTap,Vkc,TSvdw,TSvdw2inv; + double Tap,dTap,Vilp,TSvdw,TSvdw2inv; int iparam_ij = elem2param[map[itype]][map[jtype]]; Param& p = params[iparam_ij]; @@ -1028,13 +1042,13 @@ double PairILPGrapheneHBN::single(int /*i*/, int /*j*/, int itype, int jtype, do TSvdw = 1.0 + exp(-p.d*(r/p.seff - 1.0)); TSvdw2inv = pow(TSvdw,-2.0); - Vkc = -p.C6*r6inv/TSvdw; + Vilp = -p.C6*r6inv/TSvdw; // derivatives fpair = -6.0*p.C6*r8inv/TSvdw + p.d/p.seff*p.C6*(TSvdw - 1.0)*r6inv*TSvdw2inv/r; forcelj = fpair; - fforce = factor_lj*(forcelj*Tap - Vkc*dTap/r); + fforce = factor_lj*(forcelj*Tap - Vilp*dTap/r); - philj = Vkc*Tap; + philj = Vilp*Tap; return factor_lj*philj; } diff --git a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp index 289ed19bd3..7b66a5b41d 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp @@ -129,6 +129,10 @@ void PairKolmogorovCrespiFull::compute(int eflag, int vflag) double fp2[3] = {0.0, 0.0, 0.0}; double fprod1[3] = {0.0, 0.0, 0.0}; double fprod2[3] = {0.0, 0.0, 0.0}; + double fk[3] = {0.0, 0.0, 0.0}; + double fl[3] = {0.0, 0.0, 0.0}; + double delkj[3] = {0.0, 0.0, 0.0}; + double delli[3] = {0.0, 0.0, 0.0}; inum = list->inum; ilist = list->ilist; @@ -259,9 +263,16 @@ void PairKolmogorovCrespiFull::compute(int eflag, int vflag) dprodnorm1[0] = dnormal[0][0][kk][i]*delx + dnormal[1][0][kk][i]*dely + dnormal[2][0][kk][i]*delz; dprodnorm1[1] = dnormal[0][1][kk][i]*delx + dnormal[1][1][kk][i]*dely + dnormal[2][1][kk][i]*delz; dprodnorm1[2] = dnormal[0][2][kk][i]*delx + dnormal[1][2][kk][i]*dely + dnormal[2][2][kk][i]*delz; - f[k][0] += (-prodnorm1*dprodnorm1[0]*fpair1)*Tap; - f[k][1] += (-prodnorm1*dprodnorm1[1]*fpair1)*Tap; - f[k][2] += (-prodnorm1*dprodnorm1[2]*fpair1)*Tap; + fk[0] = (-prodnorm1*dprodnorm1[0]*fpair1)*Tap; + fk[1] = (-prodnorm1*dprodnorm1[1]*fpair1)*Tap; + fk[2] = (-prodnorm1*dprodnorm1[2]*fpair1)*Tap; + f[k][0] += fk[0]; + f[k][1] += fk[1]; + f[k][2] += fk[2]; + delkj[0] = x[k][0] - x[j][0]; + delkj[1] = x[k][1] - x[j][1]; + delkj[2] = x[k][2] - x[j][2]; + if (evflag) ev_tally_xyz(k,j,nlocal,newton_pair,0.0,0.0,fk[0],fk[1],fk[2],delkj[0],delkj[1],delkj[2]); } // calculate the forces acted on the neighbors of atom j from atom i @@ -273,9 +284,16 @@ void PairKolmogorovCrespiFull::compute(int eflag, int vflag) dprodnorm2[0] = dnormal[0][0][ll][j]*delx + dnormal[1][0][ll][j]*dely + dnormal[2][0][ll][j]*delz; dprodnorm2[1] = dnormal[0][1][ll][j]*delx + dnormal[1][1][ll][j]*dely + dnormal[2][1][ll][j]*delz; dprodnorm2[2] = dnormal[0][2][ll][j]*delx + dnormal[1][2][ll][j]*dely + dnormal[2][2][ll][j]*delz; - f[l][0] += (-prodnorm2*dprodnorm2[0]*fpair2)*Tap; - f[l][1] += (-prodnorm2*dprodnorm2[1]*fpair2)*Tap; - f[l][2] += (-prodnorm2*dprodnorm2[2]*fpair2)*Tap; + fl[0] = (-prodnorm2*dprodnorm2[0]*fpair2)*Tap; + fl[1] = (-prodnorm2*dprodnorm2[1]*fpair2)*Tap; + fl[2] = (-prodnorm2*dprodnorm2[2]*fpair2)*Tap; + f[l][0] += fl[0]; + f[l][1] += fl[1]; + f[l][2] += fl[2]; + delli[0] = x[l][0] - x[i][0]; + delli[1] = x[l][1] - x[i][1]; + delli[2] = x[l][2] - x[i][2]; + if (evflag) ev_tally_xyz(l,i,nlocal,newton_pair,0.0,0.0,fl[0],fl[1],fl[2],delli[0],delli[1],delli[2]); } if (eflag) { @@ -283,10 +301,7 @@ void PairKolmogorovCrespiFull::compute(int eflag, int vflag) else evdwl = Vkc - offset[itype][jtype]; } - if (evflag){ - ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0, - fkcx,fkcy,fkcz,delx,dely,delz); - } + if (evflag) ev_tally_xyz(i,j,nlocal,newton_pair,evdwl,0,fkcx,fkcy,fkcz,delx,dely,delz); } } } @@ -727,7 +742,6 @@ void PairKolmogorovCrespiFull::KC_neigh() KC_firstneigh[i] = neighptr; KC_numneigh[i] = n; - if (n == 0) error->all(FLERR,"Could not build neighbor list to calculate normals, please check your configuration"); if (n > 3) error->all(FLERR,"There are too many neighbors for some atoms, please check your configuration"); ipage->vgot(n); if (ipage->status()) From da16a7e50ba74aee5d6d08fe49f41d673fe3c551 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 5 Apr 2019 13:22:46 -0600 Subject: [PATCH 0476/1242] Commit JT 040519 - initial rotation with Rodrigues' formula + exception - worked on neb_spin documentation - removed pair/spin warning for neb/spin --- doc/src/Eqs/neb_spin_k.jpg | Bin 0 -> 8348 bytes doc/src/Eqs/neb_spin_k.tex | 16 + doc/src/Eqs/neb_spin_rodrigues_formula.jpg | Bin 0 -> 20271 bytes doc/src/Eqs/neb_spin_rodrigues_formula.tex | 16 + doc/src/neb_spin.txt | 430 +++++++++++++++++++ examples/SPIN/gneb/iron/in.gneb.iron | 3 +- examples/SPIN/gneb/skyrmion/in.gneb.skyrmion | 3 +- src/SPIN/fix_neb_spin.h | 30 +- src/SPIN/neb_spin.cpp | 140 +++--- src/SPIN/neb_spin.h | 2 +- src/SPIN/pair_spin_dmi.cpp | 3 +- src/SPIN/pair_spin_exchange.cpp | 2 +- src/SPIN/pair_spin_magelec.cpp | 3 +- src/SPIN/pair_spin_neel.cpp | 3 +- 14 files changed, 560 insertions(+), 91 deletions(-) create mode 100644 doc/src/Eqs/neb_spin_k.jpg create mode 100644 doc/src/Eqs/neb_spin_k.tex create mode 100644 doc/src/Eqs/neb_spin_rodrigues_formula.jpg create mode 100644 doc/src/Eqs/neb_spin_rodrigues_formula.tex create mode 100644 doc/src/neb_spin.txt diff --git a/doc/src/Eqs/neb_spin_k.jpg b/doc/src/Eqs/neb_spin_k.jpg new file mode 100644 index 0000000000000000000000000000000000000000..add309694f9f0a0901b33bce69d7ef1bdce600a1 GIT binary patch literal 8348 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 I`Ni!20@5|3n*aa+ literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/neb_spin_k.tex b/doc/src/Eqs/neb_spin_k.tex new file mode 100644 index 0000000000..f0ce8e180e --- /dev/null +++ b/doc/src/Eqs/neb_spin_k.tex @@ -0,0 +1,16 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath, amssymb, graphics, setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + \vec{k}_i = + \frac{\vec{m}_i^I \times \vec{m}_i^F}{\left|\vec{m}_i^I + \times \vec{m}_i^F\right|} + %&{\rm ~if~}& \vec{m}_i^I \times \vec{m}_i^F + , \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/Eqs/neb_spin_rodrigues_formula.jpg b/doc/src/Eqs/neb_spin_rodrigues_formula.jpg new file mode 100644 index 0000000000000000000000000000000000000000..66070f7bc5b8050ec71d8947d3f2da3ec4e8ed38 GIT binary patch literal 20271 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 literal 0 HcmV?d00001 diff --git a/doc/src/Eqs/neb_spin_rodrigues_formula.tex b/doc/src/Eqs/neb_spin_rodrigues_formula.tex new file mode 100644 index 0000000000..4a8347cd79 --- /dev/null +++ b/doc/src/Eqs/neb_spin_rodrigues_formula.tex @@ -0,0 +1,16 @@ +\documentclass[preview]{standalone} +\usepackage{varwidth} +\usepackage[utf8x]{inputenc} +\usepackage{amsmath, amssymb, graphics, setspace} + +\begin{document} +\begin{varwidth}{50in} + \begin{equation} + \vec{m}_i^{\nu} = \vec{m}_i^{I} \cos(\omega_i^{\nu}) + + (\vec{k}_i \times \vec{m}_i^{I}) \sin(\omega_i^{\nu}) + + (1.0-\cos(\omega_i^{\nu})) \vec{k}_i (\vec{k}_i\cdot + \vec{m}_i^{I}) + , \nonumber + \end{equation} +\end{varwidth} +\end{document} diff --git a/doc/src/neb_spin.txt b/doc/src/neb_spin.txt new file mode 100644 index 0000000000..33cb4cc2ed --- /dev/null +++ b/doc/src/neb_spin.txt @@ -0,0 +1,430 @@ +"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 + +neb command :h3 + +[Syntax:] + +neb/spin etol ttol N1 N2 Nevery file-style arg keyword :pre + +etol = stopping tolerance for energy (energy units) :ulb,l +ttol = stopping tolerance for torque ( units) :l +N1 = max # of iterations (timesteps) to run initial NEB :l +N2 = max # of iterations (timesteps) to run barrier-climbing NEB :l +Nevery = print replica energies and reaction coordinates every this many timesteps :l +file-style = {final} or {each} or {none} :l + {final} arg = filename + filename = file with initial coords for final replica + coords for intermediate replicas are linearly interpolated + between first and last replica + {each} arg = filename + filename = unique filename for each replica (except first) + with its initial coords + {none} arg = no argument all replicas assumed to already have + their initial coords :pre +keyword = {verbose} +:ule + +[Examples:] + +neb/spin 0.1 0.0 1000 500 50 final coords.final +neb/spin 0.0 0.001 1000 500 50 each coords.initial.$i +neb/spin 0.0 0.001 1000 500 50 none verbose :pre + +[Description:] + +Perform a geodesic nudged elastic band (GNEB) calculation using multiple +replicas of a system. Two or more replicas must be used; the first +and last are the end points of the transition path. + +GNEB is a method for finding both the spin configurations and height +of the energy barrier associated with a transition state, e.g. +spins to perform a collective rotation from one energy basin to +another. +The implementation in LAMMPS follows the discussion in the +following paper: "(Bessarab)"_#Bessarab. + +Each replica runs on a partition of one or more processors. Processor +partitions are defined at run-time using the "-partition command-line +switch"_Run_options.html. Note that if you have MPI installed, you +can run a multi-replica simulation with more replicas (partitions) +than you have physical processors, e.g you can run a 10-replica +simulation on just one or two processors. You will simply not get the +performance speed-up you would see with one or more physical +processors per replica. See the "Howto replica"_Howto_replica.html +doc page for further discussion. + +NOTE: As explained below, a GNEB calculation performs a damped dynamics +minimization across all the replicas. The "spin"_min_spin.html +style minimizer has to be defined in your input script. + +When a GNEB calculation is performed, it is assumed that each replica +is running the same system, though LAMMPS does not check for this. +I.e. the simulation domain, the number of magnetic atoms, the +interaction potentials, and the starting configuration when the neb +command is issued should be the same for every replica. + +In a GNEB calculation each replica is connected to other replicas by +inter-replica nudging forces. These forces are imposed by the "fix +neb/spin"_fix_neb_spin.html command, which must be used in conjunction +with the neb command. +The group used to define the fix neb/spin command defines the +GNEB magnetic atoms which are the only ones that inter-replica springs +are applied to. +If the group does not include all magnetic atoms, then non-GNEB +magnetic atoms have no inter-replica springs and the torques they feel +and their precessional motion is computed in the usual way due only +to other magnetic atoms within their replica. +Conceptually, the non-GNEB atoms provide a background force field for +the GNEB atoms. +Their magnetic spins can be allowed to precess during the GNEB +minimization procedure. + +The initial spin configuration for each of the replicas can be +specified in different manners via the {file-style} setting, as +discussed below. Only atomic spins whose initial coordinates should +differ from the current configuration need to be specified. + +Conceptually, the initial and final configurations for the first +replica should be states on either side of an energy barrier. + +As explained below, the initial configurations of intermediate +replicas can be spin coordinates interpolated in a linear fashion +between the first and last replicas. This is often adequate for +simple transitions. For more complex transitions, it may lead to slow +convergence or even bad results if the minimum energy path (MEP, see +below) of states over the barrier cannot be correctly converged to +from such an initial path. In this case, you will want to generate +initial states for the intermediate replicas that are geometrically +closer to the MEP and read them in. + +################################################################### + +:line + +For a {file-style} setting of {final}, a filename is specified which +contains atomic and spin coordinates for zero or more atoms, in the +format described below. +For each atom that appears in the file, the new coordinates are +assigned to that atom in the final replica. Each intermediate replica +also assigns a new spin to that atom in an interpolated manner. +This is done by using the current direction of the spin at the starting +point and the read-in direction as the final point. +The angular distance between them is calculated, and the new direction +is assigned to be a fraction of the angular distance. + +NOTE: The "angular distance" between the starting and final point is +evaluated in the geodesic sense, as described in "(Bessarab)"_#Bessarab. + +NOTE: The angular interpolation between the starting and final point +is achieved using Rodrigues formula: + +:c,image(Eqs/neb_spin_rodrigues_formula.jpg) + +with m_i^I is the initial spin configuration for the spin i, +where the rotation and k_i is defined as: + +:c,image(Eqs/neb_spin_k.jpg) + +The distance between them is calculated, and the new position +is assigned to be a fraction of the distance. E.g. if there are 10 +replicas, the 2nd replica will assign a position that is 10% of the +distance along a line between the starting and final point, and the +9th replica will assign a position that is 90% of the distance along +the line. Note that for this procedure to produce consistent +coordinates across all the replicas, the current coordinates need to +be the same in all replicas. LAMMPS does not check for this, but +invalid initial configurations will likely result if it is not the +case. + +NOTE: The "distance" between the starting and final point is +calculated in a minimum-image sense for a periodic simulation box. +This means that if the two positions are on opposite sides of a box +(periodic in that dimension), the distance between them will be small, +because the periodic image of one of the atoms is close to the other. +Similarly, even if the assigned position resulting from the +interpolation is outside the periodic box, the atom will be wrapped +back into the box when the NEB calculation begins. + +For a {file-style} setting of {each}, a filename is specified which is +assumed to be unique to each replica. This can be done by using a +variable in the filename, e.g. + +variable i equal part +neb 0.0 0.001 1000 500 50 each coords.initial.$i :pre + +which in this case will substitute the partition ID (0 to N-1) for the +variable I, which is also effectively the replica ID. See the +"variable"_variable.html command for other options, such as using +world-, universe-, or uloop-style variables. + +Each replica (except the first replica) will read its file, formatted +as described below, and for any atom that appears in the file, assign +the specified coordinates to its atom. The various files do not need +to contain the same set of atoms. + +For a {file-style} setting of {none}, no filename is specified. Each +replica is assumed to already be in its initial configuration at the +time the neb command is issued. This allows each replica to define +its own configuration by reading a replica-specific data or restart or +dump file, via the "read_data"_read_data.html, +"read_restart"_read_restart.html, or "read_dump"_read_dump.html +commands. The replica-specific names of these files can be specified +as in the discussion above for the {each} file-style. Also see the +section below for how a NEB calculation can produce restart files, so +that a long calculation can be restarted if needed. + +NOTE: None of the {file-style} settings change the initial +configuration of any atom in the first replica. The first replica +must thus be in the correct initial configuration at the time the neb +command is issued. + +:line + +A NEB calculation proceeds in two stages, each of which is a +minimization procedure, performed via damped dynamics. To enable +this, you must first define a damped dynamics +"min_style"_min_style.html, such as {quickmin} or {fire}. The {cg}, +{sd}, and {hftn} styles cannot be used, since they perform iterative +line searches in their inner loop, which cannot be easily synchronized +across multiple replicas. + +The minimizer tolerances for energy and force are set by {etol} and +{ftol}, the same as for the "minimize"_minimize.html command. + +A non-zero {etol} means that the NEB calculation will terminate if the +energy criterion is met by every replica. The energies being compared +to {etol} do not include any contribution from the inter-replica +nudging forces, since these are non-conservative. A non-zero {ftol} +means that the NEB calculation will terminate if the force criterion +is met by every replica. The forces being compared to {ftol} include +the inter-replica nudging forces. + +The maximum number of iterations in each stage is set by {N1} and +{N2}. These are effectively timestep counts since each iteration of +damped dynamics is like a single timestep in a dynamics +"run"_run.html. During both stages, the potential energy of each +replica and its normalized distance along the reaction path (reaction +coordinate RD) will be printed to the screen and log file every +{Nevery} timesteps. The RD is 0 and 1 for the first and last replica. +For intermediate replicas, it is the cumulative distance (normalized +by the total cumulative distance) between adjacent replicas, where +"distance" is defined as the length of the 3N-vector of differences in +atomic coordinates, where N is the number of NEB atoms involved in the +transition. These outputs allow you to monitor NEB's progress in +finding a good energy barrier. {N1} and {N2} must both be multiples +of {Nevery}. + +In the first stage of NEB, the set of replicas should converge toward +a minimum energy path (MEP) of conformational states that transition +over a barrier. The MEP for a transition is defined as a sequence of +3N-dimensional states, each of which has a potential energy gradient +parallel to the MEP itself. The configuration of highest energy along +a MEP corresponds to a saddle point. The replica states will also be +roughly equally spaced along the MEP due to the inter-replica nudging +force added by the "fix neb"_fix_neb.html command. + +In the second stage of NEB, the replica with the highest energy is +selected and the inter-replica forces on it are converted to a force +that drives its atom coordinates to the top or saddle point of the +barrier, via the barrier-climbing calculation described in +"(HenkelmanB)"_#HenkelmanB. As before, the other replicas rearrange +themselves along the MEP so as to be roughly equally spaced. + +When both stages are complete, if the NEB calculation was successful, +the configurations of the replicas should be along (close to) the MEP +and the replica with the highest energy should be an atomic +configuration at (close to) the saddle point of the transition. The +potential energies for the set of replicas represents the energy +profile of the transition along the MEP. + +:line + +A few other settings in your input script are required or advised to +perform a NEB calculation. See the NOTE about the choice of timestep +at the beginning of this doc page. + +An atom map must be defined which it is not by default for "atom_style +atomic"_atom_style.html problems. The "atom_modify +map"_atom_modify.html command can be used to do this. + +The minimizers in LAMMPS operate on all atoms in your system, even +non-NEB atoms, as defined above. To prevent non-NEB atoms from moving +during the minimization, you should use the "fix +setforce"_fix_setforce.html command to set the force on each of those +atoms to 0.0. This is not required, and may not even be desired in +some cases, but if those atoms move too far (e.g. because the initial +state of your system was not well-minimized), it can cause problems +for the NEB procedure. + +The damped dynamics "minimizers"_min_style.html, such as {quickmin} +and {fire}), adjust the position and velocity of the atoms via an +Euler integration step. Thus you must define an appropriate +"timestep"_timestep.html to use with NEB. As mentioned above, NEB +will often converge more quickly if you use a timestep about 10x +larger than you would normally use for dynamics simulations. + +:line + +Each file read by the neb command containing atomic coordinates used +to initialize one or more replicas must be formatted as follows. + +The file can be ASCII text or a gzipped text file (detected by a .gz +suffix). The file can contain initial blank lines or comment lines +starting with "#" which are ignored. The first non-blank, non-comment +line should list N = the number of lines to follow. The N successive +lines contain the following information: + +ID1 x1 y1 z1 +ID2 x2 y2 z2 +... +IDN xN yN zN :pre + +The fields are the atom ID, followed by the x,y,z coordinates. The +lines can be listed in any order. Additional trailing information on +the line is OK, such as a comment. + +Note that for a typical NEB calculation you do not need to specify +initial coordinates for very many atoms to produce differing starting +and final replicas whose intermediate replicas will converge to the +energy barrier. Typically only new coordinates for atoms +geometrically near the barrier need be specified. + +Also note there is no requirement that the atoms in the file +correspond to the NEB atoms in the group defined by the "fix +neb"_fix_neb.html command. Not every NEB atom need be in the file, +and non-NEB atoms can be listed in the file. + +:line + +Four kinds of output can be generated during a NEB calculation: energy +barrier statistics, thermodynamic output by each replica, dump files, +and restart files. + +When running with multiple partitions (each of which is a replica in +this case), the print-out to the screen and master log.lammps file +contains a line of output, printed once every {Nevery} timesteps. It +contains the timestep, the maximum force per replica, the maximum +force per atom (in any replica), potential gradients in the initial, +final, and climbing replicas, the forward and backward energy +barriers, the total reaction coordinate (RDT), and the normalized +reaction coordinate and potential energy of each replica. + +The "maximum force per replica" is the two-norm of the 3N-length force +vector for the atoms in each replica, maximized across replicas, which +is what the {ftol} setting is checking against. In this case, N is +all the atoms in each replica. The "maximum force per atom" is the +maximum force component of any atom in any replica. The potential +gradients are the two-norm of the 3N-length force vector solely due to +the interaction potential i.e. without adding in inter-replica +forces. + +The "reaction coordinate" (RD) for each replica is the two-norm of the +3N-length vector of distances between its atoms and the preceding +replica's atoms, added to the RD of the preceding replica. The RD of +the first replica RD1 = 0.0; the RD of the final replica RDN = RDT, +the total reaction coordinate. The normalized RDs are divided by RDT, +so that they form a monotonically increasing sequence from zero to +one. When computing RD, N only includes the atoms being operated on by +the fix neb command. + +The forward (reverse) energy barrier is the potential energy of the +highest replica minus the energy of the first (last) replica. + +Supplementary information for all replicas can be printed out to the +screen and master log.lammps file by adding the verbose keyword. This +information include the following. The "path angle" (pathangle) for +the replica i which is the angle between the 3N-length vectors (Ri-1 - +Ri) and (Ri+1 - Ri) (where Ri is the atomic coordinates of replica +i). A "path angle" of 180 indicates that replicas i-1, i and i+1 are +aligned. "angletangrad" is the angle between the 3N-length tangent +vector and the 3N-length force vector at image i. The tangent vector +is calculated as in "(HenkelmanA)"_#HenkelmanA for all intermediate +replicas and at R2 - R1 and RM - RM-1 for the first and last replica, +respectively. "anglegrad" is the angle between the 3N-length energy +gradient vector of replica i and that of replica i+1. It is not +defined for the final replica and reads nan. gradV is the norm of the +energy gradient of image i. ReplicaForce is the two-norm of the +3N-length force vector (including nudging forces) for replica i. +MaxAtomForce is the maximum force component of any atom in replica i. + +When a NEB calculation does not converge properly, the supplementary +information can help understanding what is going wrong. For instance +when the path angle becomes acute, the definition of tangent used in +the NEB calculation is questionable and the NEB cannot may diverge +"(Maras)"_#Maras2. + + +When running on multiple partitions, LAMMPS produces additional log +files for each partition, e.g. log.lammps.0, log.lammps.1, etc. For a +NEB calculation, these contain the thermodynamic output for each +replica. + +If "dump"_dump.html commands in the input script define a filename +that includes a {universe} or {uloop} style "variable"_variable.html, +then one dump file (per dump command) will be created for each +replica. At the end of the NEB calculation, the final snapshot in +each file will contain the sequence of snapshots that transition the +system over the energy barrier. Earlier snapshots will show the +convergence of the replicas to the MEP. + +Likewise, "restart"_restart.html filenames can be specified with a +{universe} or {uloop} style "variable"_variable.html, to generate +restart files for each replica. These may be useful if the NEB +calculation fails to converge properly to the MEP, and you wish to +restart the calculation from an intermediate point with altered +parameters. + +There are 2 Python scripts provided in the tools/python directory, +neb_combine.py and neb_final.py, which are useful in analyzing output +from a NEB calculation. Assume a NEB simulation with M replicas, and +the NEB atoms labeled with a specific atom type. + +The neb_combine.py script extracts atom coords for the NEB atoms from +all M dump files and creates a single dump file where each snapshot +contains the NEB atoms from all the replicas and one copy of non-NEB +atoms from the first replica (presumed to be identical in other +replicas). This can be visualized/animated to see how the NEB atoms +relax as the NEB calculation proceeds. + +The neb_final.py script extracts the final snapshot from each of the M +dump files to create a single dump file with M snapshots. This can be +visualized to watch the system make its transition over the energy +barrier. + +To illustrate, here are images from the final snapshot produced by the +neb_combine.py script run on the dump files produced by the two +example input scripts in examples/neb. Click on them to see a larger +image. + +:image(JPG/hop1_small.jpg,JPG/hop1.jpg) +:image(JPG/hop2_small.jpg,JPG/hop2.jpg) + +:line + +[Restrictions:] + +This command can only be used if LAMMPS was built with the SPIN +package. See the "Build package"_Build_package.html doc +page for more info. + +:line + +[Related commands:] + +"min/spin"_min_spin.html, "fix neb/spin"_fix_neb_spin.html + +[Default:] + +none + +:line + +:link(Bessarab) +[(Bessarab)] Bessarab, Uzdin, Jonsson, Comp Phys Comm, 196, +335-347 (2015). diff --git a/examples/SPIN/gneb/iron/in.gneb.iron b/examples/SPIN/gneb/iron/in.gneb.iron index c794292cfb..95e7071cb0 100644 --- a/examples/SPIN/gneb/iron/in.gneb.iron +++ b/examples/SPIN/gneb/iron/in.gneb.iron @@ -7,11 +7,10 @@ atom_style spin # necessary for the serial algorithm (sametag) atom_modify map array -read_data initial.iron_spin - # setting mass, mag. moments, and interactions for bcc iron # (mass not necessary for fixed lattice calculation) +read_data initial.iron_spin mass 1 55.845 pair_style spin/exchange 3.5 diff --git a/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion b/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion index cbab56631b..cf55c9d1d4 100644 --- a/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion +++ b/examples/SPIN/gneb/skyrmion/in.gneb.skyrmion @@ -7,11 +7,10 @@ atom_style spin # necessary for the serial algorithm (sametag) atom_modify map array -read_data initial.skyrmion - # setting mass, mag. moments, and interactions for bcc iron # (mass not necessary for fixed lattice calculation) +read_data initial.skyrmion mass 1 55.845 pair_style hybrid/overlay spin/exchange 3.1 spin/dmi 3.1 diff --git a/src/SPIN/fix_neb_spin.h b/src/SPIN/fix_neb_spin.h index 9bbacc8bf0..8e016b2e23 100644 --- a/src/SPIN/fix_neb_spin.h +++ b/src/SPIN/fix_neb_spin.h @@ -60,20 +60,20 @@ class FixNEB_spin : public Fix { double **spprev,**spnext,**fmnext; double **springF; double **tangent; - double **xsend,**xrecv; // coords to send/recv to/from other replica - double **fsend,**frecv; // coords to send/recv to/from other replica - double **spsend,**sprecv; // sp to send/recv to/from other replica - double **fmsend,**fmrecv; // fm to send/recv to/from other replica - tagint *tagsend,*tagrecv; // ditto for atom IDs + double **xsend,**xrecv; // coords to send/recv to/from other replica + double **fsend,**frecv; // coords to send/recv to/from other replica + double **spsend,**sprecv; // sp to send/recv to/from other replica + double **fmsend,**fmrecv; // fm to send/recv to/from other replica + tagint *tagsend,*tagrecv; // ditto for atom IDs - // info gathered from all procs in my replica - double **xsendall,**xrecvall; // coords to send/recv to/from other replica - double **fsendall,**frecvall; // force to send/recv to/from other replica - double **spsendall,**sprecvall; // sp to send/recv to/from other replica - double **fmsendall,**fmrecvall; // fm to send/recv to/from other replica - tagint *tagsendall,*tagrecvall; // ditto for atom IDs + // info gathered from all procs in my replica + double **xsendall,**xrecvall; // coords to send/recv to/from other replica + double **fsendall,**frecvall; // force to send/recv to/from other replica + double **spsendall,**sprecvall; // sp to send/recv to/from other replica + double **fmsendall,**fmrecvall; // fm to send/recv to/from other replica + tagint *tagsendall,*tagrecvall; // ditto for atom IDs - int *counts,*displacements; // used for MPI_Gather + int *counts,*displacements; // used for MPI_Gather double geodesic_distance(double *, double *); void inter_replica_comm(); @@ -97,16 +97,16 @@ E: Potential energy ID for fix neb does not exist Self-explanatory. -E: Too many active NEB atoms +E: Too many active GNEB atoms UNDOCUMENTED -E: Too many atoms for NEB +E: Too many atoms for GNEB UNDOCUMENTED U: Atom count changed in fix neb -This is not allowed in a NEB calculation. +This is not allowed in a GNEB calculation. */ diff --git a/src/SPIN/neb_spin.cpp b/src/SPIN/neb_spin.cpp index 69c59e0484..77a94c5e84 100644 --- a/src/SPIN/neb_spin.cpp +++ b/src/SPIN/neb_spin.cpp @@ -111,6 +111,8 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, double **sp = atom->sp; int nlocal = atom->nlocal; + int temp_flag,rot_flag; + temp_flag = rot_flag = 0; int ii = 0; double spinit[3],spfinal[3]; for (int i = 0; i < nlocal; i++) { @@ -123,7 +125,7 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, spfinal[2] = buf_final[ii+2]; // interpolate intermediate spin states - + if (fraction == 0.0) { sp[i][0] = spinit[0]; sp[i][1] = spinit[1]; @@ -133,7 +135,8 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, sp[i][1] = spfinal[1]; sp[i][2] = spfinal[2]; } else { - initial_rotation(spinit,spfinal,fraction); + temp_flag = initial_rotation(spinit,spfinal,fraction); + rot_flag = MAX(temp_flag,rot_flag); sp[i][0] = spfinal[0]; sp[i][1] = spfinal[1]; sp[i][2] = spfinal[2]; @@ -141,6 +144,14 @@ NEB_spin::NEB_spin(LAMMPS *lmp, double etol_in, double ftol_in, int n1steps_in, ii += 3; } + + // warning message if one or more couples (spi,spf) were aligned + // this breaks Rodrigues' formula, and an arbitrary rotation + // vector has to be chosen + + if ((rot_flag > 0) && (comm->me == 0)) + error->warning(FLERR,"arbitrary initial rotation of one or more spin(s)"); + } /* ---------------------------------------------------------------------- */ @@ -494,6 +505,8 @@ void NEB_spin::readfile(char *file, int flag) int ncount = 0; + int temp_flag,rot_flag; + temp_flag = rot_flag = 0; int nread = 0; while (nread < nlines) { nchunk = MIN(nlines-nread,CHUNK); @@ -566,7 +579,8 @@ void NEB_spin::readfile(char *file, int flag) sp[m][1] = spfinal[1]; sp[m][2] = spfinal[2]; } else { - initial_rotation(spinit,spfinal,fraction); + temp_flag = initial_rotation(spinit,spfinal,fraction); + rot_flag = MAX(temp_flag,rot_flag); sp[m][0] = spfinal[0]; sp[m][1] = spfinal[1]; sp[m][2] = spfinal[2]; @@ -588,6 +602,13 @@ void NEB_spin::readfile(char *file, int flag) nread += nchunk; } + // warning message if one or more couples (spi,spf) were aligned + // this breaks Rodrigues' formula, and an arbitrary rotation + // vector has to be chosen + + if ((rot_flag > 0) && (comm->me == 0)) + error->warning(FLERR,"arbitrary initial rotation of one or more spin(s)"); + // check that all atom IDs in file were found by a proc if (flag == 0) { @@ -621,69 +642,24 @@ void NEB_spin::readfile(char *file, int flag) } /* ---------------------------------------------------------------------- - initial configuration of spin sploc using Rodrigues' formula + initial configuration of intermediate spins using Rodrigues' formula interpolates between initial (spi) and final (stored in sploc) ------------------------------------------------------------------------- */ -void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) +int NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) { - // implementing initial rotation using atan2 - // this may not be a sufficient routine, need more accurate verifications + // no interpolation for initial and final replica - // interpolation only for intermediate replica + if (fraction == 0.0 || fraction == 1.0) return 0; - if (fraction == 0.0 || fraction == 1.0) return; - - // initial, final and inter ang. values - - //double itheta,iphi,ftheta,fphi,ktheta,kphi; - //double spix,spiy,spiz,spfx,spfy,spfz; - //double spkx,spky,spkz,iknorm; - - //spix = spi[0]; - //spiy = spi[1]; - //spiz = spi[2]; - - //spfx = sploc[0]; - //spfy = sploc[1]; - //spfz = sploc[2]; - - //iphi = itheta = fphi = ftheta = 0.0; - - //iphi = acos(spiz); - //if (sin(iphi) != 0.0) - // itheta = acos(spix/sin(iphi)); - - //fphi = acos(spfz); - //if (sin(fphi) != 0.0) - // ftheta = acos(spfx/sin(fphi)); - - //kphi = iphi + fraction*(fphi-iphi); - //ktheta = itheta + fraction*(ftheta-itheta); - - //spkx = cos(ktheta)*sin(kphi); - //spky = sin(ktheta)*sin(kphi); - //spkz = cos(kphi); - - //double knormsq = spkx*spkx + spky*spky + spkz*spkz; - //if (knormsq != 0.0) - // iknorm = 1.0/sqrt(knormsq); - - //spkx *= iknorm; - //spky *= iknorm; - //spkz *= iknorm; - - //sploc[0] = spkx; - //sploc[1] = spky; - //sploc[2] = spkz; - + int rot_flag = 0; double kx,ky,kz; double spix,spiy,spiz,spfx,spfy,spfz; double kcrossx,kcrossy,kcrossz,knormsq; double kdots; double spkx,spky,spkz; - double sdot,omega,iknorm,isnorm; + double sidotsf,omega,iknorm,isnorm; spix = spi[0]; spiy = spi[1]; @@ -698,43 +674,73 @@ void NEB_spin::initial_rotation(double *spi, double *sploc, double fraction) kz = spix*spfy - spiy*spfx; knormsq = kx*kx+ky*ky+kz*kz; - - if (knormsq != 0.0) { - iknorm = 1.0/sqrt(knormsq); - kx *= iknorm; - ky *= iknorm; - kz *= iknorm; + sidotsf = spix*spfx + spiy*spfy + spiz*spfz; + + // if knormsq == 0.0, init and final spins are aligned + // Rodrigues' formula breaks, needs to define another axis k + + if (knormsq == 0.0) { + if (sidotsf > 0.0) { // spins aligned and in same direction + return 0; + } else if (sidotsf < 0.0) { // spins aligned and in opposite directions + + // defining a rotation axis + // first guess, k = spi x [100] + // second guess, k = spi x [010] + + if (spiy*spiy + spiz*spiz != 0.0) { // spin not along [100] + kx = 0.0; + ky = spiz; + kz = -spiy; + } else if (spix*spix + spiz*spiz != 0.0) { // spin not along [010] + kx = -spiz; + ky = 0.0; + kz = spix; + } else error->all(FLERR,"Incorrect initial rotation operation"); + rot_flag = 1; + } } - + kcrossx = ky*spiz - kz*spiy; kcrossy = kz*spix - kx*spiz; kcrossz = kx*spiy - ky*spix; kdots = kx*spix + ky*spiz + kz*spiz; - sdot = spix*spfx + spiy*spfy + spiz*spfz; - omega = acos(sdot); + omega = acos(sidotsf); omega *= fraction; - spkx = spix*cos(omega) + kcrossx*sin(omega); - spky = spiy*cos(omega) + kcrossy*sin(omega); - spkz = spiz*cos(omega) + kcrossz*sin(omega); + // applying Rodrigues' formula + + spkx = spix*cos(omega); + spky = spiy*cos(omega); + spkz = spiz*cos(omega); + + spkx += kcrossx*sin(omega); + spky += kcrossy*sin(omega); + spkz += kcrossz*sin(omega); spkx += kx*kdots*(1.0-cos(omega)); spky += ky*kdots*(1.0-cos(omega)); spkz += kz*kdots*(1.0-cos(omega)); + // normalizing resulting spin vector + isnorm = 1.0/sqrt(spkx*spkx+spky*spky+spkz*spkz); if (isnorm == 0.0) - error->all(FLERR,"Incorrect rotation operation"); + error->all(FLERR,"Incorrect initial rotation operation"); spkx *= isnorm; spky *= isnorm; spkz *= isnorm; + // returns rotated spin + sploc[0] = spkx; sploc[1] = spky; sploc[2] = spkz; + + return rot_flag; } /* ---------------------------------------------------------------------- diff --git a/src/SPIN/neb_spin.h b/src/SPIN/neb_spin.h index 5988c04a3a..b7c20bc3a9 100644 --- a/src/SPIN/neb_spin.h +++ b/src/SPIN/neb_spin.h @@ -57,7 +57,7 @@ class NEB_spin : protected Pointers { double *fmaxatomInRepl; // force on an image void readfile(char *, int); - void initial_rotation(double *, double *, double); + int initial_rotation(double *, double *, double); void open(char *); void print_status(); }; diff --git a/src/SPIN/pair_spin_dmi.cpp b/src/SPIN/pair_spin_dmi.cpp index 5e9ff7a39e..41430d230f 100644 --- a/src/SPIN/pair_spin_dmi.cpp +++ b/src/SPIN/pair_spin_dmi.cpp @@ -171,10 +171,11 @@ void PairSpinDmi::init_style() int ifix = 0; while (ifix < modify->nfix) { if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + if (strcmp(modify->fix[ifix]->style,"neb/spin") == 0) break; ifix++; } if ((ifix == modify->nfix) && (comm->me == 0)) - error->warning(FLERR,"Using pair/spin style without nve/spin"); + error->warning(FLERR,"Using pair/spin style without nve/spin or neb/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 71b4c2ebf6..0260a611cf 100644 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -162,7 +162,7 @@ void PairSpinExchange::init_style() ifix++; } if ((ifix == modify->nfix) && (comm->me == 0)) - error->warning(FLERR,"Using pair/spin style without nve/spin"); + error->warning(FLERR,"Using pair/spin style without nve/spin or neb/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 6ff003521d..1f1488b93c 100644 --- a/src/SPIN/pair_spin_magelec.cpp +++ b/src/SPIN/pair_spin_magelec.cpp @@ -164,10 +164,11 @@ void PairSpinMagelec::init_style() int ifix = 0; while (ifix < modify->nfix) { if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + if (strcmp(modify->fix[ifix]->style,"neb/spin") == 0) break; ifix++; } if ((ifix == modify->nfix) && (comm->me == 0)) - error->warning(FLERR,"Using pair/spin style without nve/spin"); + error->warning(FLERR,"Using pair/spin style without nve/spin or neb/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 a39d6f3461..03041da17f 100644 --- a/src/SPIN/pair_spin_neel.cpp +++ b/src/SPIN/pair_spin_neel.cpp @@ -171,10 +171,11 @@ void PairSpinNeel::init_style() int ifix = 0; while (ifix < modify->nfix) { if (strcmp(modify->fix[ifix]->style,"nve/spin") == 0) break; + if (strcmp(modify->fix[ifix]->style,"neb/spin") == 0) break; ifix++; } if ((ifix == modify->nfix) && (comm->me == 0)) - error->warning(FLERR,"Using pair/spin style without nve/spin"); + error->warning(FLERR,"Using pair/spin style without nve/spin or neb/spin"); // get the lattice_flag from nve/spin From 4f459a59a1bc69eedb27d3465598ee17dc189fd9 Mon Sep 17 00:00:00 2001 From: oywg11 Date: Fri, 5 Apr 2019 22:55:40 +0300 Subject: [PATCH 0477/1242] correct the spelling --- doc/src/pair_ilp_graphene_hbn.txt | 6 +++--- doc/src/pair_kolmogorov_crespi_full.txt | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/src/pair_ilp_graphene_hbn.txt b/doc/src/pair_ilp_graphene_hbn.txt index 5c44128edb..e52a2a79af 100644 --- a/doc/src/pair_ilp_graphene_hbn.txt +++ b/doc/src/pair_ilp_graphene_hbn.txt @@ -48,9 +48,9 @@ It is important to include all the pairs to build the neighbor list for calculating the normals. NOTE: This potential (ILP) is intended for interlayer interactions between two -different layers of graphene, hexagonal boron nitride (h-BN) and their heterojunctions. +different layers of graphene, hexagonal boron nitride (h-BN) and their hetero-junction. To perform a realistic simulation, this potential must be used in combination with -intralyer potential, such as "AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential. +intra-layer potential, such as "AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential. To keep the intralayer properties unaffected, the interlayer interaction within the same layers should be avoided. Hence, each atom has to have a layer identifier such that atoms residing on the same layer interact via the @@ -69,7 +69,7 @@ are fitted with taper function by setting the cutoff equal to 16.0 Angstrom. Using different cutoff or taper function should be careful. The parameters for atoms pairs between Boron and Nitrogen are fitted with a screened Coulomb interaction "coul/shield"_pair_coul_shield.html. Therefore, -to simulated the properties of h-BN correclty, this potential must be used in +to simulated the properties of h-BN correctly, this potential must be used in combination with the pair style "coul/shield"_pair_coul_shield.html. NOTE: Two new sets of parameters of ILP for two-dimensional hexagonal diff --git a/doc/src/pair_kolmogorov_crespi_full.txt b/doc/src/pair_kolmogorov_crespi_full.txt index c14bfc6511..05effc5620 100644 --- a/doc/src/pair_kolmogorov_crespi_full.txt +++ b/doc/src/pair_kolmogorov_crespi_full.txt @@ -44,9 +44,9 @@ can be found in pair style "ilp/graphene/hbn"_pair_ilp_graphene_hbn.html. NOTE: This potential (ILP) is intended for interlayer interactions between two different layers of graphene. To perform a realistic simulation, this potential -must be used in combination with intralyer potential, such as +must be used in combination with intra-layer potential, such as "AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential. -To keep the intralayer properties unaffected, the interlayer interaction +To keep the intra-layer properties unaffected, the interlayer interaction within the same layers should be avoided. Hence, each atom has to have a layer identifier such that atoms residing on the same layer interact via the appropriate intra-layer potential and atoms residing on different layers From 6e6d35057278023690ddaa1731b702714caf5164 Mon Sep 17 00:00:00 2001 From: oywg11 Date: Fri, 5 Apr 2019 23:01:28 +0300 Subject: [PATCH 0478/1242] correct the spelling --- doc/src/pair_ilp_graphene_hbn.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/src/pair_ilp_graphene_hbn.txt b/doc/src/pair_ilp_graphene_hbn.txt index e52a2a79af..3a5d4accd5 100644 --- a/doc/src/pair_ilp_graphene_hbn.txt +++ b/doc/src/pair_ilp_graphene_hbn.txt @@ -51,7 +51,7 @@ NOTE: This potential (ILP) is intended for interlayer interactions between two different layers of graphene, hexagonal boron nitride (h-BN) and their hetero-junction. To perform a realistic simulation, this potential must be used in combination with intra-layer potential, such as "AIREBO"_pair_airebo.html or "Tersoff"_pair_tersoff.html potential. -To keep the intralayer properties unaffected, the interlayer interaction +To keep the intra-layer properties unaffected, the interlayer interaction within the same layers should be avoided. Hence, each atom has to have a layer identifier such that atoms residing on the same layer interact via the appropriate intra-layer potential and atoms residing on different layers From 542d8aaf070ff36bbfa601292bbfc8cc19121b3c Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Fri, 5 Apr 2019 14:16:25 -0600 Subject: [PATCH 0479/1242] Fix bug in fix_nh_kokkos --- src/KOKKOS/fix_nh_kokkos.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/KOKKOS/fix_nh_kokkos.cpp b/src/KOKKOS/fix_nh_kokkos.cpp index ba6e8919ea..fae9ef8f30 100644 --- a/src/KOKKOS/fix_nh_kokkos.cpp +++ b/src/KOKKOS/fix_nh_kokkos.cpp @@ -106,8 +106,8 @@ void FixNHKokkos::setup(int vflag) if (t0 == 0.0) { atomKK->sync(temperature->execution_space,temperature->datamask_read); - atomKK->modified(temperature->execution_space,temperature->datamask_modify); t0 = temperature->compute_scalar(); + atomKK->modified(temperature->execution_space,temperature->datamask_modify); if (t0 == 0.0) { if (strcmp(update->unit_style,"lj") == 0) t0 = 1.0; else t0 = 300.0; @@ -119,8 +119,8 @@ void FixNHKokkos::setup(int vflag) if (pstat_flag) compute_press_target(); atomKK->sync(temperature->execution_space,temperature->datamask_read); - atomKK->modified(temperature->execution_space,temperature->datamask_modify); t_current = temperature->compute_scalar(); + atomKK->modified(temperature->execution_space,temperature->datamask_modify); tdof = temperature->dof; if (pstat_flag) { @@ -250,10 +250,11 @@ void FixNHKokkos::final_integrate() // per-atom values are invalid if reneigh/comm occurred // since temp->compute() in initial_integrate() - if (which == BIAS && neighbor->ago == 0) + if (which == BIAS && neighbor->ago == 0) { atomKK->sync(temperature->execution_space,temperature->datamask_read); - atomKK->modified(temperature->execution_space,temperature->datamask_modify); t_current = temperature->compute_scalar(); + atomKK->modified(temperature->execution_space,temperature->datamask_modify); + } if (pstat_flag) nh_v_press(); @@ -261,8 +262,8 @@ void FixNHKokkos::final_integrate() // compute appropriately coupled elements of mvv_current atomKK->sync(temperature->execution_space,temperature->datamask_read); - atomKK->modified(temperature->execution_space,temperature->datamask_modify); t_current = temperature->compute_scalar(); + atomKK->modified(temperature->execution_space,temperature->datamask_modify); tdof = temperature->dof; if (pstat_flag) { @@ -476,8 +477,6 @@ void FixNHKokkos::remap() template void FixNHKokkos::nh_v_press() { - atomKK->sync(execution_space,V_MASK | MASK_MASK); - v = atomKK->k_v.view(); mask = atomKK->k_mask.view(); int nlocal = atomKK->nlocal; @@ -493,6 +492,8 @@ void FixNHKokkos::nh_v_press() atomKK->modified(temperature->execution_space,temperature->datamask_modify); } + atomKK->sync(execution_space,V_MASK | MASK_MASK); + copymode = 1; if (pstyle == TRICLINIC) Kokkos::parallel_for(Kokkos::RangePolicy >(0,nlocal),*this); @@ -536,7 +537,6 @@ template void FixNHKokkos::nve_v() { atomKK->sync(execution_space,X_MASK | V_MASK | F_MASK | MASK_MASK | RMASS_MASK | TYPE_MASK); - atomKK->modified(execution_space,V_MASK); v = atomKK->k_v.view(); f = atomKK->k_f.view(); @@ -553,6 +553,8 @@ void FixNHKokkos::nve_v() else Kokkos::parallel_for(Kokkos::RangePolicy >(0,nlocal),*this); copymode = 0; + + atomKK->modified(execution_space,V_MASK); } template @@ -616,8 +618,6 @@ void FixNHKokkos::operator()(TagFixNH_nve_x, const int &i) const { template void FixNHKokkos::nh_v_temp() { - atomKK->sync(execution_space,V_MASK | MASK_MASK); - v = atomKK->k_v.view(); mask = atomKK->k_mask.view(); int nlocal = atomKK->nlocal; @@ -629,6 +629,8 @@ void FixNHKokkos::nh_v_temp() atomKK->modified(temperature->execution_space,temperature->datamask_modify); } + atomKK->sync(execution_space,V_MASK | MASK_MASK); + copymode = 1; Kokkos::parallel_for(Kokkos::RangePolicy(0,nlocal),*this); copymode = 0; From e56d69a267a38796478f4840465aa85067f87854 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 15:51:32 -0400 Subject: [PATCH 0480/1242] silence compiler warnings --- src/RIGID/fix_shake.cpp | 2 +- src/USER-OMP/reaxc_forces_omp.cpp | 4 ++-- src/USER-REAXC/reaxc_traj.cpp | 4 ++-- src/group.cpp | 4 ++-- src/memory.h | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/RIGID/fix_shake.cpp b/src/RIGID/fix_shake.cpp index 1e8414d321..23ced2d0e7 100644 --- a/src/RIGID/fix_shake.cpp +++ b/src/RIGID/fix_shake.cpp @@ -1390,7 +1390,7 @@ void FixShake::shake_info(int *npartner, tagint **partner_tag, ------------------------------------------------------------------------- */ int FixShake::rendezvous_ids(int n, char *inbuf, - int &flag, int *&proclist, char *&outbuf, + int &flag, int *& /*proclist*/, char *& /*outbuf*/, void *ptr) { FixShake *fsptr = (FixShake *) ptr; diff --git a/src/USER-OMP/reaxc_forces_omp.cpp b/src/USER-OMP/reaxc_forces_omp.cpp index 1e1cf44f50..0a08bd6a46 100644 --- a/src/USER-OMP/reaxc_forces_omp.cpp +++ b/src/USER-OMP/reaxc_forces_omp.cpp @@ -262,8 +262,8 @@ void Compute_Total_ForceOMP( reax_system *system, control_params *control, /* ---------------------------------------------------------------------- */ -void Validate_ListsOMP( reax_system *system, storage * /*workspace */, reax_list **lists, - int step, int n, int N, int numH, MPI_Comm comm ) +void Validate_ListsOMP(reax_system *system, storage * /*workspace*/, reax_list **lists, + int step, int n, int N, int numH, MPI_Comm /*comm*/) { int i, comp, Hindex; reax_list *bonds, *hbonds; diff --git a/src/USER-REAXC/reaxc_traj.cpp b/src/USER-REAXC/reaxc_traj.cpp index 5adc0cfbb9..356d7b6eeb 100644 --- a/src/USER-REAXC/reaxc_traj.cpp +++ b/src/USER-REAXC/reaxc_traj.cpp @@ -58,7 +58,7 @@ void Write_Skip_Line( output_controls *out_control, mpi_datatypes * /*mpi_data*/ int Write_Header( reax_system *system, control_params *control, - output_controls *out_control, mpi_datatypes *mpi_data ) + output_controls *out_control, mpi_datatypes * /*mpi_data*/ ) { int num_hdr_lines, my_hdr_lines, buffer_req; char ensembles[ens_N][25] = { "NVE", "NVT", "fully flexible NPT", @@ -357,7 +357,7 @@ int Init_Traj( reax_system *system, control_params *control, int Write_Frame_Header( reax_system *system, control_params *control, simulation_data *data, output_controls *out_control, - mpi_datatypes *mpi_data ) + mpi_datatypes * /*mpi_data*/ ) { int me, num_frm_hdr_lines, my_frm_hdr_lines, buffer_req; diff --git a/src/group.cpp b/src/group.cpp index 6c19af8bc6..256bab7778 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -40,7 +40,7 @@ using namespace LAMMPS_NS; #define MAX_GROUP 32 #define EPSILON 1.0e-6 -enum{TYPE,MOLECULE,ID}; +enum{NONE,TYPE,MOLECULE,ID}; enum{LT,LE,GT,GE,EQ,NEQ,BETWEEN}; #define BIG 1.0e20 @@ -202,7 +202,7 @@ void Group::assign(int narg, char **arg) if (narg < 3) error->all(FLERR,"Illegal group command"); - int category; + int category=NONE; if (strcmp(arg[1],"type") == 0) category = TYPE; else if (strcmp(arg[1],"molecule") == 0) category = MOLECULE; else if (strcmp(arg[1],"id") == 0) category = ID; diff --git a/src/memory.h b/src/memory.h index b5d70b977f..c5eddc7fe7 100644 --- a/src/memory.h +++ b/src/memory.h @@ -477,7 +477,7 @@ class Memory : protected Pointers { } template - TYPE *****grow(TYPE *****&array, int n1, int n2, int n3, int n4, + TYPE *****grow(TYPE *****& /*array*/, int /*n1*/, int /*n2*/, int /*n3*/, int /*n4*/, const char *name) { fail(name); return NULL; From d17553d8d294d6a6598526f5dcfaa3305a783fde Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 16:52:28 -0400 Subject: [PATCH 0481/1242] add preset to make it easier to use clang with OpenMP and MPI --- cmake/presets/clang.cmake | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 cmake/presets/clang.cmake diff --git a/cmake/presets/clang.cmake b/cmake/presets/clang.cmake new file mode 100644 index 0000000000..224f140dc1 --- /dev/null +++ b/cmake/presets/clang.cmake @@ -0,0 +1,16 @@ +# preset that will enable clang/clang++ with support for MPI and OpenMP (on Linux boxes) + +set(CMAKE_CXX_COMPILER "clang++" CACHE STRING "" FORCE) +set(CMAKE_C_COMPILER "clang" CACHE STRING "" FORCE) +set(CMAKE_CXX_FLAGS "-Wall -Wextra -g -O2 -DNDEBG" CACHE STRING "" FORCE) +set(MPI_CXX "clang++" CACHE STRING "" FORCE) +set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE) + +set(OpenMP_C "clang" CACHE STRING "" FORCE) +set(OpenMP_C_FLAGS "-fopenmp" CACHE STRING "" FORCE) +set(OpenMP_C_LIB_NAMES "omp" CACHE STRING "" FORCE) +set(OpenMP_CXX "clang++" CACHE STRING "" FORCE) +set(OpenMP_CXX_FLAGS "-fopenmp" CACHE STRING "" FORCE) +set(OpenMP_CXX_LIB_NAMES "omp" CACHE STRING "" FORCE) +set(OpenMP_omp_LIBRARY "/usr/lib64/libomp.so" CACHE PATH "" FORCE) + From 3d7a4fb9459feb6018ccdcd609aae87b4c3c11eb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 17:04:07 -0400 Subject: [PATCH 0482/1242] silence compiler warnings, remove dead code --- src/USER-REAXC/reaxc_init_md.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/USER-REAXC/reaxc_init_md.cpp b/src/USER-REAXC/reaxc_init_md.cpp index 39b31c38b5..df5de49034 100644 --- a/src/USER-REAXC/reaxc_init_md.cpp +++ b/src/USER-REAXC/reaxc_init_md.cpp @@ -156,7 +156,7 @@ int Init_MPI_Datatypes( reax_system *system, storage * /*workspace*/, int Init_Lists( reax_system *system, control_params *control, simulation_data * /*data*/, storage * /*workspace*/, reax_list **lists, - mpi_datatypes *mpi_data, char * /*msg*/ ) + mpi_datatypes * /*mpi_data*/, char * /*msg*/ ) { int i, total_hbonds, total_bonds, bond_cap, num_3body, cap_3body, Htop; int *hb_top, *bond_top; @@ -219,8 +219,6 @@ void Initialize( reax_system *system, control_params *control, mpi_datatypes *mpi_data, MPI_Comm comm ) { char msg[MAX_STR]; - char errmsg[128]; - if (Init_MPI_Datatypes(system, workspace, mpi_data, comm, msg) == FAILURE) { control->error_ptr->one(FLERR,"Could not create datatypes"); From f8018a8bbac14bd3c6e3a640b142eece5e5aa5f9 Mon Sep 17 00:00:00 2001 From: julient31 Date: Fri, 5 Apr 2019 16:44:23 -0600 Subject: [PATCH 0483/1242] Commit2 JT 040519 - added angle in doc - improved doc neb/spin --- doc/src/Eqs/neb_spin_angle.jpg | Bin 0 -> 9638 bytes doc/src/Eqs/neb_spin_angle.tex | 15 +++++++ doc/src/neb_spin.txt | 78 +++++++++++++-------------------- 3 files changed, 46 insertions(+), 47 deletions(-) create mode 100644 doc/src/Eqs/neb_spin_angle.jpg create mode 100644 doc/src/Eqs/neb_spin_angle.tex diff --git a/doc/src/Eqs/neb_spin_angle.jpg b/doc/src/Eqs/neb_spin_angle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b7021c4f620bcc5e42b3b43ea9d9c1e3c648910c GIT binary patch literal 9638 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 fpE8MZ0 Date: Fri, 5 Apr 2019 23:24:43 -0400 Subject: [PATCH 0484/1242] avoid segfault when catching command line flag errors with EXCEPTIONS enabled --- src/error.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/error.cpp b/src/error.cpp index 913239ac49..7c2d3c5409 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -72,7 +72,9 @@ void Error::universe_all(const char *file, int line, const char *str) #ifdef LAMMPS_EXCEPTIONS // allow commands if an exception was caught in a run - update->whichflag = 0; + // update may be NULL when catching command line errors + + if (update) update->whichflag = 0; char msg[100]; snprintf(msg, 100, "ERROR: %s (%s:%d)\n", str, truncpath(file), line); @@ -97,7 +99,9 @@ void Error::universe_one(const char *file, int line, const char *str) #ifdef LAMMPS_EXCEPTIONS // allow commands if an exception was caught in a run - update->whichflag = 0; + // update may be NULL when catching command line errors + + if (update) update->whichflag = 0; char msg[100]; snprintf(msg, 100, "ERROR: %s (%s:%d)\n", str, truncpath(file), line); @@ -148,7 +152,9 @@ void Error::all(const char *file, int line, const char *str) #ifdef LAMMPS_EXCEPTIONS // allow commands if an exception was caught in a run - update->whichflag = 0; + // update may be NULL when catching command line errors + + if (update) update->whichflag = 0; char msg[100]; snprintf(msg, 100, "ERROR: %s (%s:%d)\n", str, truncpath(file), line); @@ -198,7 +204,9 @@ void Error::one(const char *file, int line, const char *str) #ifdef LAMMPS_EXCEPTIONS // allow commands if an exception was caught in a run - update->whichflag = 0; + // update may be NULL when catching command line errors + + if (update) update->whichflag = 0; char msg[100]; snprintf(msg, 100, "ERROR on proc %d: %s (%s:%d)\n", me, str, truncpath(file), line); From f10534a7213911264cf42eef674535c9b941a7e5 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Fri, 5 Apr 2019 23:56:23 -0400 Subject: [PATCH 0485/1242] add code to build msi2lmp with CMake --- cmake/CMakeLists.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index b9a93a110e..69f695dc92 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1446,9 +1446,18 @@ if(BUILD_EXE) if(ENABLE_TESTING) add_test(ShowHelp ${LAMMPS_BINARY} -help) endif() + + enable_language(C) + get_filename_component(MSI2LMP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../tools/msi2lmp/src ABSOLUTE) + file(GLOB MSI2LMP_SOURCES ${MSI2LMP_SOURCE_DIR}/[^.]*.c) + add_executable(msi2lmp ${MSI2LMP_SOURCES}) + target_link_libraries(msi2lmp m) + install(TARGETS msi2lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) + endif() + ############################################################################### # Build documentation ############################################################################### From e629733d0b552d5b9050f3418fa6a74d0a2a0d2a Mon Sep 17 00:00:00 2001 From: oywg11 Date: Sat, 6 Apr 2019 10:26:56 +0300 Subject: [PATCH 0486/1242] change error-all to error-one --- src/USER-MISC/pair_ilp_graphene_hbn.cpp | 8 ++++---- src/USER-MISC/pair_kolmogorov_crespi_full.cpp | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/USER-MISC/pair_ilp_graphene_hbn.cpp b/src/USER-MISC/pair_ilp_graphene_hbn.cpp index c7d1c9c721..a8c9c686f1 100644 --- a/src/USER-MISC/pair_ilp_graphene_hbn.cpp +++ b/src/USER-MISC/pair_ilp_graphene_hbn.cpp @@ -448,7 +448,7 @@ void PairILPGrapheneHBN::calc_normal() // the magnitude of the normal vector nn2 = n1[0]*n1[0] + n1[1]*n1[1] + n1[2]*n1[2]; nn = sqrt(nn2); - if (nn == 0) error->all(FLERR,"The magnitude of the normal vector is zero"); + if (nn == 0) error->one(FLERR,"The magnitude of the normal vector is zero"); // the unit normal vector normal[i][0] = n1[0]/nn; normal[i][1] = n1[1]/nn; @@ -591,7 +591,7 @@ void PairILPGrapheneHBN::calc_normal() // the magnitude of the normal vector nn2 = n1[0]*n1[0] + n1[1]*n1[1] + n1[2]*n1[2]; nn = sqrt(nn2); - if (nn == 0) error->all(FLERR,"The magnitude of the normal vector is zero"); + if (nn == 0) error->one(FLERR,"The magnitude of the normal vector is zero"); // the unit normal vector normal[i][0] = n1[0]/nn; normal[i][1] = n1[1]/nn; @@ -631,7 +631,7 @@ void PairILPGrapheneHBN::calc_normal() } } else { - error->all(FLERR,"There are too many neighbors for calculating normals"); + error->one(FLERR,"There are too many neighbors for calculating normals"); } //############################################################################################## @@ -738,7 +738,7 @@ void PairILPGrapheneHBN::ILP_neigh() ILP_firstneigh[i] = neighptr; ILP_numneigh[i] = n; - if (n > 3) error->all(FLERR,"There are too many neighbors for some atoms, please check your configuration"); + if (n > 3) error->one(FLERR,"There are too many neighbors for some atoms, please check your configuration"); ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); diff --git a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp index 7b66a5b41d..39535109cd 100644 --- a/src/USER-MISC/pair_kolmogorov_crespi_full.cpp +++ b/src/USER-MISC/pair_kolmogorov_crespi_full.cpp @@ -446,7 +446,7 @@ void PairKolmogorovCrespiFull::calc_normal() // the magnitude of the normal vector nn2 = n1[0]*n1[0] + n1[1]*n1[1] + n1[2]*n1[2]; nn = sqrt(nn2); - if (nn == 0) error->all(FLERR,"The magnitude of the normal vector is zero"); + if (nn == 0) error->one(FLERR,"The magnitude of the normal vector is zero"); // the unit normal vector normal[i][0] = n1[0]/nn; normal[i][1] = n1[1]/nn; @@ -594,7 +594,7 @@ void PairKolmogorovCrespiFull::calc_normal() // the magnitude of the normal vector nn2 = n1[0]*n1[0] + n1[1]*n1[1] + n1[2]*n1[2]; nn = sqrt(nn2); - if (nn == 0) error->all(FLERR,"The magnitude of the normal vector is zero"); + if (nn == 0) error->one(FLERR,"The magnitude of the normal vector is zero"); // the unit normal vector normal[i][0] = n1[0]/nn; normal[i][1] = n1[1]/nn; @@ -634,7 +634,7 @@ void PairKolmogorovCrespiFull::calc_normal() } } else { - error->all(FLERR,"There are too many neighbors for calculating normals"); + error->one(FLERR,"There are too many neighbors for calculating normals"); } //############################################################################################## @@ -742,7 +742,7 @@ void PairKolmogorovCrespiFull::KC_neigh() KC_firstneigh[i] = neighptr; KC_numneigh[i] = n; - if (n > 3) error->all(FLERR,"There are too many neighbors for some atoms, please check your configuration"); + if (n > 3) error->one(FLERR,"There are too many neighbors for some atoms, please check your configuration"); ipage->vgot(n); if (ipage->status()) error->one(FLERR,"Neighbor list overflow, boost neigh_modify one"); From 9334c72c04fba8cbbe17cba1c063d17658f05f66 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 08:59:06 -0400 Subject: [PATCH 0487/1242] clang can be installed supporting OpenMP without having omp.h installed: add check --- cmake/CMakeLists.txt | 6 +++++- cmake/presets/clang.cmake | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 69f695dc92..2fe3ebe184 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -320,10 +320,15 @@ pkg_depends(USER-LB MPI) pkg_depends(USER-PHONON KSPACE) pkg_depends(USER-SCAFACOS MPI) +include(CheckIncludeFileCXX) find_package(OpenMP QUIET) option(BUILD_OMP "Build with OpenMP support" ${OpenMP_FOUND}) if(BUILD_OMP) find_package(OpenMP REQUIRED) + check_include_file_cxx(omp.h HAVE_OMP_H_INCLUDE) + if(NOT HAVE_OMP_H_INCLUDE) + message(FATAL_ERROR "Cannot find required 'omp.h' header file") + endif() set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") endif() @@ -796,7 +801,6 @@ endif() ######################################################################## # Basic system tests (standard libraries, headers, functions, types) # ######################################################################## -include(CheckIncludeFileCXX) foreach(HEADER cmath) check_include_file_cxx(${HEADER} FOUND_${HEADER}) if(NOT FOUND_${HEADER}) diff --git a/cmake/presets/clang.cmake b/cmake/presets/clang.cmake index 224f140dc1..828f359f54 100644 --- a/cmake/presets/clang.cmake +++ b/cmake/presets/clang.cmake @@ -5,6 +5,7 @@ set(CMAKE_C_COMPILER "clang" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS "-Wall -Wextra -g -O2 -DNDEBG" CACHE STRING "" FORCE) set(MPI_CXX "clang++" CACHE STRING "" FORCE) set(MPI_CXX_COMPILER "mpicxx" CACHE STRING "" FORCE) +unset(HAVE_OMP_H_INCLUDE CACHE) set(OpenMP_C "clang" CACHE STRING "" FORCE) set(OpenMP_C_FLAGS "-fopenmp" CACHE STRING "" FORCE) From bca7364ba3c015ae44f10c3fecd80615617707a2 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 09:21:50 -0400 Subject: [PATCH 0488/1242] disallow using fdotr for computing virial contributions with reax/c/omp --- src/USER-OMP/pair_reaxc_omp.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index a98f7c89d9..f42e9be36e 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -91,6 +91,7 @@ PairReaxCOMP::PairReaxCOMP(LAMMPS *lmp) : PairReaxC(lmp), ThrOMP(lmp, THR_PAIR) { if (lmp->citeme) lmp->citeme->add(cite_pair_reax_c_omp); + no_virial_fdotr_compute = 1; suffix_flag |= Suffix::OMP; system->pair_ptr = this; system->omp_active = 1; From bcb6e1be4fd272f3ea4d0be0b56b6976b3a5b8de Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 09:45:19 -0400 Subject: [PATCH 0489/1242] disable fdotr for virial also for regular pair style reax/c --- src/USER-OMP/pair_reaxc_omp.cpp | 2 +- src/USER-REAXC/pair_reaxc.cpp | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index f42e9be36e..90846b71f1 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -194,7 +194,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_global) control->virial = 1; + if (vflag_either) control->virial = 1; else control->virial = 0; system->n = atom->nlocal; // my atoms diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index a65c738766..cb8338da72 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -73,6 +73,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) one_coeff = 1; manybody_flag = 1; ghostneigh = 1; + no_virial_fdotr_compute = 1; system = (reax_system *) memory->smalloc(sizeof(reax_system),"reax:system"); @@ -511,7 +512,7 @@ void PairReaxC::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_global) control->virial = 1; + if (vflag_either) control->virial = 1; else control->virial = 0; system->n = atom->nlocal; // my atoms From efa8c8d58b9ffba4a287f9d5203e4344c0dc698f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 11:21:43 -0400 Subject: [PATCH 0490/1242] sanitize file pointer access handling --- src/USER-REAXC/reaxc_io_tools.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/USER-REAXC/reaxc_io_tools.cpp b/src/USER-REAXC/reaxc_io_tools.cpp index a4f0db7c7d..51aa8bca0f 100644 --- a/src/USER-REAXC/reaxc_io_tools.cpp +++ b/src/USER-REAXC/reaxc_io_tools.cpp @@ -92,13 +92,15 @@ int Close_Output_Files( reax_system *system, control_params *control, End_Traj( system->my_rank, out_control ); if (system->my_rank == MASTER_NODE) { - if (out_control->energy_update_freq > 0) { + if (out_control->pot) { fclose( out_control->pot ); + out_control->pot = NULL; } - if( control->ensemble == NPT || control->ensemble == iNPT || - control->ensemble == sNPT ) - fclose( out_control->prs ); + if (out_control->prs) { + fclose(out_control->prs); + out_control->prs = NULL; + } } return SUCCESS; @@ -122,7 +124,7 @@ void Output_Results( reax_system *system, control_params *control, out_control->energy_update_freq > 0 && data->step % out_control->energy_update_freq == 0 ) { - if (control->virial) { + if (control->virial && out_control->prs) { fprintf( out_control->prs, "%8d%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f%13.6f\n", data->step, From d6a12f6c3e02dabf8926dd788e2e1d256a1f86c9 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 11:22:22 -0400 Subject: [PATCH 0491/1242] roll back ineffective changes and add zeroing of allocated storage --- src/USER-REAXC/pair_reaxc.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/USER-REAXC/pair_reaxc.cpp b/src/USER-REAXC/pair_reaxc.cpp index cb8338da72..3f80f2101d 100644 --- a/src/USER-REAXC/pair_reaxc.cpp +++ b/src/USER-REAXC/pair_reaxc.cpp @@ -73,12 +73,13 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) one_coeff = 1; manybody_flag = 1; ghostneigh = 1; - no_virial_fdotr_compute = 1; system = (reax_system *) memory->smalloc(sizeof(reax_system),"reax:system"); + memset(system,0,sizeof(reax_system)); control = (control_params *) memory->smalloc(sizeof(control_params),"reax:control"); + memset(control,0,sizeof(control_params)); data = (simulation_data *) memory->smalloc(sizeof(simulation_data),"reax:data"); workspace = (storage *) @@ -88,6 +89,7 @@ PairReaxC::PairReaxC(LAMMPS *lmp) : Pair(lmp) memset(lists,0,LIST_N * sizeof(reax_list)); out_control = (output_controls *) memory->smalloc(sizeof(output_controls),"reax:out_control"); + memset(out_control,0,sizeof(output_controls)); mpi_data = (mpi_datatypes *) memory->smalloc(sizeof(mpi_datatypes),"reax:mpi"); @@ -512,7 +514,7 @@ void PairReaxC::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_either) control->virial = 1; + if (vflag_global) control->virial = 1; else control->virial = 0; system->n = atom->nlocal; // my atoms From 8683e1ebf83cb625d7e89ac23623d78d0cec4a44 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 11:24:59 -0400 Subject: [PATCH 0492/1242] revert ineffective changes --- src/USER-OMP/pair_reaxc_omp.cpp | 3 +-- src/USER-OMP/reaxc_nonbonded_omp.cpp | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index 90846b71f1..a98f7c89d9 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -91,7 +91,6 @@ PairReaxCOMP::PairReaxCOMP(LAMMPS *lmp) : PairReaxC(lmp), ThrOMP(lmp, THR_PAIR) { if (lmp->citeme) lmp->citeme->add(cite_pair_reax_c_omp); - no_virial_fdotr_compute = 1; suffix_flag |= Suffix::OMP; system->pair_ptr = this; system->omp_active = 1; @@ -194,7 +193,7 @@ void PairReaxCOMP::compute(int eflag, int vflag) evdwl = ecoul = 0.0; ev_init(eflag,vflag); - if (vflag_either) control->virial = 1; + if (vflag_global) control->virial = 1; else control->virial = 0; system->n = atom->nlocal; // my atoms diff --git a/src/USER-OMP/reaxc_nonbonded_omp.cpp b/src/USER-OMP/reaxc_nonbonded_omp.cpp index 41b1474791..a93cd54931 100644 --- a/src/USER-OMP/reaxc_nonbonded_omp.cpp +++ b/src/USER-OMP/reaxc_nonbonded_omp.cpp @@ -213,9 +213,9 @@ void vdW_Coulomb_Energy_OMP( reax_system *system, control_params *control, rvec_ScaledSum( delij, 1., system->my_atoms[i].x, -1., system->my_atoms[j].x ); f_tmp = -(CEvd + CEclmb); - pair_reax_ptr->ev_tally_thr_proxy( system->pair_ptr, i, j, natoms, - 1, pe_vdw, e_ele, f_tmp, - delij[0], delij[1], delij[2], thr); + pair_reax_ptr->ev_tally_thr_proxy(system->pair_ptr, i, j, natoms, + 1, pe_vdw, e_ele, f_tmp, + delij[0], delij[1], delij[2], thr); } if (control->virial == 0) { From cb27d03c79c22bc2316e838098d8cb0358e61b59 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 11:27:04 -0400 Subject: [PATCH 0493/1242] stop with error message when computing per-atom stress for reax/c/omp --- src/USER-OMP/pair_reaxc_omp.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/USER-OMP/pair_reaxc_omp.cpp b/src/USER-OMP/pair_reaxc_omp.cpp index a98f7c89d9..927a63a90f 100644 --- a/src/USER-OMP/pair_reaxc_omp.cpp +++ b/src/USER-OMP/pair_reaxc_omp.cpp @@ -196,6 +196,10 @@ void PairReaxCOMP::compute(int eflag, int vflag) if (vflag_global) control->virial = 1; else control->virial = 0; + if (vflag_atom) + error->all(FLERR,"Pair style reax/c/omp does not support " + "computing per-atom stress"); + system->n = atom->nlocal; // my atoms system->N = atom->nlocal + atom->nghost; // mine + ghosts system->bigN = static_cast (atom->natoms); // all atoms in the system From 6643a4ec9274c2c661df414a8bf41c04ff07b1e1 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sat, 6 Apr 2019 14:20:21 -0500 Subject: [PATCH 0494/1242] Fixup FindKIM-API.cmake and clean up some v2 remnants --- cmake/Modules/FindKIM-API.cmake | 6 +++--- src/KIM/kim_query.cpp | 2 +- src/KIM/kim_query.h | 2 +- src/KIM/pair_kim.cpp | 4 ++-- src/KIM/pair_kim.h | 6 +++--- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cmake/Modules/FindKIM-API.cmake b/cmake/Modules/FindKIM-API.cmake index d9397b9aba..beef92db59 100644 --- a/cmake/Modules/FindKIM-API.cmake +++ b/cmake/Modules/FindKIM-API.cmake @@ -41,9 +41,9 @@ include(FindPackageHandleStandardArgs) pkg_check_modules(KIM-API REQUIRED libkim-api>=2.0) -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) +pkg_get_variable(KIM-API-CMAKE_C_COMPILER libkim-api CMAKE_C_COMPILER) +pkg_get_variable(KIM-API-CMAKE_CXX_COMPILER libkim-api CMAKE_CXX_COMPILER) +pkg_get_variable(KIM-API_CMAKE_Fortran_COMPILER libkim-api CMAKE_Fortran_COMPILER) # handle the QUIETLY and REQUIRED arguments and set KIM-API_FOUND to TRUE # if all listed variables are TRUE diff --git a/src/KIM/kim_query.cpp b/src/KIM/kim_query.cpp index 7480703ce8..fedc976110 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-2.0.0 (and newer) package + Designed for use with the kim-api-2.0.2 (and newer) package ------------------------------------------------------------------------- */ #include diff --git a/src/KIM/kim_query.h b/src/KIM/kim_query.h index ed5a7c88f3..3644e4519b 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-2.0.0 (and newer) package + Designed for use with the kim-api-2.0.2 (and newer) package ------------------------------------------------------------------------- */ #ifdef COMMAND_CLASS diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index ea5f24a67e..157a782f20 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -50,7 +50,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v2-2.0.0 (and newer) package + Designed for use with the kim-api-2.0.2 (and newer) package ------------------------------------------------------------------------- */ #include @@ -313,7 +313,7 @@ void PairKIM::settings(int narg, char **arg) (0 == strcmp("LAMMPSvirial", arg[0])))) { error->all(FLERR,"'KIMvirial' or 'LAMMPSvirial' not supported with " - "kim-api-v2."); + "kim-api."); } else error->all(FLERR,"Illegal pair_style command"); diff --git a/src/KIM/pair_kim.h b/src/KIM/pair_kim.h index a6f882347d..27bab6c687 100644 --- a/src/KIM/pair_kim.h +++ b/src/KIM/pair_kim.h @@ -50,7 +50,7 @@ ------------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- - Designed for use with the kim-api-v2-2.0.0 (and newer) package + Designed for use with the kim-api-2.0.2 (and newer) package ------------------------------------------------------------------------- */ #ifdef PAIR_CLASS @@ -182,9 +182,9 @@ E: KIM Compute returned error The KIM model was unable, for some reason, to complete the computation. -E: 'KIMvirial' or 'LAMMPSvirial' not supported with kim-api-v2. +E: 'KIMvirial' or 'LAMMPSvirial' not supported with kim-api. -"KIMvirial or "LAMMPSvirial" found on the pair_style line. These keys are not supported kim-api-v2. (The virial computation is always performed by LAMMPS.) Please remove these keys, make sure the KIM model you are using supports kim-api-v2, and rerun. +"KIMvirial or "LAMMPSvirial" found on the pair_style line. These keys are not supported kim-api. (The virial computation is always performed by LAMMPS.) Please remove these keys, make sure the KIM model you are using supports kim-api, and rerun. E: Illegal pair_style command From 47b74379762a42f63c3fd679bd0a13b873f60422 Mon Sep 17 00:00:00 2001 From: "Ryan S. Elliott" Date: Sat, 6 Apr 2019 15:08:15 -0500 Subject: [PATCH 0495/1242] Have FindKIM-API.cmake work in QUIET mode --- cmake/Modules/FindKIM-API.cmake | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/cmake/Modules/FindKIM-API.cmake b/cmake/Modules/FindKIM-API.cmake index beef92db59..5108b0f98c 100644 --- a/cmake/Modules/FindKIM-API.cmake +++ b/cmake/Modules/FindKIM-API.cmake @@ -36,14 +36,23 @@ # KIM-API-CMAKE_CXX_COMPILER # KIM-API-CMAKE_Fortran_COMPILER # -find_package(PkgConfig REQUIRED) + +if(KIM-API_FIND_QUIETLY) + set(REQ_OR_QUI "QUIET") +else() + set(REQ_OR_QUI "REQUIRED") +endif() + +find_package(PkgConfig ${REQ_OR_QUI}) include(FindPackageHandleStandardArgs) -pkg_check_modules(KIM-API REQUIRED libkim-api>=2.0) +pkg_check_modules(KIM-API ${REQ_OR_QUI} libkim-api>=2.0) -pkg_get_variable(KIM-API-CMAKE_C_COMPILER libkim-api CMAKE_C_COMPILER) -pkg_get_variable(KIM-API-CMAKE_CXX_COMPILER libkim-api CMAKE_CXX_COMPILER) -pkg_get_variable(KIM-API_CMAKE_Fortran_COMPILER libkim-api CMAKE_Fortran_COMPILER) +if(KIM-API_FOUND) + pkg_get_variable(KIM-API-CMAKE_C_COMPILER libkim-api CMAKE_C_COMPILER) + pkg_get_variable(KIM-API-CMAKE_CXX_COMPILER libkim-api CMAKE_CXX_COMPILER) + pkg_get_variable(KIM-API_CMAKE_Fortran_COMPILER libkim-api CMAKE_Fortran_COMPILER) +endif() # handle the QUIETLY and REQUIRED arguments and set KIM-API_FOUND to TRUE # if all listed variables are TRUE From 3070a110413d88e2356a2db168924ba5272d6b3a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 16:23:10 -0400 Subject: [PATCH 0496/1242] guard against extracting too many elements from the MEAM library into the statically sized arrays this will abort with a meaningful error message and people can fix up their LAMMPS binary as needed. --- src/USER-MEAMC/pair_meamc.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/USER-MEAMC/pair_meamc.cpp b/src/USER-MEAMC/pair_meamc.cpp index 3a934694bf..a70fb77aae 100644 --- a/src/USER-MEAMC/pair_meamc.cpp +++ b/src/USER-MEAMC/pair_meamc.cpp @@ -226,6 +226,9 @@ void PairMEAMC::coeff(int narg, char **arg) } nelements = narg - 4 - atom->ntypes; if (nelements < 1) error->all(FLERR,"Incorrect args for pair coefficients"); + if (nelements > maxelt) + error->all(FLERR,"Too many elements extracted from MEAM library. " + "Increase 'maxelt' in meam.h and recompile."); elements = new char*[nelements]; mass = new double[nelements]; From 59a4d422319fbf1f158395b4b56dc205f7428035 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 16:47:48 -0400 Subject: [PATCH 0497/1242] make default CMake setting for DOWNLOAD_KIM depend on whether the KIM API is found or not --- cmake/CMakeLists.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 2fe3ebe184..4c83269563 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -690,7 +690,12 @@ if(PKG_KIM) list(APPEND LAMMPS_LINK_LIBS ${CURL_LIBRARIES}) add_definitions(-DLMP_KIM_CURL) endif() - option(DOWNLOAD_KIM "Download KIM-API from OpenKIM instead of using an already installed one" OFF) + find_package(KIM-API QUIET) + if(KIM-API_FOUND) + option(DOWNLOAD_KIM "Download KIM-API from OpenKIM instead of using an already installed one" OFF) + else() + option(DOWNLOAD_KIM "Download KIM-API from OpenKIM instead of using an already installed one" ON) + endif() if(DOWNLOAD_KIM) message(STATUS "KIM-API download requested - we will build our own") enable_language(C) @@ -711,10 +716,7 @@ if(PKG_KIM) 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) - 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() + find_package(KIM-API REQUIRED) endif() list(APPEND LAMMPS_LINK_LIBS "${KIM-API_LDFLAGS}") include_directories(${KIM-API_INCLUDE_DIRS}) From 86f4080b71bab8d70b382a893b113a22140c3105 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 16:48:29 -0400 Subject: [PATCH 0498/1242] some dead code removal in pair style kim. --- src/KIM/pair_kim.cpp | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index 157a782f20..eee9c1c4e9 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -189,8 +189,6 @@ void PairKIM::set_contributing() void PairKIM::compute(int eflag , int vflag) { - int kimerror; - ev_init(eflag,vflag); // grow kim_particleSpecies and kim_particleContributing array if necessary @@ -238,7 +236,7 @@ void PairKIM::compute(int eflag , int vflag) lmps_local_tot_num_atoms = (int) nall; // compute via KIM model - kimerror = KIM_Model_Compute(pkim, pargs); + int kimerror = KIM_Model_Compute(pkim, pargs); if (kimerror) error->all(FLERR,"KIM Compute returned error"); // compute virial before reverse comm! @@ -434,10 +432,9 @@ void PairKIM::coeff(int narg, char **arg) kim_particle_codes = new int[lmps_num_unique_elements]; kim_particle_codes_ok = true; for(int i = 0; i < lmps_num_unique_elements; i++){ - int kimerror; int supported; int code; - kimerror = KIM_Model_GetSpeciesSupportAndCode( + KIM_Model_GetSpeciesSupportAndCode( pkim, KIM_SpeciesName_FromString(lmps_unique_elements[i]), &supported, @@ -468,8 +465,6 @@ void PairKIM::init_style() if (domain->dimension != 3) error->all(FLERR,"PairKIM only works with 3D problems"); - int kimerror; - // setup lmps_stripped_neigh_list for neighbors of one atom, if needed if (lmps_using_molecular) { memory->destroy(lmps_stripped_neigh_list); @@ -720,9 +715,8 @@ int PairKIM::get_neigh(void const * const dataObject, *numberOfNeighbors = 0; NeighList * neiobj = Model->neighborLists[neighborListIndex]; - int nAtoms = Model->lmps_local_tot_num_atoms; - int j, jj, inum, *ilist, *numneigh, **firstneigh; + int inum, *ilist, *numneigh, **firstneigh; inum = neiobj->inum; //# of I atoms neighbors are stored for ilist = neiobj->ilist; //local indices of I atoms numneigh = neiobj->numneigh; // # of J neighbors for each I atom @@ -750,8 +744,6 @@ int PairKIM::get_neigh(void const * const dataObject, void PairKIM::kim_free() { - int kimerror; - if (kim_init_ok) { int kimerror = KIM_Model_ComputeArgumentsDestroy(pkim, &pargs); From f98aed419c2d3a61e8f8fa8eb91c8ecf73683bd4 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 17:03:24 -0400 Subject: [PATCH 0499/1242] document the 'maxelt' define in pair style meam/c and how to change it --- doc/src/pair_meamc.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/src/pair_meamc.txt b/doc/src/pair_meamc.txt index b57339b180..80f69b1a46 100644 --- a/doc/src/pair_meamc.txt +++ b/doc/src/pair_meamc.txt @@ -357,6 +357,13 @@ The {meam/c} style is provided in the USER-MEAMC package. It is only enabled if LAMMPS was built with that package. See the "Build package"_Build_package.html doc page for more info. +The maximum number of elements, that can be read from the MEAM +library file, is determined at compile time. The default is 5. +If you need support for more elements, you have to change the +define for the constant 'maxelt' at the beginning of the file +src/USER-MEAMC/meam.h and update/recompile LAMMPS. There is no +limit on the number of atoms types. + [Related commands:] "pair_coeff"_pair_coeff.html, "pair_style eam"_pair_eam.html, From 8c02ce730205c718f526a3aab2697f478b42e2e3 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 17:03:40 -0400 Subject: [PATCH 0500/1242] silence some compiler warnings --- src/VORONOI/compute_voronoi_atom.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/VORONOI/compute_voronoi_atom.cpp b/src/VORONOI/compute_voronoi_atom.cpp index f884530fd9..860126fa77 100644 --- a/src/VORONOI/compute_voronoi_atom.cpp +++ b/src/VORONOI/compute_voronoi_atom.cpp @@ -642,7 +642,7 @@ void ComputeVoronoi::compute_local() /* ---------------------------------------------------------------------- */ int ComputeVoronoi::pack_forward_comm(int n, int *list, double *buf, - int pbc_flag, int *pbc) + int /* pbc_flag */, int * /* pbc */) { int i,m=0; for (i = 0; i < n; ++i) buf[m++] = rfield[list[i]]; From 72b69783decf82415b4119152228c113c8f7cdca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 17:17:17 -0400 Subject: [PATCH 0501/1242] add download-default-if-not-found logic to voro++ library for VORONOI package --- cmake/CMakeLists.txt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 4c83269563..91b5fe5377 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -448,7 +448,13 @@ endif() if(PKG_VORONOI) - option(DOWNLOAD_VORO "Download and compile the Voro++ library instead of using an already installed one" OFF) + find_package(VORO QUIET) + if(VORO_FOUND) + set(DOWNLOAD_VORO_DEFAULT OFF) + else() + set(DOWNLOAD_VORO_DEFAULT ON) + endif() + option(DOWNLOAD_VORO "Download and compile the Voro++ library instead of using an already installed one" ${DOWNLOAD_VORO_DEFAULT}) if(DOWNLOAD_VORO) message(STATUS "Voro++ download requested - we will build our own") include(ExternalProject) @@ -692,10 +698,11 @@ if(PKG_KIM) endif() find_package(KIM-API QUIET) if(KIM-API_FOUND) - option(DOWNLOAD_KIM "Download KIM-API from OpenKIM instead of using an already installed one" OFF) + set(DOWNLOAD_KIM_DEFAULT OFF) else() - option(DOWNLOAD_KIM "Download KIM-API from OpenKIM instead of using an already installed one" ON) + set(DOWNLOAD_KIM_DEFAULT ON) endif() + option(DOWNLOAD_KIM "Download KIM-API from OpenKIM instead of using an already installed one" ${DOWNLOAD_KIM_DEFAULT}) if(DOWNLOAD_KIM) message(STATUS "KIM-API download requested - we will build our own") enable_language(C) From cb398bd0267e1d8c205551c0767c0147d8ba9e2d Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 17:23:37 -0400 Subject: [PATCH 0502/1242] silence some more compiler warnings --- src/KIM/pair_kim.cpp | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/KIM/pair_kim.cpp b/src/KIM/pair_kim.cpp index eee9c1c4e9..a1c13ae81f 100644 --- a/src/KIM/pair_kim.cpp +++ b/src/KIM/pair_kim.cpp @@ -671,9 +671,9 @@ void PairKIM::unpack_reverse_comm(int n, int *list, double *buf) va[j*6+4]+=buf[m++]; va[j*6+5]+=buf[m++]; } + } else { + ; // do nothing } - else - ;// do nothing return; } @@ -716,9 +716,7 @@ int PairKIM::get_neigh(void const * const dataObject, NeighList * neiobj = Model->neighborLists[neighborListIndex]; - int inum, *ilist, *numneigh, **firstneigh; - inum = neiobj->inum; //# of I atoms neighbors are stored for - ilist = neiobj->ilist; //local indices of I atoms + int *numneigh, **firstneigh; numneigh = neiobj->numneigh; // # of J neighbors for each I atom firstneigh = neiobj->firstneigh; // ptr to 1st J int value of each I atom @@ -1035,10 +1033,10 @@ void PairKIM::set_kim_model_has_flags() for (int i = 0; i < numberOfComputeArgumentNames; ++i) { KIM_ComputeArgumentName computeArgumentName; - int kimerror = KIM_COMPUTE_ARGUMENT_NAME_GetComputeArgumentName( + KIM_COMPUTE_ARGUMENT_NAME_GetComputeArgumentName( i, &computeArgumentName); KIM_SupportStatus supportStatus; - kimerror = KIM_ComputeArguments_GetArgumentSupportStatus( + KIM_ComputeArguments_GetArgumentSupportStatus( pargs, computeArgumentName, &supportStatus); if (KIM_ComputeArgumentName_Equal(computeArgumentName, @@ -1097,10 +1095,10 @@ void PairKIM::set_kim_model_has_flags() for (int i = 0; i < numberOfComputeCallbackNames; ++i) { KIM_ComputeCallbackName computeCallbackName; - int kimerror = KIM_COMPUTE_CALLBACK_NAME_GetComputeCallbackName( + KIM_COMPUTE_CALLBACK_NAME_GetComputeCallbackName( i, &computeCallbackName); KIM_SupportStatus supportStatus; - kimerror = KIM_ComputeArguments_GetCallbackSupportStatus( + KIM_ComputeArguments_GetCallbackSupportStatus( pargs, computeCallbackName, &supportStatus); if (KIM_SupportStatus_Equal(supportStatus, KIM_SUPPORT_STATUS_required)) From 494e76da7d3db4b5ecaae5dd36419c9f9f0db46c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 17:29:04 -0400 Subject: [PATCH 0503/1242] add false positive --- doc/utils/sphinx-config/false_positives.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index 0596179daa..c6d301f2fe 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -1543,6 +1543,7 @@ Mattox Mattson maxangle maxbond +maxelt maxeval maxfiles Maxfoo From b25657c67bbfab5ad35c36c42672ad8f7ed70940 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 17:49:56 -0400 Subject: [PATCH 0504/1242] trigger download by default if not found for LATTE package/library --- cmake/CMakeLists.txt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 91b5fe5377..47a37f1db5 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -448,7 +448,7 @@ endif() if(PKG_VORONOI) - find_package(VORO QUIET) + find_package(VORO) if(VORO_FOUND) set(DOWNLOAD_VORO_DEFAULT OFF) else() @@ -487,7 +487,13 @@ if(PKG_VORONOI) endif() if(PKG_LATTE) - option(DOWNLOAD_LATTE "Download the LATTE library instead of using an already installed one" OFF) + find_package(LATTE) + if(LATTE_FOUND) + set(DOWNLOAD_LATTE_DEFAULT OFF) + else() + set(DOWNLOAD_LATTE_DEFAULT ON) + endif() + option(DOWNLOAD_LATTE "Download the LATTE library instead of using an already installed one" ${DOWNLOAD_LATTE_DEFAULT}) if(DOWNLOAD_LATTE) if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR message(FATAL_ERROR "For downlading LATTE you need at least cmake-3.7") From 3b43fc3ea7de5d2b245dc2a7baa3ab71d3b57b35 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 20:41:00 -0400 Subject: [PATCH 0505/1242] install msi2lmp force field files and set environment variable, so they can be found automatically --- cmake/CMakeLists.txt | 5 ++++- cmake/etc/profile.d/lammps.csh.in | 4 +++- cmake/etc/profile.d/lammps.sh.in | 7 +++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 47a37f1db5..d17e9dab19 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1538,11 +1538,14 @@ if(BUILD_DOC) endif() ############################################################################### -# Install potential files in data directory +# Install potential and force field files in data directory ############################################################################### set(LAMMPS_POTENTIALS_DIR ${CMAKE_INSTALL_FULL_DATADIR}/lammps/potentials) install(DIRECTORY ${LAMMPS_SOURCE_DIR}/../potentials/ DESTINATION ${LAMMPS_POTENTIALS_DIR}) +set(LAMMPS_FRC_FILES_DIR ${CMAKE_INSTALL_FULL_DATADIR}/lammps/frc_files) +install(DIRECTORY ${LAMMPS_SOURCE_DIR}/../tools/msi2lmp/frc_files/ DESTINATION ${LAMMPS_FRC_FILES_DIR}) + configure_file(etc/profile.d/lammps.sh.in ${CMAKE_BINARY_DIR}/etc/profile.d/lammps.sh @ONLY) configure_file(etc/profile.d/lammps.csh.in ${CMAKE_BINARY_DIR}/etc/profile.d/lammps.csh @ONLY) install( diff --git a/cmake/etc/profile.d/lammps.csh.in b/cmake/etc/profile.d/lammps.csh.in index def49bf75c..42f222d67c 100644 --- a/cmake/etc/profile.d/lammps.csh.in +++ b/cmake/etc/profile.d/lammps.csh.in @@ -1,2 +1,4 @@ -# set environment for LAMMPS executables to find potential files +# set environment for LAMMPS and msi2lmp executables +# to find potential and force field files if ( "$?LAMMPS_POTENTIALS" == 0 ) setenv LAMMPS_POTENTIALS @LAMMPS_POTENTIALS_DIR@ +if ( "$?MSI2LMP_LIBRARY" == 0 ) setenv MSI2LMP_LIBRARY @LAMMPS_FRC_FILES_DIR@ diff --git a/cmake/etc/profile.d/lammps.sh.in b/cmake/etc/profile.d/lammps.sh.in index acd75fa0cf..c1967cb5b2 100644 --- a/cmake/etc/profile.d/lammps.sh.in +++ b/cmake/etc/profile.d/lammps.sh.in @@ -1,2 +1,5 @@ -# set environment for LAMMPS executables to find potential files -export LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS-@LAMMPS_POTENTIALS_DIR@} +# set environment for LAMMPS and msi2lmp executables +# to find potential and force field files +LAMMPS_POTENTIALS=${LAMMPS_POTENTIALS-@LAMMPS_POTENTIALS_DIR@} +MSI2LMP_LIBRARY=${MSI2LMP_LIBRARY-@LAMMPS_FRC_FILES_DIR@} +export LAMMPS_POTENTIALS MSI2LMP_LIBRARY From a6c9a782a4fd5b39373f649d7287829e90f90d25 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 23:41:48 -0400 Subject: [PATCH 0506/1242] add manpage for msi2lmp --- cmake/CMakeLists.txt | 1 + doc/msi2lmp.1 | 111 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 doc/msi2lmp.1 diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index d17e9dab19..722c0992ba 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1472,6 +1472,7 @@ if(BUILD_EXE) add_executable(msi2lmp ${MSI2LMP_SOURCES}) target_link_libraries(msi2lmp m) install(TARGETS msi2lmp DESTINATION ${CMAKE_INSTALL_BINDIR}) + install(FILES ${LAMMPS_DOC_DIR}/msi2lmp.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1) endif() diff --git a/doc/msi2lmp.1 b/doc/msi2lmp.1 new file mode 100644 index 0000000000..08a442e1de --- /dev/null +++ b/doc/msi2lmp.1 @@ -0,0 +1,111 @@ +.TH MSI2LMP "v3.9.9" "2018-11-05" +.SH NAME +.B MSI2LMP +\- Converter for Materials Studio files to LAMMPS + +.SH SYNOPSIS +.B msi2lmp + [-class ] [-frc ] [-print #] [-ignore] [-nocenter] [-oldstyle] [-shift ] + +.SH DESCRIPTION +.PP +.B MSI2LMP +is a tool bundled with LAMMPS to aide in the conversion of simulation +inputs from Biovia's Materials Studio software for use with LAMMPS. +It is a standalone program that generates a LAMMPS data file based on +the information in an MS .car file (atom coordinates), an .mdf file +(molecular topology and atom types) and an .frc (forcefield parameters) +file. The .car and .mdf files are specific to a molecular system while +the .frc file is specific to a forcefield (variant). The only coherency +needed between .frc and .car/.mdf files are the atom types. +.PP + +.SH OPTIONS +.TP +\fB\\fR +This has to be the first argument and is a +.B mandatory +argument. It defines the root of the file names; i.e. for a +.B +of benzene, you have to provide the files 'benzene.car' and 'benzene.mdf' +in the current working directory. +.B msi2lmp +will then read and process those files according to its remaining settings. +All other settins are optional and have defaults as listed. +.TP +\fB\-c \fR, \fB\-class \fR +The \-c or \-class option selects the force field class, i.e which pair +styles and bond styles and so on are required in the LAMMPS input file. +Class I or class 1 uses similar combination of functional forms as Amber +and Charmm force field and support the force fields +.B cvff +and +.B clayff. +Class II or class 2 corresponds to the more complex force fields +.B COMPASS +and +.B pcff. +Class O or class 0 finally is an experimental and incomplete extension +and supports generating output for +.B OPLS-AA +.TP +\fB\-f \fR, \fB\-frc \fR +The \-c or \-frc option allows the selection of the force field parameter +file +.B.frc. +Valid names for with this distribution are: cvff, clayff, cvff_aug, +pcff, compass_published, cff91, and oplsaa. If the argument is a pathname, +i.e. it starts with a '.' or a '/', then this absolute path is used to read +the force field, otherwise +.B msi2lmp +will look in the folder pointed to by the environment variable +$MSI2LMP_LIBRARY. If the variable is not set, then it will look in the current +directory. The extension '.frc' is appended, if missing. +Default is to look for the cvff.frc force field file. +.TP +\fB\-p \fR, \fB\-print \fR, +Selects the amount of information messages about the progress of the +conversion printed to the screen. +.B +can be a number from 0 (silent except for errors) to 3 (very detailed). +.TP +\fB\-i\fR, \fB\-ignore\fR, +Ignore errors about missing parameters and use 0.0 for the respective +force constants making these no-ops. Is correct to be used for a few +molecules and settings, but often an indication, that either the atom +type assignment have errors, or the force field file is missing entries. +.TP +\fB\-n\fR, \fB\-nocenter\fR, +Do not center the box around the (geometrical) center of the atoms, +but around the origin. Default is to recenter. +.TP +\fB\-o\fR, \fB\-oldstyle\fR, +Write out a data file without style hint comments to be compatible +with old LAMMPS versions. Default is to write out those comments. +.TP +\fB-s \fR, \fB-shift \fR, +Shift the entire system (box and coordinates) by a vector +(default: 0.0 0.0 0.0). +.TP + +.SH EXAMPLES + +msi2lmp benzene -c 2 -p 1 -f ../frc_files/pcff.frc + +msi2lmp benzene-class1 -c I + +msi2lmp decane -c 0 -f oplsaa + + +.SH COPYRIGHT +© 2003--2019 Sandia Corporation + +This package is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This package 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. + From 1dd21e6e0cb388cfb90369fa0ee62342abbcbe1a Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 23:44:27 -0400 Subject: [PATCH 0507/1242] make downloaded LATTE library use the same BLAS/LAPACK as LAMMPS --- cmake/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 722c0992ba..45698d2214 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -504,7 +504,7 @@ if(PKG_LATTE) URL https://github.com/lanl/LATTE/archive/v1.2.1.tar.gz URL_MD5 85ac414fdada2d04619c8f936344df14 SOURCE_SUBDIR cmake - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= ${CMAKE_REQUEST_PIC} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX= ${CMAKE_REQUEST_PIC} -DBLAS_LIBRARIES=${BLAS_LIBRARIES} -DLAPACK_LIBRARIES=${LAPACK_LIBRARIES} ) ExternalProject_get_property(latte_build INSTALL_DIR) set(LATTE_LIBRARIES ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/liblatte.a) From b40c4d1641e2cf6ea76e468be84c4aa5e25870ca Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sat, 6 Apr 2019 23:45:01 -0400 Subject: [PATCH 0508/1242] update version number and some reformatting of the LAMMPS manpage --- doc/lammps.1 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/doc/lammps.1 b/doc/lammps.1 index d49650bfaa..bf5891541f 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -1,25 +1,25 @@ -.TH LAMMPS "2018-08-22" +.TH LAMMPS "11 April 2019" "2019-04-11" .SH NAME .B LAMMPS \- Molecular Dynamics Simulator. .SH SYNOPSIS -.B lmp +.B lmp -in in.file or -mpirun \-np 2 -.B lmp +mpirun \-np 2 +.B lmp -in in.file .SH DESCRIPTION -.B LAMMPS -LAMMPS is a classical molecular dynamics code, and an acronym for Large-scale -Atomic/Molecular Massively Parallel Simulator. LAMMPS has potentials for soft -materials (biomolecules, polymers) and solid-state materials (metals, -semiconductors) and coarse-grained or mesoscopic systems. It can be used to -model atoms or, more generically, as a parallel particle simulator at the +.B LAMMPS +is a classical molecular dynamics code, and an acronym for Large-scale +Atomic/Molecular Massively Parallel Simulator. LAMMPS has potentials for soft +materials (biomolecules, polymers) and solid-state materials (metals, +semiconductors) and coarse-grained or mesoscopic systems. It can be used to +model atoms or, more generically, as a parallel particle simulator at the atomic, meso, or continuum scale. See http://lammps.sandia.gov/ for documentation. @@ -28,8 +28,8 @@ See http://lammps.sandia.gov/ for documentation. See https://lammps.sandia.gov/doc/Run_options.html for details on command-line options. -.SH COPYRIGHT -© 2003--2018 Sandia Corporation +.SH COPYRIGHT +© 2003--2019 Sandia Corporation This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by From e57e4a730bff3e3213ba512dcb470d34293cbbbb Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Apr 2019 00:45:57 -0400 Subject: [PATCH 0509/1242] more packages with default-to-download-if-lib-not-found --- cmake/CMakeLists.txt | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 45698d2214..788989a68f 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -575,7 +575,16 @@ if(PKG_USER-PLUMED) validate_option(PLUMED_MODE PLUMED_MODE_VALUES) string(TOUPPER ${PLUMED_MODE} PLUMED_MODE) - option(DOWNLOAD_PLUMED "Download Plumed package instead of using an already installed one" OFF) + find_package(PkgConfig QUIET) + set(DOWNLOAD_PLUMED_DEFAULT ON) + if(PKG_CONFIG_FOUND) + pkg_check_modules(PLUMED QUIET plumed) + if(PLUMED_FOUND) + set(DOWNLOAD_PLUMED_DEFAULT OFF) + endif() + endif() + + option(DOWNLOAD_PLUMED "Download Plumed package instead of using an already installed one" ${DOWNLOAD_PLUMED_DEFAULT}) if(DOWNLOAD_PLUMED) if(BUILD_MPI) set(PLUMED_CONFIG_MPI "--enable-mpi") @@ -620,7 +629,7 @@ if(PKG_USER-PLUMED) set(PLUMED_INCLUDE_DIRS "${PLUMED_INSTALL_DIR}/include") else() find_package(PkgConfig REQUIRED) - pkg_check_modules(PLUMED plumed REQUIRED) + pkg_check_modules(PLUMED REQUIRED plumed) if(PLUMED_MODE STREQUAL "STATIC") add_definitions(-D__PLUMED_WRAPPER_CXX=1) include(${PLUMED_LIBDIR}/plumed/src/lib/Plumed.cmake.static) @@ -654,7 +663,13 @@ if(PKG_USER-NETCDF) endif() if(PKG_USER-SMD) - option(DOWNLOAD_EIGEN3 "Download Eigen3 instead of using an already installed one)" OFF) + find_package(Eigen3 NO_MODULE) + if(EIGEN3_FOUND) + set(DOWNLOAD_EIGEN3_DEFAULT OFF) + else() + set(DOWNLOAD_EIGEN3_DEFAULT ON) + endif() + option(DOWNLOAD_EIGEN3 "Download Eigen3 instead of using an already installed one)" ${DOWNLOAD_EIGEN3_DEFAULT}) if(DOWNLOAD_EIGEN3) message(STATUS "Eigen3 download requested - we will build our own") include(ExternalProject) @@ -767,7 +782,13 @@ endif() if(PKG_MSCG) find_package(GSL REQUIRED) - option(DOWNLOAD_MSCG "Download MSCG library instead of using an already installed one)" OFF) + find_package(MSCG QUIET) + if(MSGC_FOUND) + set(DOWNLOAD_MSCG_DEFAULT OFF) + else() + set(DOWNLOAD_MSCG_DEFAULT ON) + endif() + option(DOWNLOAD_MSCG "Download MSCG library instead of using an already installed one)" ${DOWNLOAD_MSCG_DEFAULT}) if(DOWNLOAD_MSCG) if (CMAKE_VERSION VERSION_LESS "3.7") # due to SOURCE_SUBDIR message(FATAL_ERROR "For downlading MSCG you need at least cmake-3.7") From 6f7b3643ef9c5e6a8440ad6b713cc2c851f1153c Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Apr 2019 00:46:43 -0400 Subject: [PATCH 0510/1242] document clang/clang++ preset with settings for MPI and OpenMP --- doc/src/Build_package.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/src/Build_package.txt b/doc/src/Build_package.txt index e37936e052..02d7e7b763 100644 --- a/doc/src/Build_package.txt +++ b/doc/src/Build_package.txt @@ -159,6 +159,8 @@ 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/clang.cmake \[OPTIONS\] ../cmake | + change settings to use the CLang compilers by default | cmake -C ../cmake/presets/mingw.cmake \[OPTIONS\] ../cmake | enable all packages compatible with MinGW compilers :tb(c=2,s=|,a=l) From 13cf357f665e6fc28e8c83bfe3b24d72abfed00b Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Apr 2019 00:47:10 -0400 Subject: [PATCH 0511/1242] document in README, that msi2lmp is now build alongside LAMMPS --- tools/msi2lmp/README | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/msi2lmp/README b/tools/msi2lmp/README index 9ac7af5607..bd658d897e 100644 --- a/tools/msi2lmp/README +++ b/tools/msi2lmp/README @@ -49,8 +49,12 @@ This program uses the .car and .mdf files from MSI/Biosyms's INSIGHT 1. Building msi2lmp - Use the Makefile in the src directory. It is - currently set up for gcc. You will have to modify + If you are using CMake to compile LAMMPS, the building + (and installation) of msi2lmp is included in the normal + build process. + + Otherwise you can use the Makefile in the src directory. + It is currently set up for gcc. You will have to modify it to use a different compiler. 2. Testing the program From e57c4c60bd8c27fa18259c6a777bb55f19e49775 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Apr 2019 05:59:28 -0400 Subject: [PATCH 0512/1242] fix spelling issue --- doc/src/Build_package.txt | 2 +- doc/utils/sphinx-config/false_positives.txt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/src/Build_package.txt b/doc/src/Build_package.txt index 02d7e7b763..401f53f638 100644 --- a/doc/src/Build_package.txt +++ b/doc/src/Build_package.txt @@ -160,7 +160,7 @@ cmake -C ../cmake/presets/most.cmake \[OPTIONS\] ../cmake | cmake -C ../cmake/presets/nolib.cmake \[OPTIONS\] ../cmake | disable packages that do require extra libraries or tools | cmake -C ../cmake/presets/clang.cmake \[OPTIONS\] ../cmake | - change settings to use the CLang compilers by default | + change settings to use the Clang compilers by default | cmake -C ../cmake/presets/mingw.cmake \[OPTIONS\] ../cmake | enable all packages compatible with MinGW compilers :tb(c=2,s=|,a=l) diff --git a/doc/utils/sphinx-config/false_positives.txt b/doc/utils/sphinx-config/false_positives.txt index c6d301f2fe..a845673715 100644 --- a/doc/utils/sphinx-config/false_positives.txt +++ b/doc/utils/sphinx-config/false_positives.txt @@ -349,6 +349,7 @@ Cii Cij cis civ +Clang clearstore Cleary Clebsch From 8c4a497af4c21436436d89130482bb66ad7a9e4f Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Apr 2019 06:10:39 -0400 Subject: [PATCH 0513/1242] set default to automatically download scafacos lib if not found --- cmake/CMakeLists.txt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 788989a68f..69aff2d72d 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -520,7 +520,15 @@ endif() if(PKG_USER-SCAFACOS) find_package(GSL REQUIRED) - option(DOWNLOAD_SCAFACOS "Download ScaFaCoS library instead of using an already installed one" OFF) + find_package(PkgConfig QUIET) + set(DOWNLOAD_SCAFACOS_DEFAULT ON) + if(PKG_CONFIG_FOUND) + pkg_check_modules(SCAFACOS QUIET scafacos) + if(SCAFACOS_FOUND) + set(DOWNLOAD_SCAFACOS_DEFAULT OFF) + endif() + endif() + option(DOWNLOAD_SCAFACOS "Download ScaFaCoS library instead of using an already installed one" ${DOWNLOAD_SCAFACOS_DEFAULT}) if(DOWNLOAD_SCAFACOS) message(STATUS "ScaFaCoS download requested - we will build our own") include(ExternalProject) @@ -560,8 +568,8 @@ if(PKG_USER-SCAFACOS) list(APPEND LAMMPS_LINK_LIBS ${MPI_Fortran_LIBRARIES}) list(APPEND LAMMPS_LINK_LIBS ${MPI_C_LIBRARIES}) else() - FIND_PACKAGE(PkgConfig REQUIRED) - PKG_CHECK_MODULES(SCAFACOS scafacos REQUIRED) + find_package(PkgConfig REQUIRED) + pkg_check_modules(SCAFACOS REQUIRED scafacos) list(APPEND LAMMPS_LINK_LIBS ${SCAFACOS_LDFLAGS}) endif() include_directories(${SCAFACOS_INCLUDE_DIRS}) From 5c5b57be5a2f43d7bba4a027711c648e5eb0c300 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Apr 2019 10:34:25 -0400 Subject: [PATCH 0514/1242] minor tweaks --- doc/src/Run_options.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/src/Run_options.txt b/doc/src/Run_options.txt index 9c12b3ff24..1c3cb60c5f 100644 --- a/doc/src/Run_options.txt +++ b/doc/src/Run_options.txt @@ -79,7 +79,7 @@ stdin. Explicitly enable or disable KOKKOS support, as provided by the KOKKOS package. Even if LAMMPS is built with this package, as described in "Speed kokkos"_Speed_kokkos.html, this switch must be set to enable -running with the KOKKOS-enabled styles the package provides. If the +running with KOKKOS-enabled styles the package provides. If the switch is not set (the default), LAMMPS will operate as if the KOKKOS package were not installed; i.e. you can run standard LAMMPS or with the GPU or USER-OMP packages, for testing or benchmarking purposes. @@ -448,7 +448,7 @@ partition screen files file.N. [-suffix style args] :link(suffix) Use variants of various styles if they exist. The specified style can -be {cuda}, {gpu}, {intel}, {kk}, {omp}, {opt}, or {hybrid}. These +be {gpu}, {intel}, {kk}, {omp}, {opt}, or {hybrid}. These refer to optional packages that LAMMPS can be built with, as described in "Accelerate performance"_Speed.html. The "gpu" style corresponds to the GPU package, the "intel" style to the USER-INTEL package, the "kk" From cb559659f80aca207fb44e568fc8af41e1add2f0 Mon Sep 17 00:00:00 2001 From: Axel Kohlmeyer Date: Sun, 7 Apr 2019 10:35:00 -0400 Subject: [PATCH 0515/1242] write a full-fledged LAMMPS manpage. --- doc/lammps.1 | 241 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 230 insertions(+), 11 deletions(-) diff --git a/doc/lammps.1 b/doc/lammps.1 index bf5891541f..4686198fef 100644 --- a/doc/lammps.1 +++ b/doc/lammps.1 @@ -5,36 +5,255 @@ .SH SYNOPSIS .B lmp --in in.file +\-in [OPTIONS] ... or mpirun \-np 2 .B lmp --in in.file + [OPTIONS] ... + +or + +.B lmp +\-r2data file.restart file.data .SH DESCRIPTION .B LAMMPS -is a classical molecular dynamics code, and an acronym for Large-scale -Atomic/Molecular Massively Parallel Simulator. LAMMPS has potentials for soft -materials (biomolecules, polymers) and solid-state materials (metals, +is a classical molecular dynamics code, and an acronym for \fBL\fRarge-scale +\fBA\fRtomic/\fBM\fRolecular \fBM\fRassively \fBP\fRarallel \fBS\fRimulator. +.B LAMMPS +has potentials for soft +materials (bio-molecules, polymers) and solid-state materials (metals, semiconductors) and coarse-grained or mesoscopic systems. It can be used to model atoms or, more generically, as a parallel particle simulator at the atomic, meso, or continuum scale. -See http://lammps.sandia.gov/ for documentation. +See https://lammps.sandia.gov/ for more information and documentation. + +.SH EXECUTABLE NAME +The +.B LAMMPS +executable can have different names depending on how it was configured, +compiled and installed. It will be either +.B lmp +or +.B lmp_. +The suffix corresponds to the (machine specific) makefile +used to compile +.B LAMMPS +when using the conventional build process. When building +.B LAMMPS +using +.B CMake +this parameter can be chosen arbitrarily at configuration +time, but more common is to just use +.B lmp +without a suffix. In this manpage we will use +.B lmp +to represent any of those names. .SH OPTIONS -See https://lammps.sandia.gov/doc/Run_options.html for details on -command-line options. + +.TP +\fB\-h\fR or \fB\-help\fR +Print a brief help summary and a list of settings and options compiled +into this executable. It also explicitly lists all LAMMPS styles +(atom_style, fix, compute, pair_style, bond_style, etc) available in +the specific executable. This can tell you if the command you want to +use was included via the appropriate package at compile time. +LAMMPS will print the info and immediately exit if this switch is used. +.TP +\fB\-e\fR or \fB\-echo\fR +Set the style of command echoing. The style can be +.B none +or +.B screen +or +.B log +or +.B both. +Depending on the style, each command read from the input script will +be echoed to the screen and/or logfile. This can be useful to figure +out which line of your script is causing an input error. +The default value is +.B log. +.TP +\fB\-i \fR or \fB\-in \fR +Specify a file to use as an input script. If it is not specified, +LAMMPS reads its script from standard input. This is a required +switch when running LAMMPS in multi-partition mode. +.TP +\fB\-k on/off [keyword value]\fR or \fB\-kokkos on/off [keyword value]\fR +Enable or disable general KOKKOS support, as provided by the KOKKOS +package. Even if LAMMPS is built with this package, this switch must +be set to \fBon\fR to enable running with KOKKOS-enabled styles. More +details on this switch and its optional keyword value pairs are discussed +at: https://lammps.sandia.gov/doc/Run_options.html +.TP +\fB\-l \fR or \fB\-log \fR +Specify a log file for LAMMPS to write status information to. +The default value is "log.lammps". If the file name "none" is used, +\fBLAMMPS\fR will not write a log file. In multi-partition mode only +some high-level all-partition information is written to the "" +file, the remainder is written in a per-partition file ".N" +with "N" being the respective partition number, unless overridden +by the \-plog flag (see below). +.TP +\fB\-m \fR or \fB\-mpicolor \fR +If used, this must be the first command-line argument after the +.B LAMMPS +executable name. It is only used when +.B LAMMPS +is launched by an mpirun command which also launches one or more +other executable(s) at the same time. +.B LAMMPS +and the other executable(s) perform an MPI_Comm_split(), each with +their own different colors, to split the MPI_COMM_WORLD communicator +for each executable to the subset of processors they are supposed to +be actually running on. Currently, this is only used in +.B LAMMPS +to perform client/server messaging with another application. +.B LAMMPS +can act as either a client or server (or both). +.TP +\fB\-nc\fR or \fB\-nocite\fR +Disable writing the "log.cite" file which is normally written to +list references for specific cite-able features used during a +.B LAMMPS +run. +.TP +\fB\-pk

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